我有一些法语文本,需要以某种方式处理。为此,我需要:
- 首先,将文本标记为单词
- 然后对这些词进行词形还原以避免多次处理同一个词根
据我所知,NLTK 中的 wordnet lemmatizer 仅适用于英语。当我给它“voudrais”等时,我想要一些可以返回“vouloir”的东西。由于撇号,我也无法正确标记。任何指针将不胜感激。:)
我有一些法语文本,需要以某种方式处理。为此,我需要:
据我所知,NLTK 中的 wordnet lemmatizer 仅适用于英语。当我给它“voudrais”等时,我想要一些可以返回“vouloir”的东西。由于撇号,我也无法正确标记。任何指针将不胜感激。:)
我找到的最好的解决方案是 spacy,它似乎可以完成这项工作
安装:
pip3 install spacy
python3 -m spacy download fr_core_news_md
要使用:
import spacy
nlp = spacy.load('fr_core_news_md')
doc = nlp(u"voudrais non animaux yeux dors couvre.")
for token in doc:
print(token, token.lemma_)
结果:
voudrais vouloir
non non
animaux animal
yeux oeil
dors dor
couvre couvrir
查看文档以获取更多详细信息:https : //spacy.io/models/fr && https://spacy.io/usage
这是 nltk 开发人员的旧但相关的评论。看起来 nltk 中最先进的词干分析器都是英语特定的:
nltk.stem 模块目前包含 3 个词干分析器:Porter 词干分析器、Lancaster 词干分析器和基于正则表达式的词干分析器。Porter 词干分析器和 Lancaster 词干分析器都是英语特定的。可以自定义基于正则表达式的词干分析器以使用您希望的任何正则表达式。因此,您应该能够使用 regexp 词干分析器为非英语语言编写一个简单的词干分析器。例如,对于法语:
from nltk import stem stemmer = stem.Regexp('s$|es$|era$|erez$|ions$| <etc> ')
但是您需要自己提出特定于语言的正则表达式。对于更高级的词干分析器,可能需要添加一个新模块。(这可能是一个很好的学生项目。)
有关正则表达式词干分析器的更多信息:
http://nltk.org/doc/api/nltk.stem.regexp.Regexp-class.html
-爱德华
注意:他提供的链接已失效,请参阅此处以获取当前的 regexstemmer 文档。
不过,最近添加的雪球词干分析器似乎能够阻止法语。让我们来测试一下:
>>> from nltk.stem.snowball import FrenchStemmer
>>> stemmer = FrenchStemmer()
>>> stemmer.stem('voudrais')
u'voudr'
>>> stemmer.stem('animaux')
u'animal'
>>> stemmer.stem('yeux')
u'yeux'
>>> stemmer.stem('dors')
u'dor'
>>> stemmer.stem('couvre')
u'couvr'
如您所见,有些结果有点可疑。
不是你所希望的,但我想这是一个开始。
也许与 TreeTagger ?我没试过,但这个应用程序可以在法语中运行
http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/
http://txm.sourceforge.net/installtreetagger_fr.html
如果您在文本上执行机器学习算法,您可以使用 n-gram 代替单词标记。它不是严格的词形还原,但它可以检测到一系列 n 个相似的字母,并且收集具有相同含义的单词非常强大。
我使用 sklearn 的功能CountVectorizer(analyzer='char_wb')
,对于某些特定的文本,它比词袋更有效。
如果你在一家法国银行做文本挖掘项目,我推荐使用cltk包。
install cltk
from cltk.lemmatize.french.lemma import LemmaReplacer
更多细节在cltk