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

Мы также обсудим LSA и покажем его применение в Python для дальнейшего объяснения. Затем мы запросим код, чтобы увидеть, дает ли он нам требуемые результаты, которые представляют собой документы с темами, которые должны быть связаны с темой поиска / запроса.

Чтобы уточнить, мы получили эту информацию из разных источников, которые будут перечислены внизу этой страницы.

ЗАДАЧИ:

  • Узнайте, что такое тематическое моделирование
  • Узнать о LSA
  • Узнайте о векторной космической модели
  • Узнайте о TF-IDF
  • Узнайте о Carrot2 и его алгоритмах
  • Плюсы и минусы LSA
  • Примеры использования LSA
  • Код Python для моделирования тем LSA

Для начала мы должны сначала объяснить, что подразумевается под тематическим моделированием и в чем разница между ним и тематической классификацией.

Представьте, что вы только что купили новую библиотеку, которая совершенно пуста, и вам нужно организовать несколько полок и секций, чтобы вместить тысячи книг, которые вы заказали. Как правило, библиотеки разделены по различным тематикам книг, таким как раздел для книг, связанных с медициной, другой раздел для религии, еще один раздел для художественной литературы и так далее. А теперь представьте, что вам нужно понять общую идею каждой книги в коллекции из тысяч, которые вы заказали. Помимо утомительной рабочей нагрузки, с которой вы столкнетесь, вам потребуется много времени, чтобы придумать соответствующие темы и разделы для организации вашей библиотеки, и это даже без учета того факта, что вы можете заказать новую партию книг в ближайшее будущее. К счастью, нам посчастливилось дожить до 21 века, в период времени, когда компьютеры и машины постоянно работают, чтобы облегчить жизнь всем нам. Принимая во внимание тот же пример библиотеки, компьютер теперь может принимать тысячи документов в качестве входных данных и создавать любое количество подходящих тем на основе содержимого этих документов, и все это за считанные секунды. Так что теперь вместо того, чтобы работать бесконечные часы над организацией своей библиотеки, вы можете позволить машине делать всю тяжелую работу, пока вы наслаждаетесь чашкой кофе и читаете свой любимый роман. Этот процесс называется тематическим моделированием.

Что такое тематическое моделирование?

Используя базовую терминологию, тематическое моделирование - это процесс машинного обучения и, в частности, интеллектуального анализа текста, в котором компьютеру предоставляется набор документации в качестве входных данных, и ожидается, что он будет создавать соответствующие темы, просматривая документацию одну за другой. Это процесс, который анализирует текстовые документы, чтобы выяснить, какова тема документа, а затем объединяет связанные документы в кластеры. Тематическое моделирование - это алгоритм обучения без учителя, то есть он делает выводы из входных данных без какой-либо маркировки. С другой стороны, тематическая классификация - это алгоритм обучения с учителем, что означает, что модель обучается на помеченных данных, а затем ей предоставляются новые входные данные, которые не помечены и которые необходимо маркировать в соответствии с ее прошлым опытом.

Как и любую задачу в мире, есть разные способы ее выполнения. В этом блоге мы в основном сосредоточимся на скрытом семантическом анализе (LSA). Данные, которые мы будем использовать, представлены в форме электронной таблицы (файл Excel) и взяты с веб-сайта Real Estate в ОАЭ, который называется Property Finder.

Что такое LSA и как это работает?

Вы когда-нибудь читали чек после покупки? Квитанция в основном показывает каждый приобретенный вами товар по его идентификатору и количеству повторений этого товара в вашей корзине. Алгоритм LSA дает аналогичный результат. Во время итерации по каждому отдельному документу он ведет счет встреченных слов, пока не достигнет конца, затем переходит к следующему документу, пока все документы не будут завершены. Результатом должна быть матрица, содержащая разные слова в виде строк, разные документы в виде столбцов и количество повторений каждого слова в каждом документе в ячейках. Это называется матрицей частотных терминов. Затем алгоритм LSA выполняет разложение матрицы на матрице частот терминов, используя метод, называемый разложением по сингулярным значениям. Процесс SVD сократит матрицу частотности терминов на 3 меньших, которые называются U, которая связывает термины с темами, V, которая связывает документы с темами, и S, которая представляет собой диагональную матрицу, содержащую единичные значения в порядке от наибольшего к наименьшему. Особые значения представляют собой темы от наиболее важных до наименее важных. После этого алгоритм LSA сократит матрицы до k количества измерений, в котором k представляет количество тем, которые пользователь хотел бы извлечь из документации.

