Comment puis-je étiqueter et découper du texte français en utilisant NLTK et Python?
j'ai plus de 30 000 articles en français dans un fichier JSON. Je voudrais effectuer une analyse de texte à la fois sur des articles individuels et sur l'ensemble. Avant d'aller plus loin, je commence avec des buts simples:
- Identifier les entités (personnes, lieux, concepts)
- trouver les changements significatifs dans l'importance (~=fréquence) de ces entités au fil du temps (en utilisant le numéro de séquence de l'article comme proxy pour le temps)
les pas que j'ai prises jusqu'à présent:
Importé les données dans une liste python:
import json json_articles=open('articlefile.json') articlelist = json.load(json_articles)
a sélectionné un seul article à tester, et a concaténé le corps du texte en une seule chaîne:
txt = ' '.join(data[10000]['body'])
Chargé d'une phrase française générateur de jetons et de diviser la chaîne en une liste de phrases:
nltk.data.load('tokenizers/punkt/french.pickle') tokens = [french_tokenizer.tokenize(s) for s in sentences]
a tenté de diviser les phrases en mots à l'aide WhiteSpaceTokenizer:
from nltk.tokenize import WhitespaceTokenizer wst = WhitespaceTokenizer() tokens = [wst.tokenize(s) for s in sentences]
C'est là que je suis coincé, pour les raisons suivantes:
- NLTK n'a pas de tokenizer intégré qui peut diviser le français en mots. L'espace blanc ne fonctionne pas bien, notamment en raison du fait qu'il ne se sépare pas correctement sur les apostrophes.
- même si je devais utiliser des expressions régulières pour diviser en mots individuels, il n'y a pas de tagger PoS Français (parties de la parole) que je peux utiliser pour marquer ces mots, et aucun manière de segmenter en unités logiques de sens
Pour l'anglais, je pourrait marquer et découper le texte comme ceci:
tagged = [nltk.pos_tag(token) for token in tokens]
chunks = nltk.batch_ne_chunk(tagged)
Mes options principales (dans l'ordre actuel de préférence) semblent être les suivantes:
- Utiliser NLTK-trainer pour former mes propres tagger et chunker.
- utilisez L'enrubanneur python pour TreeTagger juste pour cette partie, car TreeTagger peut déjà Tagger le français, et quelqu'un a écrit un enrubanneur qui appelle le binaire TreeTagger et analyse les résultats.
- utilisez un outil complètement différent.
Si je devais faire (1), j'imagine que j'aurais besoin de créer mon propre corpus étiqueté. Est-ce exact, ou serait-il possible (et prémédité) d'utiliser la French Treebank?
Si les français Treebank corpus format (exemple ici) n'est pas adapté pour une utilisation avec nltk-formateur, est-il possible de le convertir dans un format?
quelles approches ont les utilisateurs francophones de NLTK pris à l'étiquette de PoS et texte de morceau?
3 réponses
depuis la version 3.1.0 (janvier 2012), le Stanford PoS tagger prend en charge le français.
il devrait être possible d'utiliser ce tagger français en NLTK, en utilisant le Interface de Stanford POS tagger
Je n'ai pas encore essayé cela, mais cela semble plus facile que les autres approches que j'ai considérées, et je devrais être capable de contrôler le pipeline entier à partir d'un script Python. Je vais commenter sur ce post, quand j'ai un résultat de part.
il y a aussi TreeTagger (supporting french corpus) avec un enveloppeur Python. C'est la solution que j'utilise actuellement et il fonctionne très bien.
Voici quelques suggestions:
WhitespaceTokenizer
fait ce qu'il est censé faire. Si vous voulez vous séparer sur apostrophes, essayezWordPunctTokenizer
, vérifiez les autres tokenizers disponibles, ou roulez votre propre avec le tokenizer Regexp ou directement avec lere
module.assurez-vous que vous avez résolu les problèmes d'encodage de texte (unicode ou latin1), sinon la tokenisation va toujours mal tourner.
le nltk vient seulement avec l'anglais tagger, comme vous l'avez découvert. Il semble que L'utilisation de TreeTagger serait le moins de travail, puisqu'il est (presque) prêt à l'emploi.
la formation est également une option pratique. Mais vous ne devriez certainement pas créer votre propre corpus de formation! Utilisez un corpus de français étiqueté existant. Vous obtiendrez de meilleurs résultats si le genre du texte de formation correspond à votre domaine (articles). En outre, vous pouvez utiliser NLTK-trainer, mais vous pouvez également utiliser les fonctionnalités NLTK directement.
vous pouvez utiliser le corpus French Treebank pour la formation, mais je ne sais pas s'il y a un lecteur qui connaît son format exact. Si ce n'est pas le cas, vous devez commencer par XMLCorpusReader et la sous-classe pour fournir une méthode tagged_sents ().
si vous n'êtes pas déjà sur la liste de diffusion NLTK-users, je pense que vous voudrez vous y inscrire.