Тематическое моделирование может быть своего рода статистическим моделированием для определения местоположения абстрактных “тем”, которые возникают во время сбора документов. Latent Dirichlet Allocation (LDA) является примером тематической модели и используется для классификации текста во время работы над документом по определенной теме. Оно строит предмет по модели документа и слова по модели темы, смоделированные как дистрибутивы Dirichlet.

Здесь мы получаем возможность применить LDA к группе документов и разделить их на темы. Начнем!

Данные

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

импортировать панд как pd

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

data_text = data[[‘headline_text’]].

data_text[‘index’] = data_text.index

документы = data_text

Взгляните на информацию.

распечатка(лен(документов))

печать(документы[:5])

1048575

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

Предварительная обработка данных

Мы выполним следующие шаги:

Токенизация: Разделим текст на предложения, а значит, предложения на слова. Опустите слова и уберите пунктуацию.

Слова, содержащие менее 3-х символов, удаляются.

Все стоп-слова удаляются.

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

Слова стеблируются – слова сводятся к своей корневой форме.

Загрузка библиотек gensim и nltk.

импортный генсим

из gensim.utils импорт simple_preprocess

от gensim.parsing.preprocessing import STOPWORDS

от nltk.stem import WordNetLemmatizer, SnowballStemmer

от импорта nltk.stem.porter *

импорт онемелый как пшт

np.random.seed(2018)

импорт нлтк

nltk.download(‘wordnet’)

[nltk_data] Загрузка пакета wordnet в

[nltk_data] C:\Users\SusanLi\AppData\Roaming\nltk_data…

[nltk_data] Пакет wordnet уже обновлен!

Правда

Запишите функцию для выполнения шагов лемматизации и предварительной обработки стеблей в информационном наборе.

def lemmatize_stemming(text):

return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos=’v’)))

def препроцесс(текст):

результат = []

для токена в gensim.utils.simple_preprocess(text):

если лексема не в gensim.parsing.preprocessing.STOPWORDS и len(token) > 3:

result.append(lemmatize_stemming(token)))

результат возврата

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

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

print(‘original document: ‘)

слова = []

для слова в doc_sample.split(‘ ‘):

word.append(word)

печатная форма (слова)

print(‘\n\n прописанный и лемматизированный документ: ‘)

print(preprocess(doc_sample)))

оригинал документа:

[“дождь”, “помощь”, “увлажнение”, “костры”]

символический и лемматизированный документ:

[“дождь”, “помощь”, “увлажнение”, “кустарник”]

Сработало!

Препроцессируйте текст заголовка, сохранив результаты как ‘processed_docs’.

processed_docs = документы[‘headline_text’].map(preprocess)

processed_docs[:10]

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

Сумка Слова на информационном стенде

Создайте словарь из ‘processed_docs’, содержащий количество появлений слова в учебном наборе.

словарь = gensim.corpora.Dictionary(processed_docs)

счёт = 0

для k, v в dictionary.iteritems():

print(k, v)

счёт += 1

если считать > 10:

перерыв

0 трансляция

1 община

2 листопадная

3 лицензия

4 война

5 клевета

6 остроумие

7 звонок

8 инфакрасруктура

9 защищать

10 саммит

Gensim filter_extremes

Отфильтровать жетоны, которые появляются в

менее 15 документов (абсолютное количество) или

более 0,5 документов (доля от общего размера корпуса, а не абсолютное число).

после двух вышеуказанных этапов сохраните только первичные 100000 наиболее часто встречающихся токенов.

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

Gensim doc2bow

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

слова и то, как многократно эти слова появляются. Сохраните это в ‘bow_corpus’, а затем проверьте выбранный документ ранее.

bow_corpus = [словарь.doc2bow(doc) для doc в process_docs].

bow_corpus[4310]

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

Предварительный просмотр пакета слов для нашего образца предварительно обработанного документа.

bow_doc_4310 = bow_corpus[4310]

для i в диапазоне(len(bow_doc_4310)):

print(“Word {} (\ “{}\”) появляется {} время.”.format(bow_doc_4310[i][0],

словарь[bow_doc_4310[i][0]],

bow_doc_4310[i][1]))

Слово 76 (“bushfir”) появляется 1 раз.

Слово 112 (“помощь”) появляется 1 раз.

1 раз появляется слово 483 (“дождь”).

1 раз появляется слово 3998 (“влажный”).

TF-IDF

Создайте объект модели tf-idf, используя models.TfidfModel на ‘bow_corpus’ и зарезервируйте его на ‘tfidf’, затем примените трансформацию ко всему корпусу и назовите его ‘corpus_tfidf’. Наконец, мы просматриваем оценки TF-IDF для нашего первого документа.

из gensim import corpora, модели

tfidf = models.TfidfModel(bow_corpus)

corpus_tfidf = tfidf[bow_corpus]

импортный оттиск печати

для дока в corpus_tfidf:

pprint(doc)

перерыв на

[(0, 0.5907943557842693),

(1, 0.3900924708457926),

(2, 0.49514546614015836),

(3, 0.5036078441840635)]

Запуск LDA с использованием Мешка Слова

Обучайте нашу модель lda, используя gensim.models.LdaMulticore, и зарезервируйте ее для ‘lda_model’.

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

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

для idx, topic в lda_model.print_topics(-1):

print(‘Topic: {} \nWords: {}’.format(idx, topic))

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

Можете ли вы различать различные темы, используя слова в каждой теме и их соответствующие веса?

Запуск LDA с использованием TF-IDF

lda_model_tfidf = gensim.models.LdaMulticore(corpus_tfidf, num_topics=10, id2word=dictionary, passes=2, workers=4)

для idx, тема в lda_model_tfidf.print_topics(-1):

print(‘Topic: {} Слово: {}’.format(idx, topic))

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

Опять же, можете ли вы различать различные темы, используя слова в каждой теме и их соответствующие веса?

Оценка эффективности путем классификации образца документа с использованием модели LDA Bag of Words.

Мы проверим, где будет классифицирован наш тестовый документ.

processed_docs[4310]

[“дождь”, “помощь”, “увлажнение”, “бушфир”]

для индекса, оценка в sorted(lda_model[bow_corpus[4310]], key=lambda tup: -1*tup[1]):

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

Наш тестовый документ имеет наибольшую вероятность быть частью темы, которая была задана нашей моделью, которая является точной классификацией.

Оценка эффективности путем классификации образца документа с использованием модели LDA TF-IDF.

для индекса, оценка в sorted(lda_model_tfidf[bow_corpus[4310]], key=lambda tup: -1*tup[1]):

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

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

Наш тестовый документ имеет наибольшую вероятность быть частью темы, которая была задана нашей моделью, которая является точной классификацией.

Тестирование модели на невидимом документе

unseen_document = ‘Как сделка с Пентагоном превратилась в кризис идентичности для Google’.

bow_vector = dictionary.doc2bow(препроцесс(unseen_document))

для индекса, score in sorted(lda_model[bow_vector], key=lambda tup: -1*tup[1]):

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