Szkolenia Tokenizer i filtrowanie odrzucanych słów

Po co trenować własny tokenizer zdań?

Jest to bardzo ważne pytanie, które jeśli mamy domyślny tokenizer zdań NLTK, to dlaczego musimy szkolić tokenizator zdań? Odpowiedź na to pytanie leży w jakości domyślnego tokenizera zdań NLTK. Domyślny tokenizer NLTK jest w zasadzie tokenizatorem ogólnego przeznaczenia. Chociaż działa bardzo dobrze, ale może nie być dobrym wyborem w przypadku niestandardowego tekstu, który być może jest naszym tekstem, lub dla tekstu, który ma unikalne formatowanie. Aby tokenizować taki tekst i uzyskiwać najlepsze wyniki, powinniśmy wyszkolić własny tokenizer zdań.

Przykład implementacji

W tym przykładzie będziemy używać korpusu tekstu internetowego. Plik tekstowy, którego będziemy używać z tego korpusu, ma tekst sformatowany jako okna dialogowe pokazane poniżej -

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.

Zapisaliśmy ten plik tekstowy pod nazwą training_tokenizer. NLTK udostępnia klasę o nazwiePunktSentenceTokenizerza pomocą którego możemy trenować na surowym tekście, aby stworzyć niestandardowy tokenizer zdań. Możemy uzyskać surowy tekst, czytając w pliku lub z korpusu NLTK przy użyciu rozszerzeniaraw() metoda.

Zobaczmy poniższy przykład, aby uzyskać lepszy wgląd w to -

Najpierw importuj PunktSentenceTokenizer klasa od nltk.tokenize pakiet -

from nltk.tokenize import PunktSentenceTokenizer

Teraz importuj webtext korpus z nltk.corpus pakiet

from nltk.corpus import webtext

Następnie za pomocą raw() pobierz surowy tekst z training_tokenizer.txt plik w następujący sposób -

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

Teraz utwórz wystąpienie PunktSentenceTokenizer i wydrukuj zdania tokenizacji z pliku tekstowego w następujący sposób -

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

Wynik

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

Kompletny przykład wdrożenia

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

Wynik

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

Aby zrozumieć różnicę między domyślnym tokenizatorem zdań NLTK a naszym własnym wyuczonym tokenizatorem zdań, tokenizujemy ten sam plik z domyślnym tokenizatorem zdań, czyli 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?

Przy pomocy różnicy w danych wyjściowych możemy zrozumieć koncepcję, dlaczego warto trenować nasz własny tokenizer zdań.

Co to są odrzucane słowa?

Niektóre popularne słowa, które są obecne w tekście, ale nie mają znaczenia w zdaniu. Takie słowa nie są wcale ważne dla celów wyszukiwania informacji lub przetwarzania języka naturalnego. Najczęstszymi odrzucanymi słowami są „the” i „a”.

Korpus haseł NLTK

W rzeczywistości zestaw narzędzi języka naturalnego zawiera korpus pomijanych słów zawierający listy słów dla wielu języków. Zrozummy jego użycie za pomocą następującego przykładu -

Po pierwsze, import odrzucanych słów Copus z nltk.corpus pakietu -

from nltk.corpus import stopwords

Teraz będziemy używać pomijanych słów z języków angielskiego

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

Wynik

['I', 'writer']

Kompletny przykład wdrożenia

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]

Wynik

['I', 'writer']

Znajdowanie pełnej listy obsługiwanych języków

Za pomocą poniższego skryptu Python możemy również znaleźć pełną listę języków obsługiwanych przez korpus stopwords NLTK -

from nltk.corpus import stopwords
stopwords.fileids()

Wynik

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