Подтвердить что ты не робот

Лемматизировать французский текст

У меня есть текст на французском языке, который мне нужно обрабатывать в некотором роде. Для этого мне нужно:

  • Сначала выделите текст в слова
  • Затем леммитизируйте эти слова, чтобы избежать обработки одного и того же корня более одного раза

Насколько я вижу, wordnet lemmatizer в NLTK работает только с английским. Я хочу что-то, что может вернуть "vouloir", когда я даю ему "voudrais" и так далее. Я также не могу точно обозначить из-за апострофов. Любые указатели будут очень благодарны.:)

4b9b3361

Ответ 1

Здесь старый, но актуальный комментарий от nltk dev. Похоже, что большинство продвинутых стеммеров в nltk относятся только к английскому:

В настоящее время модуль nltk.stem содержит 3 стеммера: Портер стеммер, ланкастерский стеммер и регулярное выражение на основе парадигматический. Стеммер Портер и Ланкастер стеммер оба English- конкретный. Стеммер на основе регулярных выражений может быть настроен на используйте любое регулярное выражение, какое пожелаете. Таким образом, вы должны быть в состоянии написать простой стеммер для неанглийских языков с использованием регулярного выражения Например, для французского:

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

Но вам нужно придумать регулярный язык Выражение себя. Для более продвинутого стеммера это, вероятно, необходимо добавить новый модуль. (Это может быть хорошим учеником проект.)

Для получения дополнительной информации о регулярном выражении:

http://nltk.org/doc/api/nltk.stem.regexp.Regexp-class.html

-Edward

Примечание. Ссылка, которую он дает, устарела, см. здесь для ознакомления с текущей документацией по регулярным выражениям.

Похоже, что недавно добавленный снежный ком способен остановить французский. Пусть проверят:

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

Как видите, некоторые результаты немного сомнительны.

Не совсем то, на что вы надеялись, но я думаю, это начало.

Ответ 2

Лучшее решение, которое я нашел, - это простота, похоже, она справляется со своей задачей

Для установки:

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

Ответ 4

Если вы выполняете алгоритмы машинного обучения для своего текста, вы можете использовать n-граммы вместо слов-токенов. Это не строго лемматизация, но она обнаруживает серии из n одинаковых букв, и удивительно мощно собирать слова с одинаковым значением.

Я использую склеарную функцию CountVectorizer(analyzer='char_wb') и для некоторого конкретного текста это намного эффективнее, чем мешок слов.

Ответ 5

Если вы работаете над проектом текстового майнинга во французском банке, я рекомендую пакет cltk.

install cltk from cltk.lemmatize.french.lemma import LemmaReplacer

больше деталей в cltk

Ответ 6

Вы пробовали Леттрию? Это НЛП специализируется на французском языке. https://lettria.com/demo