nlp---Nltk 常用方法_千寻~的博客-程序员秘密_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()

  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011630575/article/details/80158788

智能推荐

element-ui 中设置表格单元格 (el -table-column) 保留空格和换行_棠樾的博客-程序员秘密

问题:在使用el-table 展示数据时,单元格中的数据有可能存在空格和换行符,若不进行设置,浏览器默认会取消空格和换行符。解决方法:将单元格的样式 “white-space” 属性设置为“pre-wrap” 即可解决。white-space属性指定元素内的空白怎样处理。...

【不忘初心】Win10 20H2 19042.964_X64_四合一太阳谷图标_[纯净精简版][2.83G](2021.5.1)_ganggang4321的博客-程序员秘密_不忘初心20h2

母版来自MSDN WIN10_20H2.19042.928,集成补到19042.964,20H2相比1909 2004版本要稳定很多,此版修复了上次的一些问题,精简方法基本上还是原来配方,为了保证稳定初心的系统全部都是离线精简和优化,非二次封装。系统纯净、流畅、进程少无任何第三方软件,可正常更新补丁、办公无影响、欢迎朋友们测试反馈,提出意见!1、可正常在线更新补丁。2、纯净 无任何第三方软件。3、追求稳定、没有过度优化,可以正常办公。4、打印 蓝牙指纹 共享 ...

线程池ExecutorService的4种拒绝策略_二十六画生的博客的博客-程序员秘密_executorservice 拒绝策略

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,执行后面的任务ThreadPoolExecutor.CallerR...

抖音带给我们的意义是什么?_CEO赵林1007的博客-程序员秘密_抖音的意义

要说今年最火的APP是什么,那么无疑是抖音了,从年轻人到中年人再到老人,抖音成了最好玩的娱乐方式,对于我而言,有的时候,烦的时候打开抖音,刷刷视频,是非常惬意的一件事,当看到青春活力舞姿的时候,也挺想去学学跳舞;当听到一些好听的歌曲,也自然会哼几句;当看到为了爱情,不惜万里去找她的时候,也会莫名的感动;当看到到了七老八十依然牵着对方的手,害怕爱的她摔跤的时候,让我相信了爱情的力量;当看到为了生活,

UR5e连接OnRobot RG2机械手——实现远程控制_丢了找不着的博客-程序员秘密

本教程使用compute box远程控制,控制思路为:将编好夹爪动作程序存储在compute box中,将compute box与UR5e的控制柜中io口相连,我们即可通过电脑编程控制UR5e的io信号控制夹爪开合。1.机械安装步骤略过2.控制盒与UR5e控制柜io口接线图3.将compute box通过网线与电脑相连,几个可调节开关位置设置如图,用自带电源给compute box供电4.(此步骤可以在没有进行其他步骤操作时候独立进行)在电脑浏览器输入compute box的IP地址:19

随便推点

PowerDesigner15连接数据库报错解决办法Non SQL Error : Could not load class oracle.jdbc.OracleDriver_wxw7719512的博客-程序员秘密

PowerDesigner15在连接Oracle时,选择默认的jdbc驱动jar包时会出现Non SQL Error : Could not load class oracle.jdbc.OracleDriver。这是由于系统环境变量里没有设置驱动jar包的classpath路径,默认选择ojdbc14.jar时,如果还报上述错误,则ojdbc14.jar有问题,重新下载一个Oracle的驱动包即

go语言:json转换总结(json.Unmarshal、json.marshal)_努力工作中的博客-程序员秘密_json.unmarshal

Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。下面是是四种json转为结构体1. 普通JSONpackage mainimport ( "encoding/json" "fmt")// Actress 女演员type Actress struct { Name string

使用Java写的MD5加密工具_AngusC·的博客-程序员秘密

import java.security.MessageDigest;public class MD5Util { public static String toMD5(String plainText) { try { MessageDigest md = MessageDigest.getInstance("MD5");

这里有一个线性规划单纯形法算法程序_长郡伊嘉儿的博客-程序员秘密_单纯形法解线性规划小程序

这是我从网上找的一个求一般线性规划方程单纯形法的程序可以解决一般线性规划的程序,可以运行,但结果有问题,有没有大神了解这个算法的帮帮我改正确。可以谈价格,拜托了。#include <stdio.h>#include <math.h>#include using namespace std;float matrix[100][100],x[100]; /*...

pytorch学习笔记本_qq_41802245的博客-程序员秘密

torch 下:nn、autograd 、mm、 optimnn下: functional、Parameter、BCEWithLogitsLoss、Sequential 、Module神经网络搭建的简单过程#导入常用的库import numpy as npimport torchfrom torch import nnfrom torch.autograd import Variableimport torch.nn.functional as Fimport matplotlib.pyp

ImportError: libcudart.so.9.0: cannot open shared object file: No such file or directory_LX_96的博客-程序员秘密

ImportError: libcudart.so.9.0: cannot open shared object file: No such file or directory错误类型Traceback (most recent call last): File "/home/ices/lixian/CD/CloudComp/NTS-Net-master/train.py", line 7...

推荐文章

热门文章

相关标签