Како извући кључне речи из текста помоћу ТФ-ИДФ и Питхон'с Сцикит-Леарн

Давне 2006. године, када сам морао да користим ТФ-ИДФ за издвајање кључних речи у Јави, завршио сам исписујући сав код испочетка. Ни Дата Сциенце ни ГитХуб тада нису били ствар, а библиотеке су биле само ограничене.

Данас је свет много другачији. На Гитхуб-у имате неколико библиотека и спремишта отвореног кода који пружају пристојну имплементацију ТФ-ИДФ-а. Ако вам није потребна велика контрола над начином израчунавања ТФ-ИДФ математике, топло препоручујем поновно коришћење библиотека из познатих пакета као што су Спарк-ов МЛЛиб или Питхон-ов сцикит-леарн.

Један проблем који сам приметио са овим библиотекама је да су мислили као пред-корак за друге задатке као што груписање, тема моделирање, и текст класификација. ТФ-ИДФ се заправо може користити за издвајање важних кључних речи из документа како би се стекло утисак шта карактерише документ. На пример, ако имате посла са чланцима на Википедији, можете да користите тф-идф за издвајање речи које су јединствене за дати чланак. Ове кључне речи могу се користити као врло једноставан сажетак документа и за аналитику текста када ове кључне речи гледамо заједно.

У овом чланку ћу вам показати како помоћу сцикит-леарн можете извући кључне речи из докумената помоћу ТФ-ИДФ. То ћемо посебно урадити на скупу података преливања стека. Ако желите приступ целој Јупитер бележници , молимо вас да пређете на мој репо.

Важна напомена: Претпостављам да су људи који прате овај водич већ упознати са концептом ТФ-ИДФ. Ако нисте, упознајте се са концептом пре него што прочитате даље. Постоји неколико видео записа на мрежи који дају интуитивно објашњење о чему се ради. За више академско објашњење, препоручио бих објашњење мог доктора наука.

Скуп података

У овом примеру ћемо користити низ података Стацк Оверфлов који је помало бучан и симулира оно са чиме бисте могли да се бавите у стварном животу. Овај скуп података можете пронаћи у мом репо упутству.

Приметите да постоје две датотеке . Већа датотека, stackoverflow-data-idf.jsonса 20.000 постова, користи се за израчунавање инверзне учесталости докумената (ИДФ). Мања датотека, stackoverflow-test.jsonса 500 постова, користила би се као тестни скуп за издвајање кључних речи. Овај скуп података заснован је на јавно доступној депонији Стацк Оверфлов-а из Гоогле-овог Великог упита.

Завиримо у наш скуп података. Доњи код чита један по линији јсон низ из data/stackoverflow-data-idf.jsonоквира података панде и исписује његову шему и укупан број постова.

Овде lines=Trueједноставно значи да сваки ред у текстуалној датотеци третирамо као засебан јсон низ.

Приметите да овај скуп података о преливању стека садржи 19 поља, укључујући наслов поста, тело, ознаке, датуме и друге метаподатке који нам нису потребни за овај водич. За овај водич нас највише занима тело и наслов. Они ће постати наш извор текста за издвајање кључних речи.

Сада ћемо створити поље које комбинује обоје bodyи titleтако имамо два у једном пољу. Такође ћемо одштампати други унос текста у нашем новом пољу само да бисмо видели како текст изгледа.

Ух, ово не изгледа баш читљиво! Па, то је због читавог чишћења pre_process(..). Можете да урадите много више ствари pre_process(..), као што су уклањање свих одељака кода и нормализација речи до њеног корена. Ради једноставности, извршићемо само благу претходну обраду.

Стварање речника и броја речи за ИДФ

Сада треба да створимо речник и започнемо процес бројања. Можемо користити ЦоунтВецторизер да створимо речник од целог текста у нашем df_idf['text'], а затим следи бројање речи у речнику:

Резултат последња два реда из горњег кода је оскудна матрична репрезентација бројања. Свака колона представља реч у речнику. Сваки ред представља документ у нашем скупу података, где су вредности бројеви речи.

Имајте на уму да би код овог представљања број неких речи могао бити 0 ако се реч није појавила у одговарајућем документу.

