Использование 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)
Даже не обучая его другим текстовым данным, он работает так же, как и предварительно обученный.