Modelowanie tematyczne może być rodzajem statystycznego modelowania w celu zlokalizowania abstrakcyjnych “tematów”, które występują w zbiorze dokumentów. Latent Dirichlet Allocation (LDA) jest przykładem modelu tematycznego i jest stosowany do klasyfikacji tekstu podczas tworzenia dokumentu na konkretny temat. Buduje ona temat na model dokumentu i słowa na model tematu, modelowane jako dystrybucje Dirichleta.

Tutaj możemy zastosować LDA do grupy dokumentów i podzielić je na tematy. Zaczynajmy!

Dane

Zestaw danych, z którego będziemy korzystać, może być listą ponad miliona nagłówków wiadomości publikowanych w ciągu 15 lat i może być pobrany z Kaggle.

import pand jako pd

data = pd.read_csv(‘abcnews-date-text.csv’, error_bad_lines=False);

data_text = data[[[‘headline_text’]]]

data_text[‘index’] = data_text.index

dokumenty = data_text

Spójrz na informacje.

print(len(dokumenty))

druk(dokumenty[:5])

1048575

https://miro.medium.com/max/487/1*9QcQgSW5CAlsJB1YiJMA2Q.png

Przetwarzanie wstępne danych

Wykonamy kolejne kroki:

Tokenizacja: Podzielmy tekst na zdania, a więc zdania na słowa. Niższe litery wyrazów i pozbawienie interpunkcji.

Słowa, które mają mniej niż 3 znaki są usuwane.

Wszystkie stopery są usuwane.

Wyrazy są lematyzowane – wyrazy w osobach są zmieniane na osobiste, a czasowniki w czasie przeszłym i przyszłym stają się obecne.

Wyrazy są uśpione – wyrazy są zredukowane do ich pierwotnej formy.

Ładowanie biblioteki gensim i nltk

import gensim

z gensim.utils import simple_preprocess

z gensim.parsing.preprocessing import STOPWORY

z nltk.stem import WordNetLemmatizer, SnowballStemmer

z nltk.stem.porter import *

importować zdrętwiały jak np.

e.random.seed(2018)

import nltk

nltk.download(‘wordnet’)

[nltk_data] Pobieranie pakietu Wordnet do

C:Użytkownicy Zuzanna-Li dane…

[nltk_data] Pakiet Wordnet jest już aktualny!

Prawdziwe

Napisz funkcję do wykonania czynności lematyzowania i wstępnego przetwarzania trzpienia na zestawie informacji.

def lemmatize_stemming(tekst):

zwróć stemmer.stem(WordNetLemmatizer().lemmatize(text, pos=’v’))

def preprocess(tekst):

wynik = []

dla tokena w gensim.utils.simple_preprocess(tekst):

jeśli token nie jest w gensim.parsing.preprocessing.STOPWORDS i len(token) > 3:

result.append(lemmatize_stemming(token))

rezultat powrotny

Wybierz dokument do podglądu po przetworzeniu wstępnym.

doc_sample = dokumenty[documents[‘index’] == 4310].values[0][0]

print(“dokument oryginalny: “)

słowa = []

dla słowa w doc_sample.split(‘ ‘):

words.append(word)

grafika (słowa)

wydruk (“dokument w formie symbolicznej i lematycznej: “)

print(preprocess(doc_sample))

oryginalny dokument:

[“deszcz”, “pomaga”, “tłumi”, “pożary buszu”]

symbolizowany i lemmatyzowany dokument:

[“deszcz”, “pomoc”, “zwilżenie”, “potwierdzenie buszu”]

To zadziałało!

Przetwarzaj wstępnie tekst nagłówka, zapisując wyniki jako “processed_docs”.

processed_docs = dokumenty[‘headline_text’].map(preprocess)

processed_docs[:10]

https://miro.medium.com/max/610/1*pjav3VLRNQIFe1eWAqsHRA.png

Torba z hasłami w zestawie informacyjnym

Stwórz słownik z “processed_docs” zawierający ilość razy, w jakich słowo pojawia się w zestawie szkoleniowym.

dictionary = gensim.corpora.Dictionary(processed_docs)

Zliczanie = 0

dla k, v w dictionary.iteritems():

print(k, v)

zliczanie += 1

jeśli liczyć > 10:

przerwa

0 nadawany

1 communiti

2 zadecydować

3 licencje

4 nagroda

5 zniesławienie

6 dowcip

7 wezwanie

8 infrastruktur

9 ochrona

10 szczyt

Gensim filter_extremes

Odfiltruj żetony, które pojawiają się w

mniej niż 15 dokumentów (liczba bezwzględna) lub

więcej niż 0,5 dokumentu (ułamek całkowitej wielkości korpusu, nie liczba bezwzględna).

po dwóch powyższych krokach, zachowaj tylko podstawowe 100000 najczęstszych żetonów.

dictionary.filter_extremes(no_below=15, no_above=0.5, keep_n=100000)

Gensim doc2bow

Dla każdego dokumentu tworzymy słownik informujący jaki procent

słowa i sposób, w jaki te słowa wielokrotnie się pojawiają. Zapisz to w ‘bow_corpus’, a następnie sprawdź wcześniej wybrany przez nas dokument.

bow_corpus = [dictionary.doc2bow(doc) for doc in processed_docs]

bow_corpus[4310]

[(76, 1), (112, 1), (483, 1), (3998, 1)]

Podgląd torby słów dla naszego przykładowego, wstępnie przetworzonego dokumentu.

bow_doc_4310 = bow_corpus[4310]

dla i w zakresie(len(bow_doc_4310)):

print(“Word {} (\”\”) pojawia się {}czas.”.format(bow_doc_4310[i][0],

słownik[bow_doc_4310[i][0]],

bow_doc_4310[i][1]))

Słowo 76 (“bushfir”) pojawia się 1 raz.

Słowo 112 (“pomoc”) pojawia się 1 raz.

Pojawia się słowo 483 (“deszcz”) 1 raz.

Pojawia się jedno słowo 3998 (“tłumienie”).

TF-IDF

Utwórz obiekt modelu tf-idf za pomocą models.TfidfModel na ‘bow_corpus’ i zarezerwuj go na ‘tfidf’, następnie zastosuj transformację do całego korpusu i nazwij go ‘corpus_tfidf’. Na koniec podglądamy wyniki TF-IDF dla naszego pierwszego dokumentu.

z korpusów importujących gensim, modele

tfidf = models.TfidfModel(bow_corpus)

corpus_tfidf = tfidf[bow_corpus]

od pprint import pprint

dla doc in corpus_tfidf:

pprint(doc)

Przerwa

[(0, 0.5907943557842693),

(1, 0.3900924708457926),

(2, 0.49514546614015836),

(3, 0.5036078441840635)]

Uruchamianie LDA za pomocą Worka z hasłami

Pociągnij nasz model lda za pomocą gensim.models.LdaMulticore i zarezerwuj go na ‘lda_model’.

lda_model = gensim.models.LdaMulticore(bow_corpus, num_topics=10, id2word=dictionary, passes=2, workers=2)

Dla każdego tematu zgłębimy pojawiające się w nim słowa i jego względną wagę.

dla idx, temat w lda_model.print_topics(-1):

print(‘Topic: {} \Słowa: {}’.format(idx, temat))

https://miro.medium.com/max/1355/1*yCd5BcHDDWMFF7emZu1VcA.png

Czy można rozróżnić różne tematy za pomocą słów w każdym z nich i odpowiadających im wag?

Prowadzenie LDA przy użyciu TF-IDF

lda_model_tfidf = gensim.models.LdaMulticore(corpus_tfidf, num_topics=10, id2word=słownik, pass=2, workers=4)

dla idx, temat w lda_model_tfidf.print_topics(-1):

print(‘Topic: {} Word: {}’.format(idx, temat))

https://miro.medium.com/max/1382/1*_HZ-9HChNGIOBcWmOD5Pnw.png

Ponownie, czy można rozróżnić różne tematy, używając słów w każdym z nich i odpowiadających im wag?

Ocena wydajności poprzez klasyfikowanie przykładowego dokumentu przy użyciu modelu LDA Bag of Words

Sprawdzimy, gdzie nasz dokument testowy zostałby zaklasyfikowany.

processed_docs[4310]

[“deszcz”, “pomoc”, “zwilżenie”, “buszfir”]

dla indeksu, wynik w sortowaniu(lda_model[bow_corpus[4310]], key=lambda tup: -1*tup[1]):

print(“\nScore: {\i0}\i1}t \i1}nTopic: {}”.format(score, lda_model.print_topic(index, 10)))

Nasz dokument testowy ma największe prawdopodobieństwo, że będzie częścią tematu, który przypisaliśmy naszemu modelowi, czyli dokładnej klasyfikacji.

Ocena wydajności poprzez klasyfikowanie przykładowego dokumentu za pomocą modelu LDA TF-IDF.

dla indeksu, wynik w sortowaniu(lda_model_tfidf[bow_corpus[4310]], key=lambda tup: -1*tup[1]):

print(“\nScore: {}\i1}t \i1}nTopic: {}”.format(score, lda_model_tfidf.print_topic(index, 10)))

https://miro.medium.com/max/1361/1*Z15r4Z41s63arOH4grauoA.png

Nasz dokument testowy ma największe prawdopodobieństwo, że będzie częścią tematu, który przypisaliśmy naszemu modelowi, czyli dokładnej klasyfikacji.

Testowanie modelu na niewidzialnym dokumencie

unseen_document = “How a Pentagon deal became an identity crisis for Google”.

bow_vector = słownik.doc2bow(proces wstępny (unseen_document))

dla indeksu, wynik w sortowaniu(lda_model[bow_vector], key=lambda tup: -1*tup[1]):

print(“Score: {}\i1}t Topic: {}”.format(score, lda_model.print_topic(index, 5)))