python - 将 WordNetLemmatizer.lemmatize() 与 pos_tags 一起使用会引发 KeyError

标签 python text nlp nltk lemmatization

我刚刚读到,在 pos_tags 的帮助下,词形还原的结果是最好的。因此,我遵循了下面的代码,但计算出的 POS_tags 出现了 KeyError 。下面是代码

   from nltk import pos_tag
   x['Phrase']=x['Phrase'].transform(lambda value:value.lower())
   x['Phrase']=x['Phrase'].transform(lambda value:pos_tag(value))

第三行后的输出(计算 POS 标签后) enter image description here

   from nltk.stem import WordNetLemmatizer 
   lemmatizer = WordNetLemmatizer()
   x['Phrase_lemma']=x['Phrase'].transform(lambda value: ' '.join([lemmatizer.lemmatize(a[0],pos=a[1]) for a in  value]))

错误:

 KeyError                                  Traceback (most recent call last)
  <ipython-input-8-c2400a79a016> in <module>
  1 from nltk.stem import WordNetLemmatizer
  2 lemmatizer = WordNetLemmatizer()
  ----> 3 x['Phrase_lemma']=x['Phrase'].transform(lambda value: ' '.join([lemmatizer.lemmatize(a[0],pos=a[1]) for a in  value]))

 KeyError: 'DT'

最佳答案

您会收到 KeyError,因为 wordnet 未使用相同的 pos 标签。基于 source codewordnet 接受的 pos 标签这些是:adjadvadvverb

编辑基于@bivouac0的评论:

因此,要绕过这个问题,您必须创建一个映射器。映射功能很大程度上基于此answer 。不支持的 POS 将不会进行词形还原。

import nltk
import pandas as pd
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer 

lemmatizer = WordNetLemmatizer()

def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return None

x = pd.DataFrame(data=[['this is a sample of text.'], ['one more text.']], 
                 columns=['Phrase'])

x['Phrase'] = x['Phrase'].apply(lambda v: nltk.pos_tag(nltk.word_tokenize(v)))


x['Phrase_lemma'] = x['Phrase'].transform(lambda value: ' '.join([lemmatizer.lemmatize(a[0],pos=get_wordnet_pos(a[1])) if get_wordnet_pos(a[1]) else a[0] for a in  value]))

关于python - 将 WordNetLemmatizer.lemmatize() 与 pos_tags 一起使用会引发 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61982023/

相关文章:

python - 如何获取 numpy 数组中不连续索引的元素?

python - Python 的 ElementTree 中的多个文本节点? HTML生成

c# - 根据代码行从文本文件中获取函数名称

objective-c - Objective-C 中的简单自然语言解析器

python - 自定义表情符号和动画表情符号不起作用 [discord.py-rewrite]

python - pandas.cut 不会对零值进行分类

text - Sublime Text 3 顶部编辑器内边距

python - 如何刷新 Matplotlib 中的文本?

machine-learning - 如何使用 OpenNLP 根据文本类别标记文本?

apache - UIMA ruta 中的模糊性