首页 > 解决方案 > 如何修改 Wordnet Lemmatizer 以限制特定单词?

问题描述

我正在将 wordNet lemmatizer 应用到我的语料库中,我需要为 lemmatizer 定义 pos 标记器:

stemmer = PorterStemmer()
def lemmitize(document):
    return stemmer.stem(WordNetLemmatizer().lemmatize(document, pos='v'))

def preprocess(document):
output = []
    for token in gensim.utils.simple_preprocess(document):
        if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:
            print("lemmitize: ", lemmitize(token))
            output.append(lemmitize(token))
    return output

现在你可以看到我正在为动词定义 pos(我知道 wordNet 默认 pos 是一个名词),但是当我对我的文档进行词形分析时:

the left door closed at the night  

我出来了:

output:  ['leav', 'door', 'close', 'night']

这不是我所期待的。在我上面的句子中,left指向哪个门(例如右或左)。如果我选择pos ='n'这个问题可能会解决,但它会充当wearedNet 默认值,并且不会对taken.

我在这里发现了一个类似的问题,我修改了异常列表,nltk_data/corpora/wordnet/verb.exc然后我改为left leaveleft left仍然得到与leav.
现在我想知道这个问题是否有任何解决方案,或者在最好的情况下,有什么方法可以添加一些单词的自定义词典(仅限于我的文档),wordNet 不会像这样对它们进行词形还原:

my_dict_list = [left, ...]

标签: pythonnlpwordnetlinguisticslemmatization

解决方案


您在词形还原和词干提取之间犯了一个常见错误。

词干

词干意味着将单词减少为其前缀。它与语法无关,但与您自己的数据或使用的算法相关。

例如,最常用的词干分析器 Porter Stemmer 会删除“词的形态和屈折词尾”(Porter Stemmer 网站

因此,像、cook、cooking、cooked 和 cookie 这样的词都去掉了其形态/屈折词尾,所有词尾都变成了“Cook”。但是,请注意,您将一个名词、一个现在进行时的动词、一个过去时的动词和另一个名词捆绑在一起(请注意,例如 cookie,即使是熟食,实际上并不与单词“cook”或“to cook”共享“层次结构”)。

当你这样做时:

stemmer.stem(WordNetLemmatizer().lemmatize(document))

您正在使用 wordnet 进行词干提取 - 首先您对单词进行词形还原,然后对其进行词干处理,删除“形态/屈折”词。事实上,如果你做词干提取,你甚至不需要词形还原(它只会改变不规则动词的东西)。

词形还原

另一方面,词形还原使用词汇信息将单词简化为其“默认”、非弹性形式。为了使它起作用,给出 te POS 非常重要(因为,正如您所看到的,叶子是一个表示动词和名词的词素)。

但是如何找到词性呢?

今天有一些技术,但最常用的一种是基于查找表和周围的单词——这些被输入到一个预先训练的机器学习算法中,该算法返回最可能的标签。阅读更多内容:https ://medium.com/greyatom/learning-pos-tagging-chunking-in-nlp-85f7f811a8cb

使用一个名为 NLTK 的流行 Python NLP 包,您可以:(您必须先下载相关包)

import nltk

sentence = "I want to tag these!"
token = nltk.word_tokenize(sentence)
nltk.pos_tag(token)

结果:

[('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('tag', 'VB'), ('these', 'DT') , ('!', '.')]

另一个流行的工具是 Spacy,其内容如下:(您必须先下载带有机器学习训练模型的语言模型)

import spacy

import spacy
nlp = spacy.load('en')
doc = nlp('I want to tag these!')
print([(token.text, token.pos_) for token in doc])

结果:

[('I', 'PRON'), ('want', 'VERB'), ('to', 'PART'), ('tag', 'VERB'), ('these', 'DET') , ('!', 'PUNCT')]

您可以在此处阅读有关 Spacy 的 POS 标记的更多信息:https ://spacy.io/usage/linguistic-features/

然后,我建议您坚持词形还原,因为这将为您提供更细粒度的选择。


推荐阅读