nlp---Nltk 常用方法

2024-06-13 20:32
文章标签 方法 常用 nlp nltk

本文主要是介绍nlp---Nltk 常用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍。

文本处理

词频提取

把切分好的词表进行词频排序(按照出现次数排序),

1
2
3
all_words  =  nltk.FreqDist(w.lower()  for  in  nltk.word_tokenize( "I'm foolish foolish man" ))
print (all_words.keys())
all_words.plot()

dict_keys(["'m", 'man', 'i', 'foolish'])

只考虑最高频率的两个词,并且绘制累积图,

1
all_words.plot( 2 , cumulative = True )

英文词干提取器

1
2
3
import  nltk
porter  =  nltk.PorterStemmer()
porter.stem( 'lying' )

'lie'

英文分词

1
2
text  =  nltk.word_tokenize( "And now for something completely different" )
print (text)

['And', 'now', 'for', 'something', 'completely', 'different']

分词&词形还原&词根还原使用概览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import  nltk
sent  =  "I'm super lying man"
'''
分词
'''
print (nltk.word_tokenize(sent))
print (nltk.tokenize.word_tokenize(sent))
'''
词根还原
'''
porter  =  nltk.PorterStemmer()
print ([porter.stem(x)  for  in  nltk.word_tokenize(sent)])
'''
词形还原(lemmatizer),即把一个任何形式的英语单词还原到一般形式,与词根还原不同(stemmer),
后者是抽取一个单词的词根。
'''
porter2  =  nltk.stem.WordNetLemmatizer()
print ([porter2.lemmatize(x)  for  in  nltk.word_tokenize(sent)])

『TensorFlow』测试项目_对评论分类

词性标注

1
2
3
print (nltk.pos_tag(text))
print (nltk.pos_tag([ 'i' , 'love' , 'you' ]))
print ( nltk.pos_tag([ 'love' , 'and' , 'hate' ]))

[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
[('i', 'NN'), ('love', 'VBP'), ('you', 'PRP')]
[('love', 'NN'), ('and', 'CC'), ('hate', 'NN')]

厉害的地方在这里:第二局里面的love是动词,第三句里面的love是名词。

  • 词性标注语料制作

1
2
tagged_token  =  nltk.tag.str2tuple( 'fly/NN' )
print (tagged_token)

('fly', 'NN')

中文的也行,

1
2
sent  =  '我/NN 是/IN 一个/AT 大/JJ 傻×/NN'
[nltk.tag.str2tuple(t)  for  in  sent.split()]  # 中文语料词性标注(&分词)

[('我', 'NN'), ('是', 'IN'), ('一个', 'AT'), ('大', 'JJ'), ('傻×', 'NN')]

  • 词性标注器

默认标注器:

不管什么词,都标注为频率最高的一种词性。比如经过分析,所有中文语料里的词是名次的概率是13%最大,那么我们的默认标注器就全部标注为名次。这种标注器一般作为其他标注器处理之后的最后一道门,即:不知道是什么词?那么他是名词。

1
2
3
4
5
6
7
8
9
raw  =  '我 累 嗯个 e去?'
tokens  =  nltk.word_tokenize(raw)
default_tagger  =  nltk.DefaultTagger( 'NN' )
tags  =  default_tagger.tag(tokens)
print (tokens)
print (tags)

['我', '累', '嗯个', 'e去', '?']

[('我', 'NN'), ('累', 'NN'), ('嗯个', 'NN'), ('e去', 'NN'), ('?', 'NN')]

正则表达式标注器:

满足特定正则表达式的认为是某种词性,比如凡是带“们”的都认为是代词(PRO)。

1
2
3
4
5
pattern  =  [( '.*们$' , 'PRO' )]
tagger  =  nltk.RegexpTagger(pattern)
print (tagger.tag(nltk.word_tokenize( '我们 累 个 去 你们 和 他们 啊' )))

[('我们', 'PRO'), ('累', None), ('个', None), ('去', None), ('你们', 'PRO'), ('和', None), ('他们', 'PRO'), ('啊', None)]

查询标注器:

找出最频繁的n个词以及它的词性,然后用这个信息去查找语料库,匹配的就标记上,剩余的词使用默认标注器(回退)。这一般使用一元标注的方式,见下面。

一元标注:基于已经标注的语料库做训练,然后用训练好的模型来标注新的语料。

1
2
3
4
5
6
7
sents  =  [[u '我' , u '你' , u '小兔' ]]
tagged_sents  =  [[(u '我' , u 'PRO' ), (u '小兔' , u 'NN' )]]
unigram_tagger  =  nltk.UnigramTagger(tagged_sents)
tags  =  unigram_tagger.tag(sents[ 0 ])
print (tags)

[('我', 'PRO'), ('你', None), ('小兔', 'NN')]

二元标注和多元标注:一元标注指的是只考虑当前这个词,不考虑上下文,二元标注器指的是考虑它前面的词的标注,用法只需要把上面的UnigramTagger换成BigramTagger,同理三元标注换成TrigramTagger(并未有示例)。

组合标注器:

为了提高精度和覆盖率,我们对多种标注器组合,比如组合二元标注器、一元标注器和默认标注器,如下,

1
2
3
t0  =  nltk.DefaultTagger( 'NN' )
t1  =  nltk.UnigramTagger(train_sents, backoff = t0) 
t2  =  nltk.BigramTagger(train_sents, backoff = t1)

直接调用t2即可。

持久化&较为完整的训练一个标注器:
1
2
3
4
5
6
7
8
9
10
11
sent  =  '我/NN 是/IN 一个/AT 好的/JJ 人/NN'
train_sents  =  [[nltk.tag.str2tuple(t)  for  in  sent.split()]]
t0  =  nltk.DefaultTagger( 'NN' )
t1  =  nltk.UnigramTagger(train_sents, backoff = t0) 
t2  =  nltk.BigramTagger(train_sents, backoff = t1) 
from  pickle  import  dump
output  =  open ( 't2.pkl' 'wb' )
dump(t2, output,  - 1 )
output.close()  

加载在这里,

1
2
3
4
from  pickle  import  load 
input  =  open ( 't2.pkl' 'rb'
tagger  =  load( input
input .close()

  

这篇关于nlp---Nltk 常用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058349

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用