В този блог ще говорим за моделиране на теми, което е начин да разберете за какво става въпрос в текстовете и след това да ги групирате според съдържанието им.

Ще обсъдим и LSA и ще го покажем, приложен в Python за по-нататъшно обяснение. След това ще отправим запитване към кода, за да видим дали ни дава необходимите резултати, които са документи с теми, които трябва да бъдат свързани с темата на търсенето/заявката.

За да поясним, получихме тази информация от различни източници, които ще бъдат изброени в долната част на тази страница.

ЦЕЛИ:

  • Научете какво е тематично моделиране
  • Научете за LSA
  • Научете за векторния космически модел
  • Научете за TF-IDF
  • Научете повече за Carrot2 и неговите алгоритми
  • Плюсове и минуси на LSA
  • Случаи на използване на LSA
  • Код на Python за моделиране на LSA теми

За да започнем, първо трябва да обясним какво се има предвид под Тематично моделиране и каква е разликата между него и Тематична класификация.

Представете си, че току-що сте закупили нова библиотека, която е напълно празна и трябва да организирате няколко рафта и секции, за да поберете хилядите книги, които сте поръчали. Като цяло библиотеките са разделени според различните теми на книгите, като раздел за книги, свързани с медицината, друг раздел за религията, друг раздел за художествена литература и т.н. Сега си представете, че ще трябва да разберете общата идея зад всяка една книга в колекцията от хилядите, които сте поръчали. Освен досадното натоварване, с което ще се сблъскате, ще ви отнеме много време, за да измислите подходящите теми и раздели, за да организирате библиотеката си, и това дори не е предвид факта, че може да поръчате нова партида книги в близко бъдеще. За щастие имаме късмета да живеем в 21-ви век, в период от време, в който компютрите и машините непрекъснато работят, за да осигурят по-лесен живот за всички нас. Вземайки под внимание същия пример с библиотека, компютърът вече може да приеме хиляди документи като вход и да създаде произволен брой подходящи теми въз основа на съдържанието на тези документи, всичко това за секунди. Така че сега вместо да работите безкрайни часове, за да организирате библиотеката си, можете да накарате машина да върши цялата тежка работа, докато вие се наслаждавате на чаша кафе и четете любимия си роман. Този процес се нарича Тематично моделиране.

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

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

Както всяка задача в света, има различни начини за нейното изпълнение. В този блог ще се фокусираме основно върху латентния семантичен анализ (LSA). Данните, които ще използваме, са под формата на електронна таблица (Excel файл) и са от уебсайт за недвижими имоти в ОАЕ, наречен Property Finder.

Какво е LSA и как работи?

Случвало ли ви се е да прочетете касова бележка след покупка? Разписката основно показва всеки артикул, който сте закупили, по неговия идентификатор и колко пъти артикулът е бил повторен във вашата количка. Алгоритъмът LSA извежда подобен резултат. Докато преминава през всеки отделен документ, той продължава да брои думите, които среща, докато стигне до края, след което преминава към следващия документ, докато всички документи бъдат завършени. Резултатът трябва да бъде матрица, съдържаща различните думи като редове, различните документи като колони и броя на повторенията на всяка дума във всеки документ в клетките. Това се нарича Терм честотна матрица. След това алгоритъмът LSA извършва матрична декомпозиция върху матрицата на честотата на термина, използвайки метод, наречен декомпозиция на единична стойност. Процесът SVD ще намали матрицата на честотата на термините в 3 по-малки, наречени U, което свързва термините с темите, V, което свързва документите с темите, и S, което е диагонална матрица, съдържаща единични стойности в ред от най-високата към най-ниската. Единичните стойности са това, което представя темите от най-важните до най-малко важните. След това алгоритъмът LSA ще намали матриците до k брой измерения, в които k представлява броя на темите, които потребителят би искал да извлече от документацията.

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

С прости думи, векторният пространствен модел (VSM) в НЛП е модел в линейната алгебра, който представя текстов документ като вектор в някакво пространство, където идентификаторите във вектора са термините в този документ.

Матрица термин-документ има термини като редове и документи като колони:

Както можете да видите, това представяне е многоизмерно и не може да бъде визуализирано, но на следващата фигура е визуализация на произволно избрани измерения (думите битка и глупак), просто изяснете идеята.

Матриците Term-Document първоначално са дефинирани като средство за намиране на подобни документи за задачата за извличане на информация за документи. Където, както можете да видите на фигурата, векторите, които са подобни, имат подобни/свързани теми.

След като достигнем тази стъпка, ние претегляме матрицата на честотата на термина, като изпълняваме математическата функция 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 е основният алгоритъм за клъстериране, който създава описания на клъстери в стил Bag of Words (BoW).

За повече информация относно Carrot2 и неговите алгоритми за клъстериране ви предлагаме да прегледате съдържанието на самия уебсайт и ръководството. И двата ресурса са на дъното.

Професионалисти на LSA:

  • LSA се счита за най-простият метод за тематично моделиране, тъй като е лесен за разбиране и прилагане.
  • LSA предлага много по-точни резултати от векторния космически модел сам.
  • LSA е много по-бърз в сравнение с други алгоритми за моделиране на теми, тъй като включва само декомпозиция на матрицата на честотата на термина и нищо друго.

Минуси на LSA:

  • LSA не може да улови пълния синтаксис на изречение в документ, тъй като работи само с всяка дума самостоятелно.
  • LSA не дава толкова точни резултати, колкото алгоритъма HDP (Йерархичен процес на Дирихле).
  • LSA не извежда толкова точни резултати, колкото алгоритъма LDA (Latent Dirichlet Allocation).
  • Измерението на темата на LSA зависи от ранга на матрицата на честотата на термините, което означава, че не можем да разширим това ограничение.
  • LSA Decomposed Matrix е много плътна, което означава, че е трудно да се индексират отделни измерения.

Случаи на използване на 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')

ЗАБЕЛЕЖКА:

Този блог и всички изследвания и кодиране, представени по-горе, са съвместна работа между мен (Abdulkarim Rashed) и Sara Al-Bashtawi. Работихме заедно по време на нашия стаж с UREKA EDUCATION GROUPкоето се оказа нищо друго освен вълнуващо, забавно и прекрасен начин да научите за Data Science. Силно насърчаваме всички, които четат този блог, да проверят уебсайта си и да се регистрират за образователни курсове и учебни програми, за да се възползваме максимално от свободното време, което имаме по време на пандемията от COVID-19!

Щракнете за уебсайта на UREKA EDUCATION GROUP!

РЕСУРСИ: