Nltk: Le tokenizer de phrase ne se divise pas correctement

Créé le 23 nov. 2015  ·  5Commentaires  ·  Source: nltk/nltk

Je pense qu'il y a un bogue dans le tokenizer de phrase standard sent_tokenize . Le problème est qu'il ne divise pas le texte en phrases dans certains cas. Voici ce cas, où le tokenizer ne parvient pas à diviser le texte en deux phrases :

[sent for sent in nltk.sent_tokenize('Model wears size S. Fits size.')]

Cela renvoie ['Model wears size S. Fits size.'] , au lieu de ['Model wears size S.', 'Fits size.'] . Le problème semble apparaître, lorsque la dernière chaîne avant . ne contient qu'un seul caractère. Si le nombre de caractères est de >= 2 , alors il divise correctement le texte.

inactive tokenizer

Commentaire le plus utile

Je veux juste ajouter un exemple du monde réel de BookCorpus , extrait de "Three Plays", publié par Mike Suttons sur Smashwords.

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

Sortir

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

Il a confirmé que nltk ne reconnaissait pas k. comme séparateur de phrases.

Tous les 5 commentaires

Cela semble très difficile à corriger dans le tokenizer de phrase si vous considérez que S. Fits peut être le prénom et le nom d'une personne.

Je pense que la voie à suivre est de sous-classer ou de copier-coller le tokenizer de phrase NLTK par défaut et de le modifier pour l'adapter à votre application. Par exemple, si vous n'attendez pas de tels noms de personnes dans le texte, supprimez les règles qui gèrent les noms de personnes. Une autre option consiste à utiliser une solution de contournement telle que remplacer size <X> par size_<X> avant la tokenisation et les remplacer à nouveau après la division du texte en phrases.

Hmmm. Je viens de réessayer. Donc, le premier cas que j'ai présenté n'est pas le fractionnement correctement. Mais si j'utilise des caractères différents, il se sépare

import nltk
import pprint

pp = pprint.PrettyPrinter(indent=4)
s = 'Test {}. Test {}.'
[nltk.sent_tokenize(s.format(char, char)) for char in 'abcdefghijklmnopqrstuvwxyz']
[pp.pprint(nltk.sent_tokenize(s.format(char, char))) for char in 'abcdefghijklmnopqrstuvwxyz']

Sortir:

['Test a.', 'Test a.']
['Test b.', 'Test b.']
['Test c. Test c.']
['Test d. Test d.']
['Test e. Test e.']
['Test f. Test f.']
['Test g. Test g.']
['Test h. Test h.']
['Test i.', 'Test i.']
['Test j.', 'Test j.']
['Test k. Test k.']
['Test l. Test l.']
['Test m. Test m.']
['Test n. Test n.']
['Test o.', 'Test o.']
['Test p. Test p.']
['Test q.', 'Test q.']
['Test r. Test r.']
['Test s. Test s.']
['Test t. Test t.']
['Test u.', 'Test u.']
['Test v. Test v.']
['Test w. Test w.']
['Test x.', 'Test x.']
['Test y.', 'Test y.']
['Test z.', 'Test z.']

@kmike , comme vous pouvez le voir, c'est très incohérent.

@JernejJerin Ce n'est pas un tokenizer basé sur des règles, il ne serait donc pas en mesure de contrôler/expliquer les "règles" de fractionnement à l'aide d'une explication de type regex.

L'algorithme utilisé pour entraîner le sent_tokenizer est l' algorithme punkt de Kiss et Strunk (2006) . C'est un système statistique qui essaie d'apprendre la limite de la phrase, donc ce n'est pas parfait mais c'est cohérent avec les probabilités générées à partir du modèle (mais pas nécessairement les règles humaines).

Je veux juste ajouter un exemple du monde réel de BookCorpus , extrait de "Three Plays", publié par Mike Suttons sur Smashwords.

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

Sortir

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

Il a confirmé que nltk ne reconnaissait pas k. comme séparateur de phrases.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

goodmami picture goodmami  ·  4Commentaires

alvations picture alvations  ·  4Commentaires

Chris00 picture Chris00  ·  3Commentaires

chaseireland picture chaseireland  ·  3Commentaires

BLKSerene picture BLKSerene  ·  4Commentaires