Python NLTK 中用于情感分析的德语词干提取
German Stemming for Sentiment Analysis in Python NLTK
我最近开始从事德语文本的情感分析项目,我计划使用词干分析器来改进结果。
NLTK 带有德国 Snowball Stemmer,我已经尝试使用它,但我不确定结果。也许应该这样,但作为一名计算机科学家而不是语言学家,我对不同词干的屈折动词形式有疑问。
以单词 "suchen"(搜索)为例,第一人称单数的词干为 "such",第三人称单数的词干为 "sucht"。
我知道也有词形还原,但据我所知,NLTK 中没有集成可用的德语词形还原器。有 GermaNet,但他们的 NLTK 集成似乎已中止。
进入正题:我希望屈折动词形式能够归为同一个词干,至少对于同一个时态内的常规动词。如果这对我的目标来说不是有用的要求,请告诉我原因。如果是,您是否知道可以使用任何其他资源来帮助我实现此目标?
编辑:我忘了说,任何软件都应该免费用于教育和研究目的。
作为一名计算机科学家,您肯定在寻找正确的方向来解决这个语言问题;)。词干提取通常更加简单,用于信息检索任务以试图减小词典大小,但通常不足以进行更复杂的语言分析。词形还原部分与词干提取的用例重叠,但包括将例如动词变形全部重写为相同的词根形式(引理),并将 "work" 区分为名词,将 "work" 区分为动词(尽管这有点取决于词形还原器的实现和质量)。为此,它通常需要更多信息(如 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,但不确定是什么其他信息可以从这里获得),但也许你可以试一试,看看它是否对你有帮助。
一个好的简单的解决方案是使用 TreeTagger。首先,您必须手动安装 treetagge(这基本上是将正确的 zip-file 解压缩到您计算机上的某个位置)。你会在这里找到二进制分布: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 的方法从 Treetagges 输出中制作漂亮的对象:
tags2 = treetaggerwrapper.make_tags(tags)
pprint.pprint(tags2)
就是这样。
我最近开始从事德语文本的情感分析项目,我计划使用词干分析器来改进结果。
NLTK 带有德国 Snowball Stemmer,我已经尝试使用它,但我不确定结果。也许应该这样,但作为一名计算机科学家而不是语言学家,我对不同词干的屈折动词形式有疑问。
以单词 "suchen"(搜索)为例,第一人称单数的词干为 "such",第三人称单数的词干为 "sucht"。
我知道也有词形还原,但据我所知,NLTK 中没有集成可用的德语词形还原器。有 GermaNet,但他们的 NLTK 集成似乎已中止。
进入正题:我希望屈折动词形式能够归为同一个词干,至少对于同一个时态内的常规动词。如果这对我的目标来说不是有用的要求,请告诉我原因。如果是,您是否知道可以使用任何其他资源来帮助我实现此目标?
编辑:我忘了说,任何软件都应该免费用于教育和研究目的。
作为一名计算机科学家,您肯定在寻找正确的方向来解决这个语言问题;)。词干提取通常更加简单,用于信息检索任务以试图减小词典大小,但通常不足以进行更复杂的语言分析。词形还原部分与词干提取的用例重叠,但包括将例如动词变形全部重写为相同的词根形式(引理),并将 "work" 区分为名词,将 "work" 区分为动词(尽管这有点取决于词形还原器的实现和质量)。为此,它通常需要更多信息(如 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,但不确定是什么其他信息可以从这里获得),但也许你可以试一试,看看它是否对你有帮助。
一个好的简单的解决方案是使用 TreeTagger。首先,您必须手动安装 treetagge(这基本上是将正确的 zip-file 解压缩到您计算机上的某个位置)。你会在这里找到二进制分布: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 的方法从 Treetagges 输出中制作漂亮的对象:
tags2 = treetaggerwrapper.make_tags(tags)
pprint.pprint(tags2)
就是这样。