Использование PunktSentenceTokenizer в NLTK

Я изучаю обработку естественного языка с использованием NLTK. Я натолкнулся на код, используя PunktSentenceTokenizer, фактическое использование которого я не могу понять в данном коде. Код указан:

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()

Итак, почему мы используем PunktSentenceTokenizer. И что происходит в строке с надписью A и B. Я имею в виду, что есть учебный текст, а другой - образец текста, но зачем нужны два набора данных для получения тега части речи.

Линия, отмеченная как A и B, я не могу понять.

PS: Я попытался посмотреть в книге NLTK, но не мог понять, что представляет собой реальное использование PunktSentenceTokenizer

Ответы

Ответ 1

PunktSentenceTokenizer - это абстрактный класс для токенизатора предложения по умолчанию, т.е. sent_tokenize(), предоставленный в NLTK. Это приведение Неконтролируемое многоязычное предложение Обнаружение границ (Kiss and Strunk (2005). См. https://github.com/nltk/nltk/blob/develop/nltk/tokenize/ INIT.py # L79

Учитывая абзац с несколькими предложениями, например:

>>> 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. '

Вы можете использовать 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() использует предварительно подготовленную модель от nltk_data/tokenizers/punkt/english.pickle. Вы также можете указать другие языки, список доступных языков с предварительно обученными моделями в NLTK:

[email protected]:~/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

С учетом текста на другом языке сделайте следующее:

>>> 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. 
---------

Чтобы обучить свою собственную модель punkt, см. https://github.com/nltk/nltk/blob/develop/nltk/tokenize/punkt.py и формат данных обучения для nltk punkt

Ответ 2

PunktSentenceTokenizer - это алгоритм обнаружения границы предложения, который должен быть обучен для использования [1]. NLTK уже включает в себя предварительно подготовленную версию PunktSentenceTokenizer.

Итак, если вы используете инициализацию токенизатора без каких-либо аргументов, по умолчанию будет использоваться предварительно подготовленная версия:

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.']

Вы также можете предоставить свои собственные данные обучения для обучения токенизатора перед его использованием. Punken tokenizer использует неконтролируемый алгоритм, то есть вы просто тренируете его с помощью обычного текста.

custom_sent_tokenizer = PunktSentenceTokenizer(train_text)

В большинстве случаев совершенно нормально использовать предварительно подготовленную версию. Таким образом, вы можете просто инициализировать токенизатор без предоставления каких-либо аргументов.

Итак, что все это связано с тегами POS? Теггер NLTK POS работает с токенированными предложениями, поэтому вам нужно сломать текст в предложениях и токенах перед тем, как вы сможете использовать тег POS.

Документация NLTK.

[1] Kiss and Strunk, " Неконтролируемое обнаружение границ многоязычного предложения

Ответ 3

Вы можете обратиться по ссылке ниже, чтобы получить более подробную информацию об использовании PunktSentenceTokenizer. Это наглядно объясняет, почему PunktSentenceTokenizer используется вместо sent-tokenize() для вашего случая.

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

Ответ 4

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)

Даже не обучая его другим текстовым данным, он работает так же, как и предварительно обученный.