I am learning Natural Language Processing using NLTK. I came across the code using PunktSentenceTokenizer
whose actual use I cannot understand in the given code. The code is given :
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()
So, why do we use PunktSentenceTokenizer. And what is going on in the line marked A and B. I mean there is a training text and the other a sample text, but what is the need for two data sets to get the Part of Speech tagging.
Line marked as A
and B
is which I am not able to understand.
PS : I did try to look in the NLTK book but could not understand what is the real use of PunktSentenceTokenizer
This tokenizer divides a text into a list of sentences by using an unsupervised algorithm to build a model for abbreviation words, collocations, and words that start sentences. It must be trained on a large collection of plaintext in the target language before it can be used.
word_tokenize is a function in Python that splits a given sentence into words using the NLTK library. Figure 1 below shows the tokenization of sentence into words. Figure 1: Splitting of a sentence into words. In Python, we can tokenize with the help of the Natural Language Toolkit ( NLTK ) library.
NLTK contains a module called tokenize() which further classifies into two sub-categories: Word tokenize: We use the word_tokenize() method to split a sentence into tokens or words. Sentence tokenize: We use the sent_tokenize() method to split a document or paragraph into sentences.
It doesn't require training text and can tokenize straightaway. But it is not much helpful if the text to be tokenized is very different and uncommon. The tokenization may not be perfect. In that case, 'PunktSentenceTokenizer' is a better option.
PunktSentenceTokenizer
is the abstract class for the default sentence tokenizer, i.e. sent_tokenize()
, provided in NLTK. It is an implmentation of Unsupervised Multilingual Sentence Boundary Detection (Kiss and Strunk (2005). See https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init.py#L79
Given a paragraph with multiple sentence, e.g:
>>> 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. '
You can use the 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. --------
The sent_tokenize()
uses a pre-trained model from nltk_data/tokenizers/punkt/english.pickle
. You can also specify other languages, the list of available languages with pre-trained models in NLTK are:
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
Given a text in another language, do this:
>>> 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. ---------
To train your own punkt model, see https://github.com/nltk/nltk/blob/develop/nltk/tokenize/punkt.py and training data format for nltk punkt
PunktSentenceTokenizer
is an sentence boundary detection algorithm that must be trained to be used [1]. NLTK already includes a pre-trained version of the PunktSentenceTokenizer.
So if you use initialize the tokenizer without any arguments, it will default to the pre-trained version:
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.']
You can also provide your own training data to train the tokenizer before using it. Punkt tokenizer uses an unsupervised algorithm, meaning you just train it with regular text.
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)
For most of the cases, it is totally fine to use the pre-trained version. So you can simply initialize the tokenizer without providing any arguments.
So "what all this has to do with POS tagging"? The NLTK POS tagger works with tokenized sentences, so you need to break your text into sentences and word tokens before you can POS tag.
NLTK's documentation.
[1] Kiss and Strunk, " Unsupervised Multilingual Sentence Boundary Detection"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With