Обучающий токенизатор и фильтрация стоп-слов

Зачем тренировать собственный токенизатор предложений?

Это очень важный вопрос: если у нас есть токенизатор предложений NLTK по умолчанию, то зачем нам обучать токенизатор предложений? Ответ на этот вопрос заключается в качестве токенизатора предложений по умолчанию NLTK. Токенизатор NLTK по умолчанию - это токенизатор общего назначения. Хотя он работает очень хорошо, но он может быть не лучшим выбором для нестандартного текста, как, например, наш текст, или для текста с уникальным форматированием. Чтобы токенизировать такой текст и получить наилучшие результаты, мы должны обучить собственный токенизатор предложений.

Пример реализации

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

Guy: How old are you?
Hipster girl: You know, I never answer that question. Because to me, it's about
how mature you are, you know? I mean, a fourteen year old could be more mature
than a twenty-five year old, right? I'm sorry, I just never answer that question.
Guy: But, uh, you're older than eighteen, right?
Hipster girl: Oh, yeah.

Мы сохранили этот текстовый файл с именем training_tokenizer. NLTK предоставляет класс с именемPunktSentenceTokenizerс помощью которого мы можем обучиться на необработанном тексте, чтобы создать собственный токенизатор предложения. Мы можем получить необработанный текст либо путем чтения файла, либо из корпуса NLTK, используяraw() метод.

Давайте посмотрим на пример ниже, чтобы лучше понять это -

Во-первых, импорт PunktSentenceTokenizer класс от nltk.tokenize пакет -

from nltk.tokenize import PunktSentenceTokenizer

Теперь импортируем webtext корпус из nltk.corpus пакет

from nltk.corpus import webtext

Затем, используя raw() метод, получите необработанный текст из training_tokenizer.txt файл следующим образом -

text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')

Теперь создайте экземпляр PunktSentenceTokenizer и распечатайте предложения токенизации из текстового файла следующим образом:

sent_tokenizer = PunktSentenceTokenizer(text)
sents_1 = sent_tokenizer.tokenize(text)
print(sents_1[0])

Вывод

White guy: So, do you have any plans for this evening?
print(sents_1[1])
Output:
Asian girl: Yeah, being angry!
print(sents_1[670])
Output:
Guy: A hundred bucks?
print(sents_1[675])
Output:
Girl: But you already have a Big Mac...

Полный пример реализации

from nltk.tokenize import PunktSentenceTokenizer
from nltk.corpus import webtext
text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')
sent_tokenizer = PunktSentenceTokenizer(text)
sents_1 = sent_tokenizer.tokenize(text)
print(sents_1[0])

Вывод

White guy: So, do you have any plans for this evening?

Чтобы понять разницу между токенизатором предложений по умолчанию в NLTK и нашим собственным обученным токенизатором предложений, позвольте нам токенизировать тот же файл с помощью токенизатора предложений по умолчанию, то есть sent_tokenize ().

from nltk.tokenize import sent_tokenize
   from nltk.corpus import webtext
   text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')
sents_2 = sent_tokenize(text)

print(sents_2[0])
Output:

White guy: So, do you have any plans for this evening?
print(sents_2[675])
Output:
Hobo: Y'know what I'd do if I was rich?

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

Что такое стоп-слова?

Некоторые общие слова, которые присутствуют в тексте, но не влияют на значение предложения. Такие слова совершенно не важны для поиска информации или обработки естественного языка. Наиболее распространенными игнорируемыми словами являются «the» и «a».

Корпус стоп-слов НЛТК

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

Сначала импортируйте копус стоп-слов из пакета nltk.corpus -

from nltk.corpus import stopwords

Теперь мы будем использовать стоп-слова из английских языков.

english_stops = set(stopwords.words('english'))
words = ['I', 'am', 'a', 'writer']
[word for word in words if word not in english_stops]

Вывод

['I', 'writer']

Полный пример реализации

from nltk.corpus import stopwords
english_stops = set(stopwords.words('english'))
words = ['I', 'am', 'a', 'writer']
[word for word in words if word not in english_stops]

Вывод

['I', 'writer']

Поиск полного списка поддерживаемых языков

С помощью следующего скрипта Python мы также можем найти полный список языков, поддерживаемых корпусом стоп-слов NLTK:

from nltk.corpus import stopwords
stopwords.fileids()

Вывод

[
   'arabic', 'azerbaijani', 'danish', 'dutch', 'english', 'finnish', 'french',
   'german', 'greek', 'hungarian', 'indonesian', 'italian', 'kazakh', 'nepali',
   'norwegian', 'portuguese', 'romanian', 'russian', 'slovene', 'spanish',
   'swedish', 'tajik', 'turkish'
]