nltk词性标注与词形还原中的词性类型匹配

一、两函数词性不匹配问题:

nltk中词性标注函数nltk.pos_tag([])得到的结果:NN,NNP,VB

nltk中词形还原函数nltk.stem.WordNetLemmatizer().lemmatize('word')要求的参数是:a,n,v

二、一种解决方案

两种词性类型的对照表如下:

——————————————————————————————————————

a(形容词)——JJ,JJR,JJS(形容词,比较级,最高级)

r(副词)——RB,RBR,RBS(副词,比较级,最高级)

v(动词)——VB,VBD,VBG,VBN,VBP,VBZ(动词,过去式,动名词,过去分词,非三单,三单)

n(名词)——NN,NNS,NNP,NNPS(NN表示常用名词,NNP表示专有名词,S表示单复数)

——————左边是词形还原要用到的类型,右边是词性标注得到的类型——————

代码实现上可以检查词性标注结果前面的部分:可以从上面观察到形容词都是JJ开头的,同时不存在其他J开头的词性,因此可以检查是否是J开头来判断词性。注意:R开头的还有一个RP(Particle 小品词)。

a——JJ(或者J)

r——RB

v——VB(或者V)

n——NN(或者N)

——————————————————————————————————————

三、代码

import nltk
aft_tk=['word','better','had'] #分词后的列表
nltk_pos_tagged = nltk.pos_tag(aft_tk)
wnl = nltk.stem.WordNetLemmatizer()
aft_lem = [] #词形还原后的列表
for pstg in nltk_pos_tagged:
    word,tag = pstg
    if tag.startswith('NN'):
        aft_lem.append(wnl.lemmatize(word,'n'))
    elif tag.startswith('JJ'):
        aft_lem.append(wnl.lemmatize(word,'a'))
    elif tag.startswith('VB'):
        aft_lem.append(wnl.lemmatize(word,'v'))
    elif tag.startswith('RB'):
        aft_lem.append(wnl.lemmatize(word,'r'))
    else :
        aft_lem.append(word)
print(aft_lem)

out:

['work','well','have']

四、附录

词性标注得到词性类型表:(27条消息) NLTK的词性_一只鸟的天空的博客-CSDN博客_nltk 词性icon-default.png?t=M85Bhttps://blog.csdn.net/heyongluoyao8/article/details/43731743

词形还原需要词性类型表:利用如下指令查看:

help(nltk.stem.WordNetLemmatizer())

得到结果如下:

The Part Of Speech tag. Valid options are `"n"` for nouns,
 |          `"v"` for verbs, `"a"` for adjectives, `"r"` for adverbs and `"s"`
 |          for satellite adjectives.

Δ:这个satellite adjectives也不知道是什么东西

你可能感兴趣的:(nltk,文本预处理,分词,python)