Ще ви трябват 5 минути, за да разберете и внедрите LDA в Python

Въведение

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

Благодарение на моделиране на теми, ера на обработка на естествен език, използвана за ефективно анализиране на големи немаркирани текстови данни чрез групирането/клъстерирането им в теми. Ще се опитаме да покрием техника за моделиране на теми, наречена LDA с Python.

LDA — Как работи

LDA означава латентно разпределение на Дирихле. Тази техника се опитва да открие теми от набор от документи, като използва вероятностно разпределение, базирано на следните допускания:

  • Предположение 1: Документи с подобни теми използват подобни групи от думи, което означава, че всички документи са вероятностни разпределения за латентни теми.
  • Предположение 2: Латентните теми могат да бъдат намерени чрез търсене на групи от думи, които обикновено се срещат заедно в документи в целия корпус, което означава, че темите са разпределения на вероятностите върху думите.

Внедряване на LDA

Основни стъпки

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

Относно данните

  • Това са новините на Australian Broadcasting Corporation, публикувани за период от осем години, достъпни на Kaggle. Тези данни имат две основни колони:
  • publish_date: дата на публикуване на статията във формат yyyyMMdd.
  • headline_text: текст на заглавието на английски език
  • Наборът от данни има

Зареждане на данни и избор на подмножество

Ред 6 показва (1226258, 2), което означава 1226258 реда и 2 колони. Тъй като имаме много редове, реших да избера подмножество от 20 000 реда, за да ускоря обработката. Тази операция се извършва в редове 9 и 10. Можете да промените номера на наблюдението, ако желаете.

Ред 13 показва 5 произволни реда от избраната проба, както е показано по-долу

Подготовка на данни за LDA

Изградете матрицата на термините на документа X

Не се интересуваме от колоната publish_data, тъй като ще използваме само данни от headline_text.

Дефинирайте обекта CountVectorizer както по-долу, игнорираме:

  • всички термини, които се срещат над 95% пъти в нашия документен корпус. Тъй като прагът max_df (0,95) означава, че термините, срещащи се повече от тази стойност, не са значими. В конкретния случай повечето от тях ще бъдат stopwords.
  • всички термини, които се срещат по-малко от три пъти (min_df = 3) в целия корпус.

Ред 9 показва следния резултат, което означава, че имаме 20 000 документа и 6425 различни думи.

<20000x6425 sparse matrix of type '<class 'numpy.int64'>'
	with 89645 stored elements in Compressed Sparse Row format>

Нека да разгледаме някои от тези думи/характеристики, които са извлечени от документите.

Ред 5 показва следните думи:

['zimbabwe', 'zimbabwean', 'zone', 'zones', 'zoo']

Изградете LDA модел

От нашата DTM матрица вече можем да изградим LDA модела за извличане на теми от подчертаните текстове. Броят на темите, които трябва да бъдат извлечени, е хиперпараметър и ние ще използваме 7 теми.
Тъй като LDA е итеративен алгоритъм, в нашия случай ще имаме 30 итерации, но стойността по подразбиране е 10. Стойността на случайното състояние може е всяка цифра и има за цел да възпроизведе същия резултат.

Показване на най-популярните думи по тема

От модела LDA вече можем да генерираме най-добрите думи от всяка от седемте теми.

Предишният код генерира следния изход.

THE TOP 10 WORDS FOR TOPIC #0
['weather', 'election', 'labor', 'urged', 'qld', 'act', 'council', 'nsw', 'new', 'govt']


THE TOP 10 WORDS FOR TOPIC #1
['report', 'indigenous', 'country', 'rural', 'charged', 'accused', 'new', 'health', 'calls', 'says']


THE TOP 10 WORDS FOR TOPIC #2
['queensland', 'charges', 'hospital', 'case', 'guilty', 'child', 'sex', 'murder', 'man', 'court']


THE TOP 10 WORDS FOR TOPIC #3
['face', 'england', 'years', 'win', 'australian', 'talks', 'wins', 'final', 'cup', 'world']


THE TOP 10 WORDS FOR TOPIC #4
['probe', 'dead', 'woman', 'killed', 'dies', 'car', 'crash', 'man', 'interview', 'police']


THE TOP 10 WORDS FOR TOPIC #5
['live', 'return', 'care', 'residents', 'test', 'australia', 'new', 'change', 'workers', 'day']


THE TOP 10 WORDS FOR TOPIC #6
['news', 'search', 'west', 'market', 'coronavirus', 'national', 'gold', 'farmers', 'sydney', 'coast']

Наблюдение: Изглежда

  • Тема 1 е по-ориентирана към правителството
  • Тема 3 изглежда е повече за спорта, отколкото за нещо друго

Прикрепете етикети за открити теми към оригинални документи

Ред 5 на кода показва: (20000, 7), което означава, че final_topics съдържа, за всеки от нашите 20 000 документа, вероятностния резултат от колко вероятно е даден документ да принадлежи към всяка от 7-те теми.

Ред 11 показва първите 5 документа и съответните им теми

Според нашия LDA модел:

  • първият и вторият документ принадлежат към 4-та тема.
  • третият и четвъртият документ принадлежат към 4-та тема.
  • петият документ принадлежи към 6-та тема.
  • и т.н.

Малко визуализация

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

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

Заключение

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

Допълнителни ресурси

Код на Github

„Извличане на теми с факторизация на неотрицателна матрица и латентно разпределение на Дирихле“

pyLDAvis