将法语文本进行词形还原

30

我有一些用法语写的文本需要进行处理。为此,我需要:

  • 首先,将文本分词成单词
  • 然后对这些单词进行词形还原,以避免处理相同的词根多次出现

就我所知,NLTK 中的 WordNet 词形还原器只适用于英语。我希望能找到一个可以在输入“voudrais”时返回“vouloir”等结果的工具。同时,由于使用了撇号,我也无法正确地进行分词。若有任何指导意见,请不吝赐教。 :)

5个回答

26
我发现最好的解决方案是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


19

这里有一位nltk开发者的旧评论,虽然时间比较久远但仍有参考价值。看起来nltk中大多数先进的词干提取器都是针对英语的:

nltk.stem模块目前包含三种词干提取器:Porter词干提取器、Lancaster词干提取器和基于正则表达式的词干提取器。Porter词干提取器和Lancaster词干提取器都是专门为英语设计的。基于正则表达式的词干提取器可以按照您的意愿自定义使用任何正则表达式。因此,您应该能够使用正则表达式词干提取器编写非英语语言的简单词干提取器。例如,对于法语:

from nltk import stem
stemmer = stem.Regexp('s$|es$|era$|erez$|ions$| <etc> ')

但是你需要自己想出特定语言的正则表达式。对于更高级的词干提取器,可能需要添加新模块。(这可能是一个不错的学生项目。)

有关正则表达式词干提取器的更多信息:

http://www.nltk.org/api/nltk.stem.html#module-nltk.stem.regexp

- Edward

注意:他给出的链接已经失效,可以在这里找到当前的RegexStemmer文档。

最近添加的Snowball词干提取器似乎能够提取法语。让我们来测试一下:

>>> 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'

正如你所看到的,有些结果可能有点可疑。

虽然不完全符合你的期望,但我想这是一个开始。


是的,没有非英语语言的词干提取器让人失望。实际上,我所做的是将单词标记化为标点符号,然后删除所有剩余的单字文章(例如“l'ensemble”中剩余的l)。然后,我使用了单词和相应词形还原的列表,特别是在http://www.limsi.fr/Individu/anne/OLDlexique.txt托管的那个列表,这也被几篇帖子所引用,它起到了作用。Snowball词干提取器看起来也很有效,谢谢Junuxx。 :) - yelsayed
我的法语不太好,但我不清楚你在这里期望什么。据我所知,它正在对单词进行词干提取;它并没有执行词形还原,这是一项不同的任务。也就是说,它返回的是词干,而不是你在字典中找到的形式(因此动词上缺少不定式后缀)。这是有意为之的;这就是词干提取器的作用。 - Mike Maxwell
是的,这是一个很好的区分。尽管如此,我认为anima比animaux更合理,vou比voudrais更合理。像yeux这样完全不规则的复数形式很棘手;我想我们必须勉强接受它作为一个词干。 - Junuxx

2

1
天啊,Treetagger 给出无监督的词形还原,如果可能的话,我建议远离它。 - alvas
请问如何使用treetagger对单词进行词干提取?根据我的理解,treetagger只能对单词进行词性标注。 - sel

1
如果你正在法国银行进行文本挖掘项目,我建议使用cltk包。 安装cltk from cltk.lemmatize.french.lemma import LemmaReplacer 更多细节请参见cltk

3
CLTK似乎只适用于14世纪之前的法语,是这样吗?我有没有误读它的文档?自那时以来,法语的拼写肯定已经改变了一些,对吧?而且也有新词汇吗?比如臭名昭著的“周末”… - Mike Maxwell
没错,它是用法语写的,但是是为了古法语而写的。(这里是CLTK的贡献者)。 - clemsciences

1
如果您正在对文本执行机器学习算法,可以使用n-gram而不是单词标记。它不严格符合词形还原,但它检测到一系列相似的n个字母,并且以惊人的能力收集具有相同含义的单词。
我使用sklearn的函数CountVectorizer(analyzer ='char_wb'),对于某些特定的文本,它比词袋模型更有效。

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