python - stopwords - Uso de PunktSentenceTokenizer en NLTK
nltk stopwords (3)
Estoy aprendiendo el procesamiento del lenguaje natural usando NLTK. Encontré el código usando PunktSentenceTokenizer
cuyo uso real no puedo entender en el código dado. El código se da:
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()
Entonces, ¿por qué usamos PunktSentenceTokenizer? Y lo que está sucediendo en la línea marcada con A y B. Quiero decir que hay un texto de entrenamiento y el otro un texto de muestra, pero ¿cuál es la necesidad de que dos conjuntos de datos obtengan el etiquetado Parte de voz?
La línea marcada como A
y B
es la que no puedo entender.
PD: Intenté buscar en el libro de NLTK pero no pude entender cuál es el uso real de PunktSentenceTokenizer
Puede consultar el siguiente enlace para obtener más información sobre el uso de PunktSentenceTokenizer. Explica claramente por qué se usa PunktSentenceTokenizer en lugar de sent-tokenize () con respecto a su caso.
PunktSentenceTokenizer
es la clase abstracta para el tokenizador de oraciones predeterminado, es decir, sent_tokenize()
, proporcionado en NLTK. Es una implementación de la Detección de límites de oraciones multilingües no supervisadas (Kiss and Strunk (2005) . Consulte https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init.py#L79
Dado un párrafo con oración múltiple, por ejemplo:
>>> 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. ''
Puedes usar el 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.
--------
sent_tokenize()
usa un modelo pre-entrenado de nltk_data/tokenizers/punkt/english.pickle
. También puede especificar otros idiomas, la lista de idiomas disponibles con modelos pre-entrenados en NLTK son:
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
Dado un texto en otro idioma, haz esto:
>>> 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.
---------
Para entrenar su propio modelo punkt, consulte https://github.com/nltk/nltk/blob/develop/nltk/tokenize/punkt.py y el formato de datos de entrenamiento para nltk punkt
PunktSentenceTokenizer
es un algoritmo de detección de límites de oraciones que debe ser entrenado para ser utilizado [1]. NLTK ya incluye una versión pre-entrenada del PunktSentenceTokenizer.
Entonces, si usa inicializar el tokenizador sin ningún argumento, se establecerá de forma predeterminada la versión pre-entrenada:
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.'']
También puede proporcionar sus propios datos de entrenamiento para entrenar el tokenizador antes de usarlo. El tokenizer de Punkt utiliza un algoritmo no supervisado, lo que significa que simplemente lo entrenas con texto regular.
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)
Para la mayoría de los casos, es totalmente correcto usar la versión pre-entrenada. Por lo tanto, simplemente puede inicializar el tokenizador sin proporcionar ningún argumento.
Entonces, "¿qué tiene que ver todo esto con el etiquetado de POS"? El etiquetador POS NLTK funciona con oraciones con tokens, por lo que debe dividir el texto en oraciones y tokens de palabras antes de poder etiquetar POS.
[1] Kiss and Strunk, " Detección de límites de frases multilingües sin supervisión "