多语言 NLTK 用于词性标注和词形还原。

14

最近我接触了自然语言处理(NLP),并尝试使用NLTKTextBlob分析文本。我想开发一个应用程序,分析旅行者的评论,因此我需要处理许多不同语言的文本。我需要进行两个主要操作:POS标注和词形还原。我看到在NLTK中有可能选择正确的语言对句子进行分词,如下所示:

tokenizer = nltk.data.load('tokenizers/punkt/PY3/italian.pickle')

我还没有找到在不同语言中设置POS标记和词形还原器的正确方法。我该如何为意大利语、法语、西班牙语或德语等非英语文本设置正确的语料库/字典?我还看到有可能导入“TreeBank”或“WordNet”模块,但我不明白如何使用它们。否则,我在哪里可以找到相应的语料库?
你能给我一些建议或参考资料吗?请注意,我不是NLTK的专家。
非常感谢。
3个回答

11

如果您正在寻找另一个多语言词性标注器,您可能会想尝试 RDRPOSTagger:一个强大、易于使用和语言无关的词性和形态分析标注工具包。在这篇论文中,可以看到13种语言的实验结果,包括性能速度和标注准确性。现在,RDRPOSTagger支持保加利亚语、捷克语、荷兰语、英语、法语、德语、印地语、意大利语、葡萄牙语、西班牙语、瑞典语、泰语和越南语的预训练词性和形态标注模型。RDRPOSTagger还支持40种语言的预训练通用词性标注模型。

在Python中,您可以利用预训练模型对原始未标记的文本语料库进行标记:

python RDRPOSTagger.py tag PATH-TO-PRETRAINED-MODEL PATH-TO-LEXICON PATH-TO-RAW-TEXT-CORPUS

例如:python RDRPOSTagger.py tag ../Models/POS/German.RDR ../Models/POS/German.DICT ../data/GermanRawTest

如果您想使用RDRPOSTagger进行编程,请在pSCRDRTagger包的RDRPOSTagger.py模块中按照代码行92-98进行。以下是一个示例:

r = RDRPOSTagger()
r.constructSCRDRtreeFromRDRfile("../Models/POS/German.RDR") #Load POS tagging model for German
DICT = readDictionary("../Models/POS/German.DICT") #Load a German lexicon 
r.tagRawSentence(DICT, "Die Reaktion des deutschen Außenministers zeige , daß dieser die außerordentlich wichtige Rolle Irans in der islamischen Welt erkenne .")

r = RDRPOSTagger()
r.constructSCRDRtreeFromRDRfile("../Models/POS/French.RDR") # Load POS tagging model for French
DICT = readDictionary("../Models/POS/French.DICT") # Load a French lexicon
r.tagRawSentence(DICT, "Cette annonce a fait l' effet d' une véritable bombe . ")

我正在尝试使用泰语标注器,但它似乎不起作用。它给我返回了一个整个的长字符串作为NCNM。难道它必须接受一串标记而不是字符串吗? - aceminer
是的,在使用标注器之前,您必须执行泰语分词。 - NQD

7

您无法通过传递选项给NLTK的POS标记和词形还原函数来使其处理其他语言。

一种解决方案是为每种语言获取一个训练语料库,并使用NLTK训练自己的POS标记器,然后找出每种语言的基于字典的词形还原解决方案。

但这可能有些过度,因为在意大利语、法语、西班牙语和德语(以及许多其他语言)中已经有了单一的停止解决方案:TreeTagger。它不如英语中的POS标记器和词形还原器先进,但仍然完成得很好。

您需要做的是在系统上安装TreeTagger并能够从Python中调用它。这里是miotto的GitHub repo,可以让您轻松实现。

以下代码段向您展示如何测试您是否正确设置了所有内容。正如您所见,我能够轻松地用一个函数调用进行POS标记和词形还原,无论是用英语还是用法语。

>>> import os
>>> os.environ['TREETAGGER'] = "/opt/treetagger/cmd" # Or wherever you installed TreeTagger
>>> from treetagger import TreeTagger
>>> tt_en = TreeTagger(encoding='utf-8', language='english')
>>> tt_en.tag('Does this thing even work?')
[[u'Does', u'VBZ', u'do'], [u'this', u'DT', u'this'], [u'thing', u'NN', u'thing'], [u'even', u'RB', u'even'], [u'work', u'VB', u'work'], [u'?', u'SENT', u'?']]
>>> tt_fr = TreeTagger(encoding='utf-8', language='french')
>>> tt_fr.tag(u'Mon Dieu, faites que ça marche!')
[[u'Mon', u'DET:POS', u'mon'], [u'Dieu', u'NOM', u'Dieu'], [u',', u'PUN', u','], [u'faites', u'VER:pres', u'faire'], [u'que', u'KON', u'que'], [u'\xe7a', u'PRO:DEM', u'cela'], [u'marche', u'NOM', u'marche'], [u'!', u'SENT', u'!']]

自从这个问题被频繁提出(而且在我的看法中,安装过程不是非常简单直接),我将会写一篇关于此事的博客文章,并在完成后更新这个回答并附上链接。
修改: 以上提到的博客文章在此.

1

我非常喜欢使用SpaCy进行多语言自然语言处理。他们为加泰罗尼亚语、中文、丹麦语、荷兰语、英语、法语德语、希腊语、意大利语、日语、立陶宛语、马其顿语、挪威博克马尔语、波兰语、葡萄牙语、罗马尼亚语、俄语和西班牙语等语言训练了模型。

您只需根据所使用的语言加载不同的模型:

import spacy
nlp_DE = spacy.load("de_core_news_sm")
nlp_FR = spacy.load("fr_core_news_sm")

它的准确度不如Treetagger或Hanovertagger,但它非常易于使用,输出结果可用性比NLTK好得多。


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