Овде прослеђујемо два параметра ЦоунтВецторизер-у max_dfи stop_words. Прва је само занемаривање свих речи које су се појавиле у 85% докумената, јер оне могу бити неважне. Следећа је прилагођена листа заустављања речи. Такође можете да користите заустављање речи које су изворне за склеарн подешавањем stop_words='english'. Списак зауставних речи коришћен за овај водич можете пронаћи овде.

Добијени облик word_count_vectorје (20000,124901), јер у нашем скупу података (редови) имамо 20 000 докумената, а величина речника је 124 901.

У неким апликацијама за руковање текстом, као што су груписање и класификација текста, обично ограничавамо величину речника. Заиста је лако то учинити подешавањем max_features=vocab_sizeприликом инстанцирања ЦоунтВецторизер-а. За овај водич, ограничимо речник на 10.000:

Погледајмо сада 10 речи из нашег речника:

['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Слатко, ово су углавном повезане са програмирањем.

ТфидфТрансформер за израчунавање ИДФ-а

Сада је време за израчунавање ИДФ вредности.

У доњем коду у основи преузимамо проређену матрицу од ЦоунтВецторизер ( word_count_vector) да бисмо генерисали ИДФ када позовете fit(...):

Изузетно важна ствар : ИДФ би се увек требао заснивати на великим корпусима и требало би да представља текст текстова које бисте користили за издвајање кључних речи. На мрежи сам видео неколико чланака који израчунавају ИДФ користећи прегршт докумената. Поразит ћете цијелу сврху пондерисања ИДФ-а ако се не заснива на великим корпусима као:

  1. ваш речник постаје премали и
  2. имате ограничену способност посматрања понашања речи за које знате.

Рачунање ТФ-ИДФ и издвајање кључних речи

Једном када израчунамо свој ИДФ, спремни смо да израчунамо ТФ-ИДФ, а затим извучемо кључне речи из вектора ТФ-ИДФ.

У овом примеру ћемо издвојити главне кључне речи за питања у data/stackoverflow-test.json. Ова датотека података садржи 500 питања са пољима идентичним онима која data/stackoverflow-data-idf.jsonсмо видели горе. Започећемо са читањем наше тест датотеке, издвајањем потребних поља - наслова и текста - и стављањем текстова на листу.

Следећи корак је израчунавање вредности тф-идф за дати документ у нашем скупу тестова позивањем tfidf_transformer.transform(...). Ово генерише вектор тф-идф резултата.

Даље, сортирамо речи у вектору у опадајућем редоследу вредности тф-идф, а затим извршавамо итерацију да бисмо издвојили топ-н кључне речи. У доњем примеру издвајамо кључне речи за први документ из нашег скупа тестова.

sort_coo(...)Метод суштини сортира вредности у вектору чувајући индекс колоне. Једном када добијете индекс колоне, заиста је лако потражити одговарајућу вредност речи као што бисте видели extract_topn_from_vector(...)тамо где то радимо feature_vals.append(feature_names[idx]).

Неки резултати!

У овом одељку ћете видети питање преливања стека праћено одговарајућим издвојеним кључним речима.

Питање о интеграцији додатка Ецлипсе

Од кључних речи изнад, топ кључне речи заправо смисла, говори се о eclipse, maven, integrate, war, и tomcat, који су сви јединствени у овом конкретном питању.

Постоји неколико кључних речи које су могле бити елиминисане, possibilityа можда чак и project. То можете учинити додавањем још уобичајених речи на вашу зауставну листу. Можете чак и да направите свој властити скуп стоп листа, врло специфичних за ваш домен.

Погледајмо сада још један пример.

Питање о СКЛ увозу

Чак и са свим хтмл ознакама, због претходне обраде, овде смо у стању да издвојимо прилично лепе кључне речи. Последња реч appropriatelyквалификовала би се као зауставна реч. Можете наставити да покрећете различите примере да бисте добили идеје о томе како прецизно подесити резултате.

Воила! Сада можете извући важне кључне речи из било које врсте текста!

Ресурси

  • Пун изворни код и скуп података за овај водич
  • Скупите податке о преливу на Гоогле-овом БигКуери-у

Пратите мој блог да бисте сазнали више о рударству, НЛП-у и машинском учењу из примењене перспективе.

Овај чланак је првобитно објављен на кавита-ганесан.цом.