当前位置:   article > 正文

【自然语言处理】词性标注_词性标注的库

词性标注的库

最近实验室参加了个比赛,比赛内容是做一个英文学术论文阅读 / 写作的辅助系统(RFW:Read For Write),我做了一部分的数据收集和处理工作。

  • 数据收集阶段:我舍友写了个爬虫网页pdf的代码,我用的那个代码爬的数据,相对轻松
  • 数据处理阶段:我做的主要是词性标注,包括:标记解析、词性标注、词性还原三步

这次就整理一下词性标注的基本方法

1 NLTK库的安装

词性标注中最主要用到的库是NLTK库,具体的安装过程和遇到问题的解决办法可以参考我的这篇文章:【自然语言处理】NLTK库的安装
在词性标注中我们会用到的wordnet, averaged_perceptron_tagger, punkt包,三个包应该分别存在corpora, taggers, tokenizers文件夹下,最终的存储位置可参考如下:
在这里插入图片描述

2 标记解析

一个句子是由若干标记(Token)组成的,标记既可以是一个词,也可以是标点符号等。将句子分割为标记的过程为标记解析(Tokenization)。
函数:word_tokenize()

  • 入口参数:待标注的句子
  • 出口参数:解析后的分词列表

实现代码如下:

from nltk import word_tokenize

line = "They fired a gun, and they sit by the fire."
tokens = word_tokenize(line)    # 标记解析
  • 1
  • 2
  • 3
  • 4

结果:

print(tokens)
['They', 'fired', 'a', 'gun', ',', 'and', 'they', 'sit', 'by', 'the', 'fire', '.']
  • 1
  • 2

补充:
标记解析有点类似于我们词频统计的第一步:分词,标记解析除了使用方便以外,还有这两点优势:

  • 准确
    一般来讲,一个句子的结尾具有明显的标志,如句号、问号和感叹号等,因此可以用简单的规则进行分句。然而,往往存在大量的例外情况,如在英文中,句号除了可以作为句尾标志,还可以作为单词的一部分(如"Mr.")。NLTK提供的分句功能可以较好地解决此问题。
  • 有用
    标记解析往往与下面的词性标注相结合,使每个单词的词性能够结合具体的句子而标注。

3 词性标注

当分词结束后,我们需要利用NLTK库对每个词进行词性标注(pos_tag),词性(POS: Part Of Speech)的标注(tag)往往基于标记解析。
函数:nltk.pos_tag()

  • 入口参数:分词列表
  • 出口参数:二元组(词,词性标签)

实现代码如下:

from nltk import pos_tag

tags = pos_tag(tokens) 
  • 1
  • 2
  • 3

结果:

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')
('.', '.')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

补充:词性标签
因为我们本次是动词标注,所以先列出动词标签,更多的可以参考:python自然语言处理——NLTK——词性标签(pos_tag)

词性标签词性举例
VB动词take
VBD过去时took
VBG动名词 / 现在分词taking
VBN过去分词taken
VBP一般现在时take
VBZ第三人称takes

4 词性还原

当出现类似take、takes这种动词,我们往往更想要take的各种时态的总频率,而不是各自的词频,因此需要词性还原。代码如下:

from nltk.stem import WordNetLemmatizer

wnl = WordNetLemmatizer()
print(wnl.lemmatize('running', 'v'))
  • 1
  • 2
  • 3
  • 4

这段代码的返回结果是:

run
  • 1

5 总代码

以上就是动词标注的三步流程,其余词性的标注看情况加第三步,但前两步的处理是一致的。
总代码如下:

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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

结果:(注意这个fire是前面那个fired变换得来的)

fire	
sit
  • 1
  • 2

6 参考

[1] 【自然语言处理】NLTK库的安装
[2] python自然语言处理——NLTK——词性标签(pos_tag)
[3] 自然语言处理(NLP)之英文单词词性还原

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/588737
推荐阅读
相关标签
  

闽ICP备14008679号