赞
踩
最近实验室参加了个比赛,比赛内容是做一个英文学术论文阅读 / 写作的辅助系统(RFW:Read For Write),我做了一部分的数据收集和处理工作。
这次就整理一下词性标注的基本方法。
词性标注中最主要用到的库是NLTK库,具体的安装过程和遇到问题的解决办法可以参考我的这篇文章:【自然语言处理】NLTK库的安装
在词性标注中我们会用到的wordnet
, averaged_perceptron_tagger
, punkt
包,三个包应该分别存在corpora
, taggers
, tokenizers
文件夹下,最终的存储位置可参考如下:
一个句子是由若干标记(Token)组成的,标记既可以是一个词,也可以是标点符号等。将句子分割为标记的过程为标记解析(Tokenization)。
函数:word_tokenize()
实现代码如下:
from nltk import word_tokenize
line = "They fired a gun, and they sit by the fire."
tokens = word_tokenize(line) # 标记解析
结果:
print(tokens)
['They', 'fired', 'a', 'gun', ',', 'and', 'they', 'sit', 'by', 'the', 'fire', '.']
补充:
标记解析有点类似于我们词频统计的第一步:分词,标记解析除了使用方便以外,还有这两点优势:
当分词结束后,我们需要利用NLTK库对每个词进行词性标注(pos_tag),词性(POS: Part Of Speech)的标注(tag)往往基于标记解析。
函数:nltk.pos_tag()
实现代码如下:
from nltk import pos_tag
tags = pos_tag(tokens)
结果:
for item in tags:
print(item)
('They', 'PRP')
('fired', 'VBD')
('a', 'DT')
('gun', 'NN')
(',', ',')
('and', 'CC')
('they', 'PRP')
('sit', 'VBP')
('by', 'IN')
('the', 'DT')
('fire', 'NN')
('.', '.')
补充:词性标签
因为我们本次是动词标注,所以先列出动词标签,更多的可以参考:python自然语言处理——NLTK——词性标签(pos_tag)
词性标签 | 词性 | 举例 |
---|---|---|
VB | 动词 | take |
VBD | 过去时 | took |
VBG | 动名词 / 现在分词 | taking |
VBN | 过去分词 | taken |
VBP | 一般现在时 | take |
VBZ | 第三人称 | takes |
当出现类似take、takes这种动词,我们往往更想要take的各种时态的总频率,而不是各自的词频,因此需要词性还原。代码如下:
from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
print(wnl.lemmatize('running', 'v'))
这段代码的返回结果是:
run
以上就是动词标注的三步流程,其余词性的标注看情况加第三步,但前两步的处理是一致的。
总代码如下:
from nltk import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet from nltk.stem import WordNetLemmatizer line = "They fired a gun, and they sit by the fire." tokens = word_tokenize(line) # 标记(Token)解析, 可简单理解为分词(不包括小写和去符号的过程) tags = pos_tag(tokens) # 词性标注, 标记后的结果是二元数组格式 # for token in tokens: # print(token) # print("==================") # for item in tags: # print(item) # # 词性还原 # wnl = WordNetLemmatizer() # print(wnl.lemmatize('running', 'v')) v_tags = {'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ'} # set wnl = WordNetLemmatizer() for word, pos in tags: if pos in v_tags: print(wnl.lemmatize(word, 'v'))
结果:(注意这个fire是前面那个fired变换得来的)
fire
sit
[1] 【自然语言处理】NLTK库的安装
[2] python自然语言处理——NLTK——词性标签(pos_tag)
[3] 自然语言处理(NLP)之英文单词词性还原
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。