web-dev-qa-db-fra.com

Utilisation de PunktSentenceTokenizer dans NLTK

J'apprends le traitement du langage naturel en utilisant NLTK. Je suis tombé sur le code en utilisant PunktSentenceTokenizer dont je ne comprends pas l'utilisation réelle dans le code donné. Le code est donné:

import nltk
from nltk.corpus import state_union
from nltk.tokenize import PunktSentenceTokenizer

train_text = state_union.raw("2005-GWBush.txt")
sample_text = state_union.raw("2006-GWBush.txt")

custom_sent_tokenizer = PunktSentenceTokenizer(train_text) #A

tokenized = custom_sent_tokenizer.tokenize(sample_text)   #B

def process_content():
try:
    for i in tokenized[:5]:
        words = nltk.Word_tokenize(i)
        tagged = nltk.pos_tag(words)
        print(tagged)

except Exception as e:
    print(str(e))


process_content()

Alors, pourquoi utilisons-nous PunktSentenceTokenizer. Et ce qui se passe dans la ligne marquée A et B. Je veux dire qu'il y a un texte d'apprentissage et l'autre un exemple de texte, mais quel est le besoin de deux ensembles de données pour obtenir le balisage Part of Speech.

La ligne marquée comme A et B est ce que je ne peux pas comprendre.

PS: J'ai essayé de regarder dans le livre NLTK mais je n'ai pas pu comprendre quelle est la véritable utilisation de PunktSentenceTokenizer

27
arqam

PunktSentenceTokenizer est la classe abstraite du tokenizer de phrase par défaut, c'est-à-dire sent_tokenize(), fournie en NLTK. Il s'agit d'une implémentation de Détection de limites de phrases multilingues non supervisées (Kiss et Strunk (2005) . Voir https://github.com/nltk/nltk/blob/develop/nltk/tokenize/ init . py # L79

Étant donné un paragraphe avec plusieurs phrases, par exemple:

>>> from nltk.corpus import state_union
>>> train_text = state_union.raw("2005-GWBush.txt").split('\n')
>>> train_text[11]
u'Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all. This evening I will set forth policies to advance that ideal at home and around the world. '

Vous pouvez utiliser la sent_tokenize():

>>> sent_tokenize(train_text[11])
[u'Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all.', u'This evening I will set forth policies to advance that ideal at home and around the world. ']
>>> for sent in sent_tokenize(train_text[11]):
...     print sent
...     print '--------'
... 
Two weeks ago, I stood on the steps of this Capitol and renewed the commitment of our nation to the guiding ideal of liberty for all.
--------
This evening I will set forth policies to advance that ideal at home and around the world. 
--------

La sent_tokenize() utilise un modèle pré-formé de nltk_data/tokenizers/punkt/english.pickle. Vous pouvez également spécifier d'autres langues, la liste des langues disponibles avec des modèles pré-formés en NLTK sont:

alvas@ubi:~/nltk_data/tokenizers/punkt$ ls
czech.pickle     finnish.pickle  norwegian.pickle   slovene.pickle
danish.pickle    french.pickle   polish.pickle      spanish.pickle
dutch.pickle     german.pickle   portuguese.pickle  swedish.pickle
english.pickle   greek.pickle    PY3                turkish.pickle
estonian.pickle  italian.pickle  README

Étant donné un texte dans une autre langue, procédez comme suit:

>>> german_text = u"Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter. Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. "

>>> for sent in sent_tokenize(german_text, language='german'):
...     print sent
...     print '---------'
... 
Die Orgellandschaft Südniedersachsen umfasst das Gebiet der Landkreise Goslar, Göttingen, Hameln-Pyrmont, Hildesheim, Holzminden, Northeim und Osterode am Harz sowie die Stadt Salzgitter.
---------
Über 70 historische Orgeln vom 17. bis 19. Jahrhundert sind in der südniedersächsischen Orgellandschaft vollständig oder in Teilen erhalten. 
---------

Pour former votre propre modèle punkt, voir https://github.com/nltk/nltk/blob/develop/nltk/tokenize/punkt.py et format de données de formation pour nltk punkt

24
alvas

PunktSentenceTokenizer est un algorithme de détection de limites de phrase qui doit être formé pour être utilisé [1]. NLTK comprend déjà une version pré-formée du PunktSentenceTokenizer.

Donc, si vous utilisez initialiser le tokenizer sans aucun argument, il prendra par défaut la version pré-formée:

In [1]: import nltk
In [2]: tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
In [3]: txt = """ This is one sentence. This is another sentence."""
In [4]: tokenizer.tokenize(txt)
Out[4]: [' This is one sentence.', 'This is another sentence.']

Vous pouvez également fournir vos propres données d'entraînement pour entraîner le tokenizer avant de l'utiliser. Le tokenizer Punkt utilise un algorithme non supervisé, ce qui signifie que vous l'entraînez simplement avec du texte normal.

custom_sent_tokenizer = PunktSentenceTokenizer(train_text)

Pour la plupart des cas, il est tout à fait correct d'utiliser la version pré-formée. Vous pouvez donc simplement initialiser le tokenizer sans fournir d'arguments.

Alors "qu'est-ce que tout cela a à voir avec le marquage POS"? Le tagueur NLTK POS fonctionne avec des phrases à jetons, vous devez donc diviser votre texte en phrases et en jetons Word avant de pouvoir étiqueter POS.

documentation de NLTK.

[1] Kiss and Strunk, " Détection de limites de phrase multilingue non supervisée "

13
CentAu

Vous pouvez vous référer au lien ci-dessous pour obtenir plus d'informations sur l'utilisation de PunktSentenceTokenizer. Cela explique clairement pourquoi PunktSentenceTokenizer est utilisé à la place de sent-tokenize () en ce qui concerne votre cas.

http://nlpforhackers.io/splitting-text-into-sentences/

1
Ranjeet Singh
def process_content(corpus):

    tokenized = PunktSentenceTokenizer().tokenize(corpus)

    try:
        for sent in tokenized:
            words = nltk.Word_tokenize(sent)
            tagged = nltk.pos_tag(words)
            print(tagged)
    except Exception as e:
        print(str(e))

process_content(train_text)

Sans même l'entraîner sur d'autres données textuelles, il fonctionne de la même manière qu'il est pré-formé.

0
ashirwad