NLTK: 词形归并器和词性标注

3
我创建了一个纯文本语料库,下一步是对所有文本进行词形归并处理。我使用的是 WordNetLemmatizer,需要每个标记的 pos_tag 来避免出现爱 -> lemma = 爱和喜爱 -> lemma = 喜爱等问题...
我认为默认的 WordNetLemmatizer-POS-Tag 是 n (=名词),但是我该如何使用 pos_tag?我认为期望的 WordNetLemmatizer-POS-Tag 与我得到的 pos_tag 不同。是否有一种函数或其他方法可以帮助我解决这个问题?!?!

在这行代码中,我认为 word_pos 是错误的,这就是错误的原因

lemma = wordnet_lemmatizer.lemmatize(word,word_pos)

import nltk
from nltk.corpus import PlaintextCorpusReader
from nltk import sent_tokenize, word_tokenize, pos_tag
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()

corpus_root = 'C:\\Users\\myname\\Desktop\\TestCorpus'
lyrics = PlaintextCorpusReader(corpus_root,'.*')

for fileid in lyrics.fileids():
     tokens = word_tokenize(lyrics.raw(fileid))
     tagged_tokens = pos_tag(tokens)
     for tagged_token in tagged_tokens:
         word = tagged_token[0]
         word_pos = tagged_token[1]
         print(tagged_token[0])
         print(tagged_token[1])
         lemma = wordnet_lemmatizer.lemmatize(word,pos=word_pos)
         print(lemma)

附加问题:pos_tag对于我的词形还原是否足够?我需要另一个标记器吗?我的文本是歌词...



1
我认为你的诊断是正确的;nltk已经有了一个新的POS标记器,但是这里展示的解决方案仍然有效。如果您对nltk.pos_tag()的准确性感到满意(并且如果您的文本不太奇怪,需要自定义标记器),则无需安装其他标记器。 - alexis
1
试试这个:https://gist.github.com/alvations/07758d02412d928414bb?它是来自https://github.com/alvations/pywsd的代码片段。 - alvas
也许这个也是适合的 https://github.com/alvations/pywsd/blob/master/pywsd/utils.py#L100 - alvas
这个答案有一个漂亮的一行代码:https://dev59.com/5l8e5IYBdhLWcg3wo7mE#25544239;它是 wnpos = lambda e: ('a' if e[0].lower() == 'j' else e[0].lower()) if e[0].lower() in ['n', 'r', 'v'] else 'n'。然后使用 wnpos(nltk_pos) 来获取你可以传递给 .lemmatize() 的词性。 - wordsforthewise
1个回答

2
你需要将pos_tagger标记转换为wordnet可识别的四个“句法类别”之一之后,将其作为单词_pos传递给lemmatizer。

文档中可以得知:

句法类别:n表示名词文件,v表示动词文件,a表示形容词文件,r表示副词文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接