德语扼杀Python NLTK中的情感分析

时间:2017-06-13 13:11:02

标签: python nltk sentiment-analysis stemming snowball

我最近开始研究德语文本的情绪分析项目,并且我计划使用词干分析器来改善结果。

NLTK配有德国Snowball Stemmer并且我已经尝试使用它,但我不确定结果。也许它应该是这样的,但作为一个计算机科学家,而不是一个语言学家,我有一个问题,变形动词形式源于一个不同的词干。

取出" suchen" (搜索),这是因为"这样的"对于第一人称单数,但对于#34;这样的"对于第三人称单数。

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

达到目的:我希望将动词形式设置为同一个词干,至少对于同一时态内的常规动词。如果这对我的目标不是一个有用的要求,请告诉我原因。如果是,您是否知道可以使用哪些其他资源来帮助我实现这一目标?

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

2 个答案:

答案 0 :(得分:7)

作为一名计算机科学家,你肯定正在寻找解决这一语言问题的正确方向;)。词干通常更加简单化,并用于信息检索任务以试图减少词典大小,但通常不足以进行更复杂的语言分析。 Lemmatisation部分地与词干的用例重叠,但包括重写例如动词变形全部到相同的根形式(引理),并且还区分" work"作为名词和"工作"作为一个动词(虽然这取决于lemmatiser的实现和质量)。为此,它通常需要更多信息(如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

正如你所看到的,遗憾的是它并没有在你的具体例子上做得很好(成熟),而且我不确定数字代表什么(即必须是引理id,但不是确定可以从中获得哪些其他信息),但也许你可以试一试,看看它是否对你有帮助。

答案 1 :(得分:0)

一个好的简单的解决方案是使用TreeTagger。首先,您必须手动安装treetagge(基本上是将正确的zip文件解压缩到计算机上的某个位置)。您将在这里找到二进制分布:http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/

然后,您需要安装一个包装程序才能将其称为Python。

以下代码将安装包装程序并为标记化的句子定形:

From - Mon Jun  3 18:17:49 2019
Return-Path: <test@test.com>
Delivered-To: test@test.com
    for <test@test.com>; Mon, 03 Jun 2019 18:17:36 +0200
    ; Mon, 03 Jun 2019 18:17:36 +0200
Date: Mon, 03 Jun 2019 18:17:39 +0200
To: test@test.com
Subject: =?UTF-8?B?UHJvdmE=?=
From: =?UTF-8?B?QWxlc3NhbmRybyBNYXJpbnV6emk=?= <test@test.com>
Reply-To: =?UTF-8?B?QWxlc3NhbmRybyBNYXJpbnV6emk=?= <test@test.com>
Return-Path: test@test.com
MIME-Version: 1.0
Content-Type: multipart/mixed;
 Boundary="==Multipart_Boundary_x2bf07da61d9de3d12f7c30d38eabbf40x"

This is a multi-part message in MIME format.

--==Multipart_Boundary_x2bf07da61d9de3d12f7c30d38eabbf40x
Content-Type: text/plain; Charset="UTF-8"
Content-Transfer-Encoding: 8bit

Test with attachments...

--==Multipart_Boundary_x2bf07da61d9de3d12f7c30d38eabbf40x
Content-Type: application/octet-stream; Name="test.zip"
Content-Disposition: attachment; Filename="test.zip"
Content-Transfer-Encoding: base64

UEsDBBQAAAAIAImAwU7q5x4NDgAAAA4AAAAIAAAAdGVzdC50eHQrycgsVgCiRIWS1OISAFBLAQIf
ABQAAAAIAImAwU7q5x4NDgAAAA4AAAAIACQAAAAAAAAAIAAAAAAAAAB0ZXN0LnR4dAoAIAAAAAAA
AQAYALUw9eeCGNUBtTD154IY1QEfNnDlghjVAVBLBQYAAAAAAQABAFoAAAA0AAAAAAA=


--==Multipart_Boundary_x2bf07da61d9de3d12f7c30d38eabbf40x
Content-Type: application/octet-stream; Name="this is another test.zip"
Content-Disposition: attachment; Filename="this is another test.zip"
Content-Transfer-Encoding: base64

UEsDBAoAAAAAALuRw04AAAAAAAAAAAAAAAAYAAAAdGhpcyBpcyBhbm90aGVyIHRlc3QudHh0UEsB
Ah8ACgAAAAAAu5HDTgAAAAAAAAAAAAAAABgAJAAAAAAAAAAgAAAAAAAAAHRoaXMgaXMgYW5vdGhl
ciB0ZXN0LnR4dAoAIAAAAAAAAQAYADFJ3FcnGtUBMUncVyca1QExSdxXJxrVAVBLBQYAAAAAAQAB
AGoAAAA2AAAAAAA=


--==Multipart_Boundary_x2bf07da61d9de3d12f7c30d38eabbf40x--

您还可以使用treetaggerwrapper中的方法从Treetagges输出中生成漂亮的对象:

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)

仅此而已。