Практическо сравнение на алгоритми за моделиране на теми без надзор

Преглед

Работата с големи колекции от неструктурирани текстови данни може да бъде много трудна. За разлика от обичайните техники за обработка на естествен език, които включват задачи за класифициране на текст, моделирането на теми е малко по-различно.

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

В тази статия ще проведем сравнителен анализ на три различни алгоритъма за моделиране на теми и ще оценим тяхното представяне с помощта на набор от данни за средни статии.

Първо, нека разгледаме по-подробно всеки алгоритъм:

Латентно разпределение на Дирихле (LDA)

Алгоритъмът LDA моделира корпус върху основна колекция от теми, използвайки йерархичен байесов модел на три нива [1]. Всяка тема има „разпределение на вероятностите“ въз основа на думите, които съдържа. Например, ако сме идентифицирали три теми с помощта на LDA – „здраве“, „бизнес“ и „електронна търговия“ – и прилагаме LDA, за да идентифицираме статия за текуща бизнес тенденция, алгоритъмът може да присвои вероятности от 0,1 за „ здраве“, 0,5 за „електронна търговия“ и 0,9 за „бизнес“. Това означава, че статията най-вероятно е за „бизнеса“, но може да съдържа и някои елементи от темата „електронна търговия“.

Факторизиране на неотрицателна матрица (NNMF)

NNMF работи, като разбива голяма матрица от данни на две по-малки матрици, едната за теми, а другата за тегла. Ключовата характеристика на NNMF е, че той позволява само неотрицателни стойности в двете по-малки матрици, което означава, че получените теми и тегла винаги ще бъдат неотрицателни и могат да се тълкуват като вероятности [2]. Това може да бъде много полезно при групиране на документи, тъй като гарантира, че всеки документ има положителен принос от всяка от идентифицираните теми.

Намаляване на размерността с помощта на пресечен SVD (известен още като LSA)

Декомпозицията на съкратената единична стойност (SVD) е метод, използван за намаляване на размерността на характеристиките, като същевременно запазва най-важната информация. Тази техника е особено полезна за анализ на текст, където броят на уникалните думи в документа може да бъде много голям, но намаляването на броя на думите ще запази най-важните връзки между тях и ще намали времето за изчисление.

Сравнителен анализ

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

Набор от данни

Наборът от данни за средни статии, използван в този анализ, е получен от Kaggle с около 190k+ реда. Наборът от данни обхваща различни теми от статии, публикувани между 2012 г. и 2022 г. в Medium.

Променливите, включени в набора от данни, са:

  • заглавие: Заглавието на статията.
  • текст: Текстовото съдържание на статията.
  • url: URL адресът, свързан със статията.
  • автори: Авторите на статията.
  • timestamp: дата и час на публикуване на статията.
  • Етикети:Свързани тагове с всяка статия.

За повече подробности относно набора от данни вижте 190k+ средни статии.

Преди сравнението е проведен EDA за описателен анализ. Можете да намерите подробния EDA на Jupyter Notebook в моя GitHub.

Предварителна обработка на текст

Тъй като сме загрижени за неконтролирано моделиране на теми, ще запазим само колоната с текст на статията за по-нататъшен анализ и ще вземем отново данните, за да изберем на случаен принцип 10 000 статии.

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

  • Нормализиране на текста.
  • Премахнете специални знаци и URL адреси, като използвате модел на регулярен израз.
  • Токенизирайте текста в списък с думи.
  • Премахнете стоп думите.
  • Лематизирайте списък от думи в неговите корени.

След като завършите тези стъпки, сега текстовите данни са готови за по-нататъшен анализ с моделиране на теми.

Метрика за оценка

При неконтролирано тематично моделиране няма ясно „правилно“ етикетиране на темите, така че е трудно да се оцени ефективността на моделите с помощта на традиционни класификационни показатели.

Една популярна метрика за оценка на моделиране на теми е кохерентността, която измерва степента, до която най-человечните думи в дадена тема са семантично свързани. По-висок резултат за съгласуваност показва, че темата съдържа думи, които са по-тясно свързани по значение.

За да сравним резултатите за кохерентност на различни алгоритми, ще използваме конвейера за кохерентност на темите на Gensim библиотека.

· Забележка:Този конвейер поддържа само LDA Gensim модел, за да оцените неподдържаните модели, трябва да подадете списък с най-добрите n думи, свързани с темите на модела.

Конвейер за моделиране на теми

Сега можем да конструираме конвейер и да го увием във функция;

  • Трансформирайте текстови данни с помощта на нашата персонализирана функция.
  • Изградете модели, като използвате всеки от посочените алгоритми: LDA, NNMF и LSA.
  • Извлечете първите n свързани думи от всеки модел.
  • Начертайте първите n думи, за да визуализирате връзките между тях.
  • Изчислете резултатите за кохерентност за всеки модел.
  • Съхранявайте всеки резултат за кохерентност на модела.

Практическо изпълнение на тези стъпки:

def topic_modeling_pipeline(df=text):
    '''
    Description: topic modeling pipeline for 3 algorithms.

    INPUT:
        - df(dataframe): A dataframe containing text data.

    OUTPUT:
        - df_results(dataframe): A dataframe containing the results 
          of each model and its coherence score.

    '''
    # set vectorizer to custom function
    vectorizer = CountVectorizer(tokenizer=tokenize)
    # to reduce computational time 10 topics are enough for comparison
    num_topics = 10 
    num_top_words = 15 # number of words to be visualized

    # the three models to be compared
    models = [('LDA', LatentDirichletAllocation(n_components=num_topics)),
              ('NMF', NMF(n_components=num_topics)),
              ('LSA', TruncatedSVD(n_components=num_topics))]

    results = [] # empty list to store scores

    # pipeline for each model 
    for name, model in models:
        pipeline = Pipeline([
            ('vectorizer', vectorizer),
            ('model', model)
        ])

        # only pass X, there is no Y 
        pipeline.fit(df['text'])

        topics = [] # empty list of topics for each model

        feature_names = vectorizer.get_feature_names_out() # tokenized text
        # loop through every topic and get top 15 words
        for topic_idx, topic in enumerate(model.components_):
            topic_tokens = [feature_names[i] for i in 
            topic.argsort()[:-num_top_words - 1:-1]]
            topics.append(topic_tokens)

        # calculate coherence score 
        coherence = get_coherence_score(model, topics)

        # append scores to results list
        results.append((name, coherence))

        # visualizing top words for each topic
        visualize_top_words(topics, 
        f'Figures of words associated with each topic for {name} Model')
        print()

    # stroring the results in a dataframe
    df_results = pd.DataFrame(results, columns=['Model', 'Coherence Score'])

    return df_results

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

Резултати от оценката

Моделът NNMF постигна резултат за кохерентност от 0,58, което е значително по-високо от другите модели. Това предполага, че темите, генерирани от модела NNMF, са по-последователни и интерпретируеми от тези, генерирани от други модели.

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

Брой теми — Интерпретация на резултатите

Моделът NNMF беше тестван за различен брой теми, вариращи от 2 до 20. Резултатите за съгласуваност за всеки брой теми са показани на Фигура 3. Въз основа на резултатите за съгласуваност изглежда, че най-кохерентният брой теми е 4, с резултат за кохерентност 0,59. Въпреки това, други теми, като 10 и 18, също имат относително високи резултати за съгласуваност и значително по-широк избор от теми.

Като се има предвид, че има около 10 000 статии в набора от данни за теми, които трябва да бъдат обобщени, 4 е много малък брой за теми. 10 теми биха били по-идеален избор и все още получават високи резултати за съгласуваност.

Настройка на хиперпараметри

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

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

Best hyperparameters: {'alpha_H': 0.01, 'alpha_W': 0.01}
Best score: 0.581

Заключение

Чрез оценката на три алгоритъма за моделиране на теми — LDA, NNMF и LCA — беше установено, че NNMF показва най-добри резултати и резултати за кохерентност за 10 различни теми. Въпреки известното представяне на NNMF върху малки до средни набори от данни, ние открихме, че се представя изключително добре в този корпус.

Могат обаче да бъдат направени възможни подобрения за оптимизиране на производителността на NNMF върху още по-големи набори от данни. По-задълбоченият анализ може също така да включва изследване на въздействието на различни хиперпараметри върху производителността на алгоритмите, както и тестване на алгоритмите върху различни типове текстови данни, за да се оцени тяхната възможност за обобщаване. Независимо от това, трудността при управлението и обработката на големи набори от данни при моделиране на теми може да доведе до дълги времена за обработка и може да изисква значителни ресурси.

Препратки

[1] Блей, Дейвид М., Андрю Й. Нг и Майкъл И. Джордан. „Латентно разпределение на Дирихле.“ Journal of machine Learning research 3, no. януари (2003): 993–1022.

[2] Xu, Wei, Xin Liu и Yihong Gong. „Групиране на документи на базата на факторизация на неотрицателна матрица.“ В Процедури от 26-та годишна международна конференция на ACM SIGIR за изследвания и разработки в областта на извличането на информация, стр. 267–273. 2003 г.

· Налична документация за Scikit-Learn: тук

· Оценка на тематични модели: латентно разпределение на Дирихле (LDA)

Благодаря ви, че отделихте време да прочетете това. Ако имате някакви коментари или предложения, моля, не се колебайте да се свържете с мен, като оставите коментар за тази публикация или ми изпратите съобщение в Twitter или LinkedIn.

Всички подходящи кодове са налични в моето хранилище на GitHub.