Python: NLTK и TextBlob на французском языке

Я использую NLTK и TextBlob для поиска существительных и словосочетаний в тексте:

from textblob import TextBlob 
import nltk

blob = TextBlob(text)
print(blob.noun_phrases)
tokenized = nltk.word_tokenize(text)
nouns = [word for (word, pos) in nltk.pos_tag(tokenized) if is_noun(pos)]
print(nouns)

Это отлично работает, если мой текст на английском языке, но уже не очень хорошо, если мой текст на французском языке.

Я не смог найти, как адаптировать этот код для французского языка, как мне это сделать?

И есть ли где-нибудь список всех языков, которые можно разобрать?


person Sulli    schedule 05.02.2017    source источник
comment
У вас есть два отдельных фрагмента кода. Один использует TextBlob (строки 1 и 2). Другой использует nltk (строки 3-5). Какой из них не работает?   -  person DYZ    schedule 06.02.2017
comment
@DYZ оба работают с английским текстом, но оба не работают с французским текстом. С французским текстом Textblob сообщает о словосочетаниях с существительными, которые на самом деле не являются словосочетаниями, а nltk сообщает о словах, которые не являются существительными.   -  person Sulli    schedule 06.02.2017


Ответы (2)


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

@fpierron прав. Если вы прочитали упомянутую статью, вам просто нужно загрузить правильную языковую модель токенизатора и использовать ее в своей программе.

import nltk.data
#chargement du tokenizer
tokenizer = nltk.data.load('tokenizers/punkt/french.pickle')
tokens = tokenizer.tokenize("Jadis, une nuit, je fus un papillon, voltigeant, content de son sort. Puis, je m’éveillai, étant Tchouang-tseu. Qui suis-je en réalité ? Un papillon qui rêve qu’il est Tchouang-tseu ou Tchouang qui s’imagine qu’il fut papillon ?")

print(tokens) 

['Jadis, une nuit, je fus un papillon, voltigeant, content de son sort.', 'Puis, je m’éveillai, étant Tchouang-tseu.', 'Qui suis-je en réalité ?', 'Un papillon qui rêve qu’il est Tchouang-tseu ou Tchouang qui s’imagine qu’il fut papillon ?']

Если у вас нет правильного файла, вы можете использовать nltk.download(), чтобы загрузить правильную модель для французского языка.

если вы посмотрите на сайт NLTKs на токенизаторе, там есть и другие примеры. http://www.nltk.org/api/nltk.tokenize.html

person Nathan McCoy    schedule 06.03.2017
comment
Токены, которые вы показываете, не относятся к предложению: вы используете два разных предложения Jadis je fus un papillon voltigeant... и Le мужество de la goutte d'eau c'est... - person titus; 11.04.2018
comment
Я думаю, что этот токенизатор только разделяет предложения, а не извлекает слова. - person Be Chiller Too; 05.09.2019
comment
@ Натан, правильный путь — «tokenizers/punkt/french.pickle», он не работает, когда я добавил «PY3». - person Belkacem Thiziri; 19.01.2021

Извлечь слова из французского предложения с помощью NLTK

Под WSL2 Ubuntu с Python3 я могу скачать Punkt следующим образом:

import nltk
nltk.download('punkt')

Zip-архив был загружен по адресу:

/home/my_username/nltk_data/tokenizers/punkt.zip

Как только он будет распакован, у вас будет много языков, сохраненных как сериализованный объект Pickle.

Теперь с:

tokenizer = nltk.data.load('path/to/punkt_folder/french.pickle')

Вы можете использовать метод tokenizer._tokenize_words:

words_generator = tokenizer._tokenize_words("Depuis huit jours, j'avais déchiré mes bottines Aux cailloux des chemins. J'entrais à Charleroi. - Au Cabaret-Vert : je demandai des tartines De beurre et du jambon qui fût à moitié froid.")
words = [word for word in words_generator]

слова — это список из PunktToken объектов:

>>> words
[PunktToken('Depuis', type='depuis', linestart=True), PunktToken('huit', ), PunktToken('jours', ),... PunktToken('à', ), PunktToken('moitié', ), PunktToken('froid.', )]
>>> str_words = [str(w) for w in words]
>>> str_words
['Depuis', 'huit', 'jours', ',', 'j', "'avais", 'déchiré', 'mes', 'bottines', 'Aux', 'cailloux', 'des', 'chemins.', 'J', "'entrais", 'à', 'Charleroi.', '-', 'Au', 'Cabaret-Vert', ':', 'je', 'demandai', 'des', 'tartines', 'De', 'beurre', 'et', 'du', 'jambon', 'qui', 'fût', 'à', 'moitié', 'froid.']

Используйте nltk.pos_tag с французскими предложениями

ОП хочет использовать nltk.pos_tag. Это невозможно с помощью метода, описанного ранее.

Кажется, можно установить Standford Tagger, который был закодирован в JAVA (найден в этом другом SO question )

Загрузите последнюю версию Standford Tagger (доступна здесь)

> wget https://nlp.stanford.edu/software/stanford-tagger-4.2.0.zip

После распаковки у вас есть папка, которая выглядит так (OP спросит список доступных языков):

...
├── data
│   ....
├── models
    ...
│   ├── arabic-train.tagger
│   ├── arabic-train.tagger.props
│   ├── arabic.tagger
│   ├── arabic.tagger.props
│   ├── chinese-distsim.tagger
│   ├── chinese-distsim.tagger.props
│   ├── chinese-nodistsim.tagger
│   ├── chinese-nodistsim.tagger.props
│   ├── english-bidirectional-distsim.tagger
│   ├── english-bidirectional-distsim.tagger.props
│   ├── english-caseless-left3words-distsim.tagger
│   ├── english-caseless-left3words-distsim.tagger.props
│   ├── english-left3words-distsim.tagger
│   ├── english-left3words-distsim.tagger.props
│   ├── french-ud.tagger
│   ├── french-ud.tagger.props
│   ├── german-ud.tagger
│   ├── german-ud.tagger.props
│   ├── spanish-ud.tagger
│   └── spanish-ud.tagger.props
─ french-ud.tagger.props
    ...
├── stanford-postagger-4.2.0.jar
...

Java должна быть установлена, и вы должны знать, где. Теперь вы можете сделать:

import os

from nltk.tag import StanfordPOSTagger
from textblob import TextBlob

jar = 'path/to/stanford-postagger-full-2020-11-17/stanford-postagger.jar'
model = 'path/to/stanford-postagger-full-2020-11-17/models/french-ud.tagger'
os.environ['JAVAHOME'] = '/path/to/java'

blob = TextBlob("""
    Depuis huit jours, j'avais déchiré mes bottines Aux cailloux des chemins. J'entrais à Charleroi. - Au Cabaret-Vert : je demandai des tartines De beurre et du jambon qui fût à moitié froid.
""")

pos_tagger = StanfordPOSTagger(model, jar, encoding='utf8' )
res = pos_tagger.tag(blob.split())
print(res)

Он будет отображать:

[('Depuis', 'ADP'), ('huit', 'NUM'), ('jours,', 'NOUN'), ("j'avais", 'ADJ'), ('déchiré', 'VERB'), ('mes', 'DET'), ('bottines', 'NOUN'), ('Aux', 'PROPN'), ('cailloux', 'VERB'), ('des', 'DET'), ('chemins.', 'NOUN'), ("J'entrais", 'ADJ'), ('à', 'ADP'), ('Charleroi.', 'PROPN'), ('-', 'PUNCT'), ('Au', 'PROPN'), ('Cabaret-Vert', 'PROPN'), (':', 'PUNCT'), ('je', 'PRON'), ('demandai', 'VERB'), ('des', 'DET'), ('tartines', 'NOUN'), ('De', 'ADP'), ('beurre', 'NOUN'), ('et', 'CCONJ'), ('du', 'DET'), ('jambon', 'NOUN'), ('qui', 'PRON'), ('fût', 'AUX'), ('à', 'ADP'), ('moitié', 'NOUN'), ('froid.', 'ADJ')]

И вуаля !

person snoob dogg    schedule 16.04.2021