NLP:如何结合词干提取和标记?

NLP: How do I combine stemming and tagging?

我正在尝试编写代码,该代码传入已标记化并过滤掉停用词的文本,然后对其进行词干和标记。但是,我不确定应该按什么顺序进行词干和标记。这是我目前拥有的:

#### Stemming
ps = PorterStemmer()    # PorterStemmer imported from nltk.stem

stemText = []

for word in swFiltText:    # Tagged text w/o stop words
    stemText.append(ps.stem(word))


#### POS Tagging
def tagging():
    tagTot = []
    try:
        for i in stemText:
            words = nltk.word_tokenize(i)    # I need to tokenize again (idk why?)
            tagged = nltk.pos_tag(words)
            tagTot = tagTot + tagged    # Combine tagged words into list

    except Exception as e:
        print(str(e))
    return tagTot

tagText = tagging()

乍一看,这很好用。但是,因为我先提取词干,所以 pos_tag 经常给单词贴错标签。例如,它将 "hous" 标记为形容词,而原始单词实际上是名词 "house"。但是当我在标记后尝试词干时,它给我一个关于 pos_tag 如何无法处理 'tuples' 的错误 - 我猜这与词干分析器格式化单词的方式有关列为 [('come', 'VB'), ('hous', 'JJ'),等等

我应该使用不同的 stemmer/tagger 吗?还是我的代码有问题?

提前致谢!

我建议使用词形还原而不是词干提取,词干提取只是从末尾切掉字母,直到到达 root/stem 单词。词形还原还会查看周围的文本以确定给定单词的词性。

您应该在应用词干提取或词形还原之前标记文本。

删除词尾会带走有关词性标记的重要线索。

你将 hous 作为形容词的原因是任何标注器都需要未处理的标记,以及以 -ous 结尾的英语单词通常是形容词 (nefarious, serious)。如果您先标记它,它可以被识别(即使没有上下文)为名词或动词。然后,标记器可以使用上下文(前面是 the? -> 名词)来消除最有可能的歧义。

一个好的词形还原器可以考虑词性,例如 housing 可以是一个名词(引理:housing)或动词(引理:house)。有了 p-o-s 信息,lemmatiser 可以在那里做出正确的选择。

使用词干提取还是词形还原取决于您的应用。对于许多目的,它们将是等效的。与我的经验的主要区别在于:

  1. 词干提取要快得多,因为词干提取器有一些关于如何处理各种结尾的规则
  2. 词形还原为您提供 'proper' 个可以在词典中查找的单词(如果您想获得其他语言或定义的注释)
  3. 词干化的字符串有时看起来与原始单词完全不同,如果您将它们呈现给人类用户,他们可能会感到困惑
  4. Stemmers 将具有相似含义但不同词条的词合并,因此对于信息检索它们可能更有用
  5. 词干分析器不需要单词列表,所以如果您想编写自己的词干分析器,它比编写词干分析器更快(如果您正在处理没有现成工具的语言)