Что такое модель векторного пространства?

Проще говоря, модель векторного пространства (VSM) в NLP - это модель в линейной алгебре, которая представляет текстовый документ как вектор в некотором пространстве, где идентификаторы в векторе - это термины в этом документе.

В матрице терминов и документов термины представлены в виде строк, а документы - в виде столбцов:

Как вы можете видеть, это представление является многомерным и не может быть визуализировано, однако на следующем рисунке визуализация произвольно выбранных измерений (слова «битва» и «дурак») просто проясняет идею.

Матрицы термин-документ изначально были определены как средства поиска похожих документов для задачи поиска информации о документах. На рисунке видно, что похожие векторы имеют похожие / связанные темы.

Достигнув этого шага, мы взвешиваем матрицу частот терминов, выполняя математическую функцию TF-IDF.

Что такое TF-IDF:

Частота термина (TF) - это количество раз, когда слово встречается в документе.

tf(w) = doc.count(w) / total words in doc

Частота обратного документа (IDF):

Когда мы получаем частоту термина в корпусе, учитываются все слова. Однако некоторые слова могут вводить в заблуждение, поскольку они часто встречаются во всех документах, что может негативно повлиять на наш процесс извлечения / вывода тем. Например, слова: «the», «in», «was» и т. Д. - это то, что мы получим в результате при реализации нашего кода, вместо фактических терминов, связанных с темой. Следовательно, мы должны избавиться от них, и это путем дисконтирования частоты термина с помощью Обратной частоты документов (IDF):

idf(w) = log(total num of docs / num of docs containing w)

Частота термина - обратная периодичность документа (TF-IDF):

Таким образом, если термин часто встречается в одном документе, но редко в других, то его векторное представление даст нам высокую ценность, а если термин появляется во всех документах, тогда значение для него будет равно 0.

Пример матрицы TF-IDF:

Этот алгоритм TF-TDF необходим в НЛП, поскольку он имеет множество приложений и значительно упрощает работу с текстовыми данными.

Что такое Carrot2?

Carrot2 - это программа, имитирующая механизм кластеризации результатов поиска. Он использует три различных типа алгоритмов кластеризации, чтобы лучше выводить результаты поиска для пользователей. Алгоритмы кластеризации включают Lingo, STC и K-Means.

  • Lingo создает хорошо описанные плоские кластеры. Однако он не масштабируется за пределы нескольких тысяч результатов поиска.
  • STC - классический алгоритм кластеризации результатов поиска. Он производит плоские кластеры с адекватным описанием и, как известно, работает очень быстро.
  • K-Means - это алгоритм кластеризации базовой линии, который создает описания кластеров в стиле «мешок слов» (BoW).

Для получения дополнительной информации о Carrot2 и его алгоритмах кластеризации мы предлагаем вам ознакомиться с содержанием самого веб-сайта и руководства. Оба ресурса находятся внизу.

LSA Плюсы:

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

LSA Минусы:

  • LSA не может захватить полный синтаксис предложения в документе, поскольку он работает только с каждым словом отдельно.
  • LSA не дает таких точных результатов, как алгоритм HDP (иерархический процесс Дирихле).
  • LSA не дает таких точных результатов, как алгоритм LDA (скрытое распределение Дирихле).
  • Размер тем LSA зависит от ранга матрицы частотности терминов, что означает, что мы не можем расширить этот предел.
  • Разложенная матрица LSA очень плотная, поэтому индексировать отдельные измерения сложно.

Примеры использования LSA:

  • Документированная кластеризация в текстовом анализе
  • Оптимизация систем рекомендаций
  • Информационно-поисковые системы
  • Резюме резюме
  • Поисковая оптимизация
  • Улучшение поддержки клиентов
  • Организация здравоохранения и медицинских отчетов

Код Python для моделирования тем LSA:

Начните с импорта необходимых библиотек:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re
from nltk.corpus import stopwords
import nltk
import gensim
from gensim import similarities
import gensim.corpora as corpora
from gensim.models import CoherenceModel, LsiModel, LdaModel, HdpModel
import pyLDAvis.gensim
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer
stop_words = stopwords.words('english')

Импортируйте лист Excel и проверьте, был ли он успешно импортирован, распечатав его:

DataFrame = pd.read_excel('RealEstate.xlsx') 
DataFrame

