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

问题描述 投票:0回答:1

我刚刚读到,在使用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'
python text nlp nltk lemmatization
1个回答
0
投票

您获得KeyError,因为wordnet没有使用相同的pos标签。基于poswordnet可接受的source code标签是:adjadvadvverb

EDIT基于@ 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]))
© www.soinside.com 2019 - 2024. All rights reserved.