Python NLTK中的德语词干提取用于情感分析

12

我最近开始从事一个关于德语文本的情感分析项目,打算使用词干提取器来改进结果。

NLTK自带德语Snowball词干提取器,我已经尝试使用它了,但是对结果不确定。作为一名计算机科学家而不是语言学家,我对不同词干的变化形式有困惑。

以单词"suchen"(搜索)为例,第一人称单数被词干化为"such",而第三人称单数被词干化为"sucht"。

我知道还有词形还原,但据我所知,没有可用的德语词形还原器集成到NLTK中。有GermaNet,但他们的NLTK集成似乎已经被取消了。

重点是:我想要将变化形式的动词词干化为相同的词干,至少在同一个时态内的正规动词。如果这对我的目标没有帮助,请告诉我原因。如果有帮助,请问是否知道其他可以帮助我实现这个目标的资源?

编辑:我忘记提到了,任何软件都应该免费用于教育和研究目的。

2个回答

14
作为计算机科学家,你肯定正在朝着解决这个语言问题的正确方向努力;)。 词干提取通常要简单得多,并用于信息检索任务,以尝试减少词汇量,但通常不足以进行更复杂的语言分析。 词形变化部分重叠于词干提取的用例,但包括将动词屈折形式全部重写为相同的根形式(引理),并区分“工作”作为名词和“工作”作为动词(尽管这在实现和引理质量上有所不同)。 为此,通常需要更多信息(如POS标签、语法树),因此需要更长时间,使其不太适合处理大量数据的IR任务。
除了GermaNet(不知道它被中止了,但从未真正尝试过它,因为它是免费的,但您必须签署协议才能访问它),还有SpaCy,您可以看一下:https://spacy.io/docs/usage/ 非常容易安装和使用。请参阅网站上的安装说明,然后使用以下命令下载德语内容:
python -m spacy download de

那么:

>>> import spacy
>>> nlp = spacy.load('de')
>>> doc = nlp('Wir suchen ein Beispiel')
>>> for token in doc:
...     print(token, token.lemma, token.lemma_)
... 
Wir 521 wir
suchen 1162 suchen
ein 486 ein
Beispiel 809 Beispiel
>>> doc = nlp('Er sucht ein Beispiel')
>>> for token in doc:
...     print(token, token.lemma, token.lemma_)
... 
Er 513 er
sucht 1901 sucht
ein 486 ein
Beispiel 809 Beispiel

您可以看到,不幸的是它在您的特定示例(suchen)上表现不佳,而且我不确定该数字表示什么(即必须是引理ID,但不确定还可以从中获得哪些信息),但也许您可以尝试一下并看看它是否有所帮助。


谢谢,我一定会在回去后尝试一下。 - Florian
1
谢谢这个提示!@Igor,我尝试了你的第二个例子('Er sucht ein Beispiel'),它似乎给出了正确的结果:Er 5864527961345014045 我 sucht 18313823129771624139 寻找 ein 4873406193780485055 一个 Beispiel 176351906757609250 示例这太棒了!正是我一直在寻找的! - Samuel Blattner

0
一个好而简单的解决方案是使用TreeTagger。首先,您需要手动安装treetagger(基本上是在计算机的某个位置解压正确的zip文件)。您可以在这里找到二进制发行版:http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/ 然后,您需要安装一个包装器来从Python中调用它。
以下代码安装了包装器并对已标记的句子进行了词形还原:
import treetaggerwrapper

tagger = treetaggerwrapper.TreeTagger(TAGLANG='de')

tags = tagger.tag_text(tokenized_sent,tagonly=True) #don't use the TreeTagger's tokenization!

pprint.pprint(tags)

你也可以使用treetaggerwrapper中的一个方法将Treetagger输出转换成易读对象:
tags2 = treetaggerwrapper.make_tags(tags)
pprint.pprint(tags2)

那就是全部。


如果您能提供示例输入和输出以展示该答案的预期效果,那么这个回答将会更加有帮助,就像其他回答所做的那样。 - undefined
你是对的。但是现在,4年后我不再使用treetaggerwrapper了。相反,可以看看纯Python的替代方案,比如https://github.com/wartaal/HanTa。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接