python - 将 WordNetLemmatizer.lemmatize() 与 pos_tags 一起使用会引发 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))
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
标签。基于源代码的可接受pos
标签是:、和。wordnet
adj
adv
adv
verb
根据@bivouac0 的评论进行编辑:
所以要绕过这个问题,你必须制作一个映射器。映射功能很大程度上基于这个答案。不受支持的 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]))
推荐阅读
- unit-testing - Mockito 无法模拟此类(工件 BuildInfo)
- transactions - 单行事务和多行事务的区别?
- android - 更新 Android Room 中的 @PrimaryKey 值
- azure-devops - 如何在 Azure YAML 管道中将布尔值指定为变量?
- firebase - Flutter - 列表视图中的选项卡过滤
- c# - 使用套接字时,我在 beginreceive 上收到错误
- powershell - 在单独的文件中自定义 PowerShell 命令日志
- android - 如何修复清单合并失败?
- javascript - 如何使用 THREE.js 添加褪色反射?
- asp.net - Asp.net Core 3.1 HttpContext.Session.GetString("Index")