Создайте метод лемматизации слов с помощью тегов POS:

def get_wordnet_pos(word):
tag = nltk.pos_tag([word])[0][1][0].upper()
tag_dict = {
        "default": wordnet.NOUN,
        "N": wordnet.NOUN,
        "V": wordnet.VERB,
        "J": wordnet.ADJ,
        "R": wordnet.ADV
    }
return tag_dict.get(tag, tag_dict['default'])

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

def Document_Cleansing(Document):
    
    Document = " ".join([word for word in Document.split() if len(word) > 3 ])
    Document = " ".join([word for word in Document.split() if word not in stop_words])
    Document = " ".join([WordNetLemmatizer().lemmatize(word, get_wordnet_pos(word)) for word in Document.split()])
    
    # This will make all the words in the documents lower-case:
    Document = Document.lower()
# This will remove everything related to HTML url's:
    Document = re.sub(r'(\<[ ]?[a-z]+>|\<\/[a-z]+\>)', ' ', Document)
    
    # removing emails
    Document = re.sub(r'\S+@\S+', ' ', Document)
    
    # removing \n terms:
    Document = re.sub(r'(\\n)', " ", Document)
    
    # removing numbers which contain commas:
    Document = re.sub(r'(\d+),(\d+),?(\d*)', " ", Document)
    
    # removing all numbers:
    Document = re.sub(r'(\+)?\d+[ ]?\d*[ ]?\d*[ ]?\d*', ' ', Document)
    
    # removing --
    Document = re.sub(r'--'," ", Document)
    
    # removing ambiguous characters (? ! : ; \n \)
    Document = re.sub('[*.?!,:;/&]', ' ', Document)
    
    return Document

Примените метод очистки документа к данным в импортированном листе Excel:

DataFrame['property_text_en'] = DataFrame['property_text_en'].apply(Document_Cleansing)

Токенизация данных в документах:

Documents_Data = DataFrame['property_text_en'].tolist()
Tokenized_Documents_Data = [nltk.word_tokenize(doc) for doc in text]

При использовании алгоритма LSA от Gensim нам нужно создать 2 вещи:

  • СЛОВАРЬ, содержащий все слова, а также их идентификаторы.
  • КОРПУС, содержащий все идентификаторы, а также количество обнаруженных слов в каждом документе.
Corpora_Dictionary = corpora.Dictionary(Tokenized_Documents_Data)
Corpus_Dictionary = [Corpora_Dictionary.doc2bow(doc) for doc in Tokenized_Documents_Data]

Создайте модель LSA и укажите необходимое количество тем. Мы решили выделить 15 тем:

LSI_Model = LsiModel(corpus = Corpus_Dictionary, num_topics = 15, id2word = Corpora_Dictionary)
LSI_Model.show_topics(num_topics = 15)

На этом этапе мы выполнили полный алгоритм LSA для наших данных. Чтобы проверить это, мы выполним небольшой запрос:

LSI_Model_Topics = [[word for word, prob in topic] for topicid, topic in LSI_Model.show_topics(formatted=False)]
Test = '2 bedrooms with balcony'
vec_bow = Corpora_Dictionary.doc2bow(Test.lower().split())
vec_lsi = LSI_Model[vec_bow]
vec_lsi

Дополнительный шаг: чтобы проверить схожесть между нашим запросом и всеми документами, мы напечатаем процент схожести:

File = similarities.MatrixSimilarity(LSI_Model[Corpus_Dictionary])
sims = File[vec_lsi]
sims = sorted(enumerate(sims), key = lambda item: -item[1])
for i, j in enumerate(sims):
    print('Document',j[0],'-- Similarity Percentage:',j[1], '\n')

ПРИМЕЧАНИЕ.

Этот блог и все исследования и кодирование, представленные выше, были результатом сотрудничества между мной (Абдулкарим Рашед) и Сарой Аль-Баштави. Мы работали вместе во время стажировки в UREKA EDUCATION GROUP, которая оказалась не чем иным, как увлекательным, веселым и прекрасным способом узнать о Data Science. Мы настоятельно рекомендуем всем, кто читает этот блог, проверить свой веб-сайт и зарегистрироваться на образовательные курсы и учебные программы, чтобы максимально использовать свободное время, которое у нас есть во время пандемии COVID-19!

Нажмите, чтобы перейти на сайт UREKA EDUCATION GROUP!

РЕСУРСЫ: