【问题标题】:Using WordNetLemmatizer.lemmatize() with pos_tags throws KeyError将 WordNetLemmatizer.lemmatize() 与 pos_tags 一起使用会引发 KeyError
【发布时间】:2020-05-24 05:32:22
【问题描述】:

我刚刚读到,在 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'

【问题讨论】:

    标签: python text nlp nltk lemmatization


    【解决方案1】:

    您会得到一个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]))
    

    【讨论】:

    • 但是像DT这样的其他标签我该怎么办呢?我认为 wordnet 中不存在它的映射。
    • 好吧,我相信您必须假设其他所有内容都将被视为NOUN
    • 但这不会是错误的吗?你能给我一个值得信赖的来源吗?这将是一个很大的帮助
    • 之前的评论是基于WordNetLemmatizer.lemmatize方法的默认pos值。我不能从语言的角度支持它。另一种选择可能是不对不受支持的 POS 进行词形还原。
    • 只有动词、adj/adv 和名词有引理。像 DT(决定者,即.. a, an, the)这样的东西没有引理。不要试图通过 telingl Wordnet 将其他标签词形化,它们是名词。您可能会得到不正确/奇怪的结果。我能想到的唯一例外是 POS=MD 是一种动词,所以任何标记为MD 的东西都应该用动词词形化。
    猜你喜欢
    • 2021-06-07
    • 2018-11-24
    • 1970-01-01
    • 2014-08-11
    • 2018-06-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多