Python:法语中的NLTK和TextBlob

时间:2017-02-05 23:10:28

标签: 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)

如果我的文字是英文的话,这样可以正常工作,但如果我的文字是法文,那就不再好了。

我无法找到如何使这段代码适应法语,我该怎么做?

是否有可以解析的所有语言的某个列表?

3 个答案:

答案 0 :(得分:2)

默认情况下,NLTK使用英语标记符,对于法语,它将具有奇怪或未定义的行为。

@fpierron是对的。如果您阅读它提到的文章,您只需加载正确的标记化语言模型并在程序中使用它。

import nltk.data
# chargement du tokenizer
tokenizer = nltk.data.load('tokenizers/punkt/PY3/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) 

['Le', 'courage', 'de', 'la', 'goutte', 'd', "'", 'eau', ',', 'c', "'", 'est', 'qu', "'", 'elle', 'ose', 'tomber', 'dans', 'le', 'désert', '.']

如果您没有正确的文件,可以使用" nltk.download()"下载正确的法国模型。

如果你看一下令牌器上的NLTKs网站,还有其他一些例子。 http://www.nltk.org/api/nltk.tokenize.html

答案 1 :(得分:1)

我建议你这篇文章可以解决你的问题:http://blog.fouadhamdi.com/introduction-a-nltk/

答案 2 :(得分:0)

用NLTK从法语句子中提取单词

在带有 Python3 的 WSL2 Ubuntu 下,我可以像这样下载 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]

words 是一个 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

OP 想要使用 nltk.pos_tag。用前面描述的方法是不可能的。

一种方法似乎是安装 Standford Tagger,它已经用 JAVA 编码(在另一个 SO question 中找到)

下载最新版本的 Standford Tagger (Available here)

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

等等!