NLP⼊门学习1——分词和词性标注
NLP⼊门学习1——分词和词性标注
0.简介
本⽂主要介绍NLP中最基础的任务分词和词性标注。难度属于⼊门级别。
本⽂的主要参考如下:
1.概念和⼯具
1.1 词性标注
词性标注是NLP四⼤基本任务中序列标注中的⼀项,其⽬的是对⽂本中的词汇实现词性的划分。标注的结果是⼀个由⼆元组组成的list,其中每⼀个⼆元组中标明了每个token对应的词性。
1.2 NLTK
NLTK全称natural language toolkit是⼀个基于python编写的⾃然语⾔处理⼯具箱。
安装⾮常简单,直接⽤conda或者pip安装即可。
conda install nltk
在nltk中,将词性归为以下类别:
简写全称含义
CC coordinating conjunction并列连词
CD cardinal digit基数
DT determiner限定词
EX existentialthere存在句
FW foreignword外来语
IN preposition/subordinating conjunction介词/从属连词
JJ adjective形容词
JJR adjective, comparative⽐较级形式
JJS adjective, superlative最⾼级
MD modal情态动词
NN noun名词单数形式import pickle
NNS noun名词复数形式
NNP propernoun专有名词单数形式
NNPS propernoun专有名词复数形式
PDT predeterminer前位限定词
POS possessiveending属有词’s
POS possessiveending属有词’s
简写全称含义
PRP personalpronoun⼈称代词
PRP$possessive pronoun物主代词
RB adverb very副词
RBR adverb,comparative副词⽐较级
RBS adverb,superlative副词最⾼级
RP particle与动词构成短语的副词或介词
TO to to
UH interjection感叹词
VB verb动词
VBD verb动词过去式
VBG verb现在分词
VBN verb过去分词
VBP verb动词现在
VBZ verb动词 第三⼈称
WDT wh-determiner限定词which等
WP wh-pronoun代词who, what 等
WP$possessivewh-pronoun所有格 whose
WRB wh-abverb where, when 副词
1.3 jieba
jieba是⼀个优秀的中⽂分词库,同样是基于python。
⽀持精确模式,全模式,搜索引擎模式等多种模式。
Github:
jieba安装可以在conda命令⾏通过如下指令完成:
conda install --channel /conda-forge jieba
1.4 LAC
LAC全称Lexical Analysis of Chinese,是百度⾃然语⾔处理部研发的⼀款联合的词法分析⼯具,实现中⽂分词、词性标注、专名识别等功能。
GitHub:
LAC的安装也⾮常简单:
pip install lac -i mirror.baidu/pypi/simple
在词性标注任务中,LAC将词性归为以下类:
2.代码实现
2.1 分词
分词可以使⽤nltk实现,也可以使⽤其他⼯具如jieba实现。
使⽤nltk⼯具进⾏分词可以直接由⽂本到token划分,也可以先进⾏sentence level的分词。
2.1.1 使⽤nltk进⾏分词:
(1)直接划分
words = nltk.word_tokenize(text)
words
结果:
Out[1]: ['life', 'is', 'short', '.', 'play', 'more', 'sport', '.']
(2)先进⾏句⼦划分:
import nltk
text = 'life is short. play more sport.'
sents = nltk.sent_tokenize(text)
sents
结果:
Out[1]: ['life is short.', 'play more sport.']
再进⾏分词:
words = [nltk.word_tokenize(i) for i in sents]
words
结果:
Out[1]: [['life', 'is', 'short', '.'], ['play', 'more', 'sport', '.']]
但没有加载中⽂语料库的情况下,试图使⽤nltk进⾏中⽂分词就会出现问题:
words = nltk.word_tokenize('吃葡萄不吐葡萄⽪,不吃葡萄倒吐葡萄⽪')
words
结果可以看出分词并没有成功:
['吃葡萄不吐葡萄⽪,不吃葡萄倒吐葡萄⽪']
接下来就介绍可以⽤于中⽂分词的⼯具。
2.1.2 使⽤jieba进⾏分词
jieba的分词功能可以由两个函数实现,cut函数返回的是⼀个generator,lcut函数直接返回⼀个list,具体的使⽤⽅法:
(1) cut:
import jieba
import jieba.analyse
words = jieba.cut(text)
print('/'.join(words))
结果:
life/ /is/ /short/./ /play/ /more/ /sport/.
(2) lcut:
words = jieba.lcut(text)
print(words)
结果:
['life', ' ', 'is', ' ', 'short', '.', ' ', 'play', ' ', 'more', ' ', 'sport', '.']
在这⾥可以看出jieba分词与nltk之间的⼀个区别在于,jieba的分词结果中把空格也包含进去了,不限要空格的话就把它删掉就好了。
words = jieba.lcut(text)
while ' ' in words:
print(words)
结果:
['life', 'is', 'short', '.', 'play', 'more', 'sport', '.']
jieba除了可以进⾏英⽂分词,也可以进⾏中⽂分词。
words = jieba.lcut('吃葡萄不吐葡萄⽪,不吃葡萄倒吐葡萄⽪')
words
结果:
['吃', '葡萄', '不吐', '葡萄', '⽪', ',', '不吃', '葡萄', '倒', '吐', '葡萄', '⽪']
2.1.3 使⽤LAC进⾏分词
使⽤LAC进⾏分词也很简单,下⾯是LAC官⽅的操作指引和样例结果。
from LAC import LAC
# 装载分词模型
lac = LAC(mode='seg')
# 单个样本输⼊,输⼊为Unicode编码的字符串
text = "LAC是个优秀的分词⼯具"
seg_result = lac.run(text)
# 批量样本输⼊, 输⼊为多个句⼦组成的list,平均速率会更快
texts = ["LAC是个优秀的分词⼯具", "百度是⼀家⾼科技公司"]
seg_result = lac.run(texts)
结果:
【单样本】:seg_result = [LAC, 是, 个, 优秀, 的, 分词, ⼯具]
【批量样本】:seg_result = [[LAC, 是, 个, 优秀, 的, 分词, ⼯具], [百度, 是, ⼀家, ⾼科技, 公司]]
2.2 词性标注
2.2.1 使⽤nltk⼯具实现词性标注
pos_tags =nltk.pos_tag(words)
print(pos_tags)
结果:
[('life', 'NN'), ('is', 'VBZ'), ('short', 'JJ'), ('.', '.'), ('play', 'VB'), ('more', 'JJR'), ('sport', 'NN'), ('.', '.')]
可以看出在英⽂分词⽅⾯nltk⼯具的效果还是很准确,很精细的。
上⽂中提到nltk在中⽂分词中不灵了,那么如果将分好的token输⼊给nltk,是否能够完成词性标注了?
words = jieba.lcut('吃葡萄不吐葡萄⽪,不吃葡萄倒吐葡萄⽪')
pos_tags =nltk.pos_tag(words)
pos_tags
结果:
[('吃', 'JJ'),
('葡萄', 'NNP'),
('不吐', 'NNP'),
('葡萄', 'NNP'),
('⽪', 'NNP'),
(',', 'NNP'),
('不吃', 'NNP'),
('葡萄', 'NNP'),
('倒', 'NNP'),
('吐', 'NNP'),
('葡萄', 'NNP'),
('⽪', 'NN')]
尽管标注完成了,但是通过判断发现它的标注并不准确,把“吃”标注成了形容词,“不吐”标注成了名词。
2.2.2 使⽤LAC⼯具实现词性标注
from LAC import LAC
# 装载LAC模型
lac = LAC(mode='lac')
# 单个样本输⼊,输⼊为Unicode编码的字符串
text = u"LAC是个优秀的分词⼯具"
lac_result = lac.run(text)
# 批量样本输⼊, 输⼊为多个句⼦组成的list,平均速率更快
texts = [u"LAC是个优秀的分词⼯具", u"百度是⼀家⾼科技公司"]
lac_result = lac.run(texts)
结果:
【单样本】: lac_result = ([百度, 是, ⼀家, ⾼科技, 公司], [ORG, v, m, n, n])
【批量样本】:lac_result = [
([百度, 是, ⼀家, ⾼科技, 公司], [ORG, v, m, n, n]),
([LAC, 是, 个, 优秀, 的, 分词, ⼯具], [nz, v, q, a, u, n, n])
]
再来测试⼀下我们⾃⼰的例⼦:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论