Comment modifier la NLTK phrase tokenizer
Je suis en utilisant NLTK pour analyser quelques textes classiques et je suis en cours d'exécution pour la difficulté à la segmentation du texte en une phrase. Par exemple, voici ce que je reçois pour un extrait de Moby Dick:
import nltk
sent_tokenize = nltk.data.load('tokenizers/punkt/english.pickle')
'''
(Chapter 16)
A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but
that's a rather cold and clammy reception in the winter time, ain't it, Mrs. Hussey?"
'''
sample = 'A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs. Hussey?"'
print "\n-----\n".join(sent_tokenize.tokenize(sample))
'''
OUTPUT
"A clam for supper?
-----
a cold clam; is THAT what you mean, Mrs.
-----
Hussey?
-----
" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs.
-----
Hussey?
-----
"
'''
Je ne pas attendre à la perfection ici, considérant que la nouvelle de Melville syntaxe est un peu daté, mais NLTK devrait être capable de gérer le terminal des guillemets, et des titres comme "Madame" Depuis le tokenizer est le résultat de l'apprentissage non supervisé algo, cependant, je ne peux pas comprendre comment bricoler avec elle.
Quelqu'un a des recommandations pour une meilleure phrase générateur de jetons? Je préfère une simple heuristique que je peux pirater plutôt que d'avoir à former mon propre analyseur.
Vous devez vous connecter pour publier un commentaire.
Vous devez fournir une liste des abréviations pour le tokenizer, comme suit:
phrases est maintenant:
Mise à jour: Cela ne fonctionne pas si le dernier mot de la phrase a une apostrophe ou guillemet attachés (comme Hussey?'). Ainsi, une rapide et sale moyen de contourner cela est de placer des espaces devant les apostrophes et les guillemets qui suivent phrase-symboles de fin de (.!?):
span_tokenize
méthode . La solution de contournement proposée changements de l'origine des décalages.Vous pouvez modifier le NLTK de la pré-formation des phrases en anglais générateur de jetons de reconnaître plus d'abréviations en les ajoutant à l'ensemble
_params.abbrev_types
. Par exemple:Noter que les abréviations doivent être spécifiées sans la dernière période, mais n'incluent les périodes, comme dans
'i.e'
ci-dessus. Pour plus de détails sur les autres tokenizer paramètres, reportez-vous à la documentation pertinente.sentence_tokenizer.tokenize(text)
Vous pouvez dire à l'
PunktSentenceTokenizer.tokenize
méthode pour inclure le "terminal" entre guillemets doubles avec le reste de la phrase par le réglage de larealign_boundaries
paramètreTrue
. Voir le code ci-dessous pour un exemple.Je ne sais pas un moyen propre à empêcher que le texte comme
Mrs. Hussey
est divisée en deux phrases. Cependant, voici un hack quiMrs. Hussey
àMrs._Hussey
,sent_tokenize.tokenize
,Mrs._Hussey
retour àMrs. Hussey
Je souhaite que je connaissais une meilleure façon, mais cela peut fonctionner dans un pincement.
rendements
Donc j'ai eu un problème similaire et essayé vpekar la solution ci-dessus.
Peut-être la mienne est une sorte de cas limite, mais j'ai observé le même comportement après l'application de l'remplacements, cependant, quand j'ai essayé de remplacer la ponctuation avec les citations placées devant eux, j'ai eu la sortie que je cherchais. Sans doute le manque d'adhésion à la LBA est moins importante que la conservation de l'original de la citation comme une seule phrase.
Pour être plus clair:
Si MLA est important cependant, vous pouvez toujours revenir en arrière et d'annuler ces changements à chaque fois qu'il le faut.