NLP Gensim Tutorial - Полное руководство для начинающих
В этом руководстве вы познакомитесь с библиотекой Gensim .
Gensim : это библиотека с открытым исходным кодом на python, написанная Радимом Рехуреком, которая используется для неконтролируемого моделирования тем и обработки естественного языка. Она предназначена для извлечения семантических тем из документов. Она может обрабатывать большие текстовые коллекции. Таким образом, она отличается от других. Пакеты программного обеспечения для машинного обучения, ориентированные на обработку памяти. GenSim также предоставляет эффективные многоядерные реализации для различных алгоритмов для увеличения скорости обработки. Он предоставляет более удобные средства для обработки текста, чем другие пакеты, такие как Scikit-learn, R и т. д.
В этом руководстве будут рассмотрены следующие концепции:
- Создать корпус из заданного набора данных
- Создайте матрицу TFIDF в Gensim
- Создавайте биграммы и триграммы с помощью Gensim
- Создайте модель Word2Vec с помощью Gensim
- Создайте модель Doc2Vec с помощью Gensim
- Создание тематической модели с LDA
- Создание тематической модели с LSI
- Вычислить матрицы подобия
- Обобщать текстовые документы
Прежде чем двигаться дальше, давайте разберемся, что означают некоторые из нижеприведенных терминов.
- Корпус: собрание текстовых документов.
- Вектор: форма представления текста.
- Модель: алгоритм, используемый для создания представления данных.
- Тематическое моделирование: это инструмент интеллектуального анализа информации, который используется для извлечения семантических тем из документов.
- Тема: повторяющаяся группа слов, часто встречающихся вместе.
Например: У вас есть документ, состоящий из таких слов, как - летучая мышь, машина, ракетка, счет, стекло, привод, чашка, ключи, вода, игра, руль, жидкость Их можно сгруппировать по разным темам:
Тема 1 | Тема 2 | Тема 3 |
---|---|---|
стакан | летучая мышь | автомобиль |
чашка | ракетка | водить машину |
воды | счет | ключи |
жидкость | игра | стерринг |
Некоторые из методов тематического моделирования :
- Скрытое семантическое индексирование (LSI)
- Скрытое распределение Дирихле (LDA)
Теперь, когда у нас есть основная идея терминологии, давайте начнем с использования пакета Gensim.
Сначала установите библиотеку с помощью команд:
# для linuxpip install gensim
# для подсказки анакондыconda install gensim
Шаг 1. Создайте корпус из заданного набора данных
Вам необходимо выполнить следующие шаги, чтобы создать свой корпус:
- Загрузите свой набор данных
- Предварительная обработка набора данных
- Создать словарь
- Создать Мешок со Словами
1.1 Загрузите свой набор данных:
У вас может быть файл .txt в качестве набора данных или вы также можете загружать наборы данных с помощью API Gensim Downloader .
Код:
import os # open the text file as an object doc = open ( 'sample_data.txt' , encoding = 'utf-8' ) |
- Gensim Downloader API: это модуль, доступный в библиотеке Gensim, который представляет собой API для загрузки, получения информации и загрузки наборов данных / моделей.
Код:
import gensim.downloader as api # check available models and datasets info_datasets = api.info() print (info_datasets) #>{'corpora': #> {'semeval-2016-2017-task3-subtaskBC': #> {'num_records': -1, 'record_format': 'dict', 'file_size': 6344358, ....} # information of a particular dataset dataset_info = api.info( "text8" ) # load the "text8" dataset dataset = api.load( "text8" ) # load a pre-trained model word2vec_model = api.load( 'word2vec-google-news-300' ) |
Здесь мы собираемся рассматривать текстовый файл как необработанный набор данных, который состоит из данных со страницы Википедии.
1.2 Предварительная обработка набора данных
Предварительная обработка текста: в предварительной обработке естественного языка предварительная обработка текста - это практика очистки и подготовки текстовых данных. Для этого воспользуемся simple_preprocess( )
которая возвращает список токенов после их токенизации и нормализации.
Код:
import gensim import os from gensim.utils import simple_preprocess # open the text file as an object doc = open ( 'sample_data.txt' , encoding = 'utf-8' ) # preprocess the file to get a list of tokens tokenized = [] for sentence in doc.read().split( '.' ): # the simple_preprocess function returns a list of each sentence tokenized.append(simple_preprocess(sentence, deacc = True )) print (tokenized) |
Выход:
1.3 Создать словарь
Теперь у нас есть предварительно обработанные данные, которые можно преобразовать в словарь с помощью функции corpora.Dictionary( )
. Этот словарь представляет собой карту уникальных токенов.
Код:
from gensim import corpora # storing the extracted tokens into the dictionary my_dictionary = corpora.Dictionary(tokenized) print (my_dictionary) |
Выход:
1.3.1 Сохранение словаря на диск или в виде текстового файла
Вы можете сохранить / загрузить свой словарь на диск, а также текстовый файл, как указано ниже:
Код:
# save your dictionary to disk my_dictionary.save( 'my_dictionary.dict' ) # load back load_dict = corpora.Dictionary.load(my_dictionary. dict ') # save your dictionary as text file from gensim.test.utils import get_tmpfile tmp_fname = get_tmpfile( "dictionary" ) my_dictionary.save_as_text(tmp_fname) # load your dictionary text file load_dict = corpora.Dictionary.load_from_text(tmp_fname) |
1.4 Создание корпуса пакета слов
Когда у нас есть словарь, мы можем создать корпус Bag of Word с помощью функции doc2bow( )
. Эта функция подсчитывает количество вхождений каждого отдельного слова, преобразует слово в его целочисленный идентификатор слова, а затем результат возвращается в виде разреженного вектора.
Код:
# convertig to a bag of word corpus BoW_corpus = [my_dictionary.doc2bow(doc, allow_update = True ) for doc in tokenized] print (BoW_corpus) |
Выход:
1.4.1 Сохранение корпуса на диск:
Код: для сохранения / загрузки вашего корпуса
from gensim.corpora import MmCorpus from gensim.test.utils import get_tmpfile output_fname = get_tmpfile( "BoW_corpus.mm" ) # save corpus to disk MmCorpus.serialize(output_fname, BoW_corpus) # load corpus load_corpus = MmCorpus(output_fname) |
Шаг 2: Создайте матрицу TFIDF в Gensim
TFIDF: сокращение от Term Frequency - Inverse Document Frequency . Это широко используемая модель обработки естественного языка, которая помогает вам определять самые важные слова в каждом документе в корпусе. Это было разработано для корпуса скромного размера.
Некоторые слова могут не использоваться в качестве игнорируемых слов, но могут чаще встречаться в документах и иметь меньшее значение. Следовательно, эти слова необходимо удалить или снизить их важность. Модель TFIDF берет текст, использующий общий язык, и гарантирует, что наиболее распространенные слова во всем корпусе не будут отображаться в качестве ключевых слов. Вы можете построить модель TFIDF, используя Gensim и корпус, который вы разработали ранее, как:
Код:
from import models gensim import numpy as np # Word weight in Bag of Words corpus word_weight = [] for doc in BoW_corpus: for id , freq in doc: word_weight.append([my_dictionary[ id ], freq]) print (word_weight) |
Выход:
Код: применение модели TFIDF
# create TF-IDF model tfIdf = models.TfidfModel(BoW_corpus, smartirs = 'ntc' ) # TF-IDF Word Weight weight_tfidf = [] for doc in tfIdf[BoW_corpus]: for id , freq in doc: weight_tfidf.append([my_dictionary[ id ], np.around(freq, decimals = 3 )]) print (weight_tfidf) |
Выход:
Вы можете видеть, что словам, часто встречающимся в документах, теперь присвоены более низкие веса.
Шаг 3. Создание биграмм и триграмм с помощью генизма
Многие слова часто встречаются в содержании вместе. Слова, встречающиеся вместе, имеют другое значение, чем по отдельности.
Например: Битбоксинг -> слова бит и бокс по отдельности имеют собственное значение но вместе они имеют разное значение.
Биграммы: группа из двух слов.
Триграммы: группа из трех слов.
Здесь мы будем использовать набор данных text8, который можно загрузить с помощью API загрузчика Gensim.
Код: построение биграмм и триграмм
import gensim.downloader as api from gensim.models.phrases import Phrases # load the text8 dataset dataset = api.load( "text8" ) # extract a list of words from the dataset data = [] for word in dataset: data.append(word) # Bigram using Phraser Model bigram_model = Phrases(data, min_count = 3 , threshold = 10 ) print (bigram_model[data[ 0 ]]) |
Чтобы создать триграмму, мы просто передаем полученную выше модель биграммы той же функции.
Код:
# Trigram using Phraser Model trigram_model = Phrases(bigram_model[data], threshold = 10 ) # trigram print (trigram_model[bigram_model[data[ 0 ]]]) |
Выход:
Шаг 4: Создайте модель Word2Vec с помощью Gensim
Алгоритмы ML / DL не могут получить доступ к тексту напрямую, поэтому нам нужно некоторое числовое представление, чтобы эти алгоритмы могли обрабатывать данные. В простых приложениях машинного обучения используются
CountVectorizer
и TFIDF
, которые не сохраняют связь между словами.Word2Vec: метод представления текста для создания вложений Word, которые отображают все слова, присутствующие на языке, в векторное пространство заданного измерения. Мы можем выполнять математические операции с этими векторами, которые помогают сохранить связь между словами.
Предварительно созданные модели встраивания слов, такие как word2vec, GloVe, fasttext и т. Д., Можно загрузить с помощью API загрузчика Gensim. Иногда вы можете не найти встраивания слов для определенных слов в своем документе. Так вы можете тренировать свою модель.
4.1) Обучите модель
Код:
import gensim.downloader as api from multiprocessing import cpu_count from gensim.models.word2vec import Word2Vec # load the text8 dataset dataset = api.load( "text8" ) # extract a list of words from the dataset data = [] for word in dataset: data.append(word) # We will split the data into two parts data_1 = data[: 1200 ] # this is used to train the model data_2 = data[ 1200 :] # this part will be used to update the model # Training the Word2Vec model w2v_model = Word2Vec(data_1, min_count = 0 , workers = cpu_count()) # word vector for the word "time" print (w2v_model[ 'time' ]) |
Выход:
Вы также можете использовать
most_similar( )
чтобы найти слова, похожие на данное слово.Код:
# similar words to the word "time" print (w2v_model.most_similar( 'time' )) # save your model w2v_model.save( 'Word2VecModel' ) # load your model model = Word2Vec.load( 'Word2VecModel' ) |
Выход:
4.2) Обновляем модель
Код:
# build model vocabulary from a sequence of sentences w2v_model.build_vocab(data_2, update = True ) # train word vectors w2v_model.train(data_2, total_examples = w2v_model.corpus_count, epochs = w2v_model. iter ) print (w2v_model[ 'time' ]) |
Выход:
Шаг 5: Создайте модель Doc2Vec с помощью Gensim
В отличие от модели Word2Vec, модель Doc2Vec дает векторное представление для всего документа или группы слов. С помощью этой модели мы можем найти взаимосвязь между различными документами, такими как:
Если натренировать модель для литературы типа «Зазеркалье». Мы можем сказать, что -
5.1) Обучите модель
Код:
import gensim import gensim.downloader as api from gensim.models import doc2vec # get dataset dataset = api.load( "text8" ) data = [] for w in dataset: data.append(w) # To train the model we need a list of tagged documents def tagged_document(list_of_ListOfWords): for x, ListOfWords in enumerate (list_of_ListOfWords): yield doc2vec.TaggedDocument(ListOfWords, [x]) # training data data_train = list (tagged_document(data)) # print trained dataset print (data_train[: 1 ]) |
Выход:
# Initialize the model d2v_model = doc2vec.Doc2Vec(vector_size = 40 , min_count = 2 , epochs = 30 ) # build the vocabulary d2v_model.build_vocab(data_train) # Train Doc2Vec model d2v_model.train(data_train, total_examples = d2v_model.corpus_count, epochs = d2v_model.epochs) # Analyzing the output Analyze = d2v_model.infer_vector([ 'violent' , 'means' , 'to' , 'destroy' ]) print (Analyze) |
Выход:
Шаг 6. Создайте модель темы с помощью LDA
LDA - популярный метод тематического моделирования, при котором каждый документ рассматривается как набор тем в определенной пропорции. Нам нужно исключить хорошее качество тем, например, насколько они разделены и значимы. Темы хорошего качества зависят от:
- качество обработки текста
- поиск оптимального количества тем
- Параметры настройки алгоритма
ПРИМЕЧАНИЕ. Если вы запустите этот код в версии python3.7, вы можете получить ошибку StopIteration. Для этого желательно использовать версию python3.6.
Выполните следующие шаги, чтобы создать модель:
6.1 Подготовьте данные
Это делается путем удаления игнорируемых слов и последующего их лемматизации. Чтобы выполнить лемматизацию с помощью Gensim, нам нужно сначала загрузить пакет шаблонов и стоп-слова.
# загрузить пакет шаблонов шаблон установки pip # запустить в консоли Python >> импорт nltk >> nltk.download ('игнорируемые слова')
Код:
import gensim from gensim import corpora from gensim.models import LdaModel, LdaMulticore import gensim.downloader as api from gensim.utils import simple_preprocess, lemmatize # from pattern.en import lemma import nltk # nltk.download('stopwords') from nltk.corpus import stopwords import re import logging logging.basicConfig( format = '%(asctime)s : %(levelname)s : %(message)s' ) logging.root.setLevel(level = logging.INFO) # import stopwords stop_words = stopwords.words( 'english' ) # add stopwords stop_words = stop_words + [ 'subject' , 'com' , 'are' , 'edu' , 'would' , 'could' ] # import the dataset dataset = api.load( "text8" ) data = [w for w in dataset] # Preparing the data processed_data = [] for x, doc in enumerate (data[: 100 ]): doc_out = [] for word in doc: if word not in stop_words: # to remove stopwords Lemmatized_Word = lemmatize(word, allowed_tags = re. compile ( '(NN|JJ|RB)' )) # lemmatize if Lemmatized_Word: doc_out.append(Lemmatized_Word[ 0 ].split(b '/' )[ 0 ].decode( 'utf-8' )) else : continue processed_data.append(doc_out) # processed_data is a list of list of words # Print sample print (processed_data[ 0 ][: 10 ]) |
Выход:
Обработанные данные теперь будут использоваться для создания словаря и корпуса.
Код:
# create dictionary and corpus dict = corpora.Dictionary(processed_data) Corpus = [ dict .doc2bow(l) for l in processed_data] |
6.3 Модель поезда LDA
Мы будем обучать модель LDA с 5 темами, используя словарь и корпус, созданные ранее. Здесь используется функция LdaModel (), но вы также можете использовать функцию LdaMulticore (), поскольку она позволяет выполнять параллельную обработку.
Код:
# Training LDA_model = LdaModel(corpus = LDA_corpus, num_topics = 5 ) # save model LDA_model.save( 'LDA_model.model' ) # show topics print (LDA_model.print_topics( - 1 )) |
Выход:
Слова, которые встречаются в более чем одной теме и имеют меньшее значение, могут быть добавлены в список запрещенных слов.
6.4 Интерпретация вывода
Модель LDA в основном дает нам информацию по трем вещам:
- Темы в документе
- К какой теме принадлежит каждое слово
- Значение фи
Значение фи: это вероятность того, что слово относится к определенной теме. Для данного слова сумма значений фи дает количество раз, когда это слово встречается в документе.
Код:
# probability of a word belonging to a topic LDA_model.get_term_topics( 'fire' ) bow_list = [ 'time' , 'space' , 'car' ] # convert to bag of words format first bow = LDA_model.id2word.doc2bow(bow_list) # interpreting the data doc_topics, word_topics, phi_values = LDA_model.get_document_topics(bow, per_word_topics = True ) |
Шаг 7. Создайте тематическую модель с помощью LSI
Чтобы создать модель с LSI, просто выполните те же шаги, что и с LDA. Единственная разница будет во время обучения модели.
Используйте LsiModel( )
вместо LdaMulticore( )
или LdaModel( )
.
Код:
# Training the model with LSI LSI_model = LsiModel(corpus = Corpus, id2word = dct, num_topics = 7 , decay = 0.5 ) # Topics print (LSI_model.print_topics( - 1 )) |
Шаг 8: вычисление матриц подобия
Косинусное сходство: это мера сходства между двумя ненулевыми векторами внутреннего пространства продукта. Он определяется как равный косинусу угла между ними.
Мягкое косинусное сходство: оно похоже на косинусное сходство, но разница в том, что косинусное сходство рассматривает функции модели векторного пространства (VSM) как независимые, тогда как мягкий косинус предлагает учитывать сходство функций в VSM.
Нам нужно взять модель вложения слов для вычисления мягких косинусов.
Здесь мы используем предварительно обученную модель word2vec.
Примечание. Если вы запустите этот код в версии python3.7, вы можете получить ошибку StopIteration. Для этого желательно использовать версию python3.6.
Код:
import gensim.downloader as api from gensim.matutils import softcossim from gensim import corpora s1 = ' Afghanistan is an Asian country and capital is Kabul' .split() s2 = 'India is an Asian country and capital is Delhi' .split() s3 = 'Greece is an European country and capital is Athens' .split() # load pre-trained model
РЕКОМЕНДУЕМЫЕ СТАТЬИ |