将 WordNetLemmatizer.lemmatize() 与 pos_tags 一起使用会抛出 KeyError
Using WordNetLemmatizer.lemmatize() with pos_tags throws KeyError
我刚刚读到,在 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))
第 3 行后的输出(计算 POS 标签后)
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 code 的 wordnet
接受的 pos
标签是这些:adj
、adv
、adv
和 verb
。
编辑 基于@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]))
我刚刚读到,在 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))
第 3 行后的输出(计算 POS 标签后)
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 code 的 wordnet
接受的 pos
标签是这些:adj
、adv
、adv
和 verb
。
编辑 基于@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]))