Трябва да намерите подходящи думи или фрази в стотици или хиляди текстове? И искате ли да го направите на испански? Ако е така, тази статия може да ви помогне малко за това.

автоматично

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

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

Ако, от друга страна, не се интересувате от извличането на подходящи думи, но търсите да намалите броя на думите в даден текст, каня ви да разгледате друга моя статия: Намалете броя на думите в текст: stemming и радикализация (stemming) с python.

За да намерим подходящи термини в даден текст, ще разчитаме на граматичен анализ на изреченията, които го съставят. Има два начина да се възползвате от структурата на изречението: да видите кои думи са подредени една до друга, за да образуват все по-широки изречения (анализ в съставни части), или да наблюдавате как някои думи изискват или са подкрепата на други (анализ на зависимостите ).

В тази статия ще използваме втория тип анализ, защото го прави по-прозрачен кои думи са от съществено значение и кои не. И тъй като помага и за намирането на подходящи думи, които работят като една група (полезността на това ще видите по-късно).

Ще изпълним тази задача с библиотека, почти прясна от фурната: StanfordNLP.

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

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

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

Инсталация на библиотека

Библиотеката StanfordNLP се намира в директорията PyPI, така че можем да я инсталираме с pip от терминала:

$ pip инсталирайте stanfordnlp

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

Инсталиране на езиковите модели

Нека започнем с импортиране на библиотеката и изтегляне на моделите за испански от конзолата на Python:

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

Конфигурация на последователността на компонентите на StanfordNLP

StanfordNLP използва няколко компонента последователно, за да обработва лингвистичен вход. Тази последователност от компоненти (или конвейер) прави библиотеката разширяема, гъвкава и мащабируема. По този начин можем да използваме само компонентите, които са необходими за дадена задача, или да заменим един с по-подходящ. StanfordNLP изисква да предадем като аргумент езиковия модел, който ще използваме (в този случай lang = 'is', който беше моделът, който инсталирахме преди малко).

Ако изпълним последователността на компонентите по подразбиране, можем да добием представа какво може да направи тази библиотека:

Компонентите по подразбиране са следните:

  • токенизирам: Токенизатор. Разделете текст на изречения и изречения на думи.
  • mwt: Сложен токенизатор на думи. Разпознавайте думи като последващи действия или виртуален асистент.
  • поз: Класификатор на Word клас. Присвояване на категории като прилагателно или глагол на дума.
  • лема: Lematizer. Отнема дума и я трансформира в речник. Например, признайте, че речниковата форма на пеене е пеенето.
  • депарсиране: Анализатор на зависимости. Посочете функцията на дадена дума и посочете нейната връзка с други думи в същото изречение. Можете например да посочите, че в изречението Обичам шоколада фразата шоколад е обектът, обичан от говорещия.

Ако не искаме да използваме всички компоненти, можем да посочим кои ще изискваме по следния начин:

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

Ще тестваме библиотеката с прост пример. За това ще създадем обект от класа Document от nlp обект (от клас Pipeline), които изградихме по-рано. Този обект на документ ще съхранява резултата от анализа, направен от nlp.

С тези няколко реда сме обработили низ, съставен от няколко изречения. Обектът е списък на изреченията, които съставляват низа. Ако сте нов в Python или програмирането като цяло, всичко това означава, че целият ни анализиран низ се съхранява в doc и че с помощта на подходящите методи можем да имаме достъп до цялата тази информация.

Например мога да видя зависимостите на първото изречение (това в позиция 0 - първа позиция - в Python) по следния начин:

  • („Котки“, „4“, „nsubj“)
  • („Беше“, „4“, „ченге“)
  • („Едно“, „4“, „дет“)
  • („Филм“, „0“, „корен“)
  • („Наистина“, „6“, „advmod“)
  • („Ужасно“, „4“, „amod“)
  • („.“, „4“, „точен“)

Какво означава всичко това? Той описва случващото се в това изречение, посочва с номер думата, от която зависи друга, и ни казва функционалния клас на думата. Например, за този пример бихме могли да „превеждаме" следващият:

  • („Котки“, аз зависим от дума 4 и това е, кого държа за отговорен за това, което ще кажа, защото съм субект)
  • („Беше“, зависим от дума 4 и съм съпоставим глагол - тук съм само за да събера нещата -)
  • („Един“, аз зависим от дума 4 и съм определящ фактор - така че не ми обръщайте много внимание -)
  • („Филм“, аз съм най-важната дума тук и не завися от никого - аз съм на 0 - и съм коренът или ядрото на това изречение)
  • („Наистина“, аз зависим от дума 6 - на „ужасно“ - и аз съм модифициращо наречие)
  • („Ужасно“, зависим от дума 4 и съм прилагателно, което модифицира тази дума)
  • („.“, Аз зависим от 4 и аз съм точка - никой не се интересува от мен -)

Тези взаимоотношения могат да се видят и на следната графика:

Ядрото на изречение е дума, около която всички останали се въртят, пряко или косвено (имайте предвид, че всички пътеки свършват там). Ядрата допълват значението си с предмети: обекти (обикновено съществителни), които активно или пасивно участват в действия или които допълват семантиката на друга дума.

В този пример думата „филм“ сама по себе си не казва нищо. Започва да има смисъл, когато е до обект, в случая с Котки. Ние наричаме този обект, който се определя от субекта на филма (на английски език). Но на испански не можем да кажем филм „Котки“, а по-скоро отбелязваме връзката между ядрото и обекта в това изречение с глагола „Котките беше филм“. Смисълът е окончателно завършен, когато добавим модификатор към него (Котките бяха ужасен филм). И накрая, към този ужасен добавяме още един модификатор, в случая незадължителен, който показва колко сигурни сме в ужасното: като казваме наистина ужасно, казваме, че сме много сигурни в мнението си за филма.

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

Забележете, че тук можем да отделим две нива. Първият е свързан с нещо по-техническо и се състои в използването на StanfordNLP за анализ на зависимостите (разбор на зависимости) на текст. Второто ниво е свързано с нашето тълкуване на важността на категориите, получени в резултат на анализа. Ако ще търсим подходящи фрази и думи в испански текстове, ще трябва да решим, за вида на текста, какво ни интересува най-много: дали ядрата, обектите, модификаторите от определен тип или други. И подчертавам типа текст, тъй като всеки от тях ще приеме, че има някои класове думи, по-важни от други. Например при анализа на настроението най-разкриващите ще бъдат модификаторите. Но ако работите с туитове, може би това, което трябва да извлечете, са обектите и ядрата. Всеки тип текст и всяка цел, която имаме, ще повлияят на това, което трябва да търсим.

Нека да видим как става това с по-дълъг текст.

За да се задълбочим малко в темата, ще използваме като текст сегмент от рецензия на Rob Zombie Halloween II. Този сегмент е предоставен от портала Espinof.

Можем ли бързо да намерим най-подходящите фрази в тези параграфи? Разбира се, да. Просто трябва да решим какво да търсим и да напишем няколко реда код. Тъй като това е рецензия, ние се интересуваме от мнението на автора за филма: ако изглеждаше добър, скучен и т.н.

Обикновено при рецензия от този тип тази информация трябва да се намира индиректно в оценката, направена за различни аспекти на филма: че ако такъв актьор е приемлив, че ако сюжетът няма смисъл, че ако снимката е красива . Така че нека потърсим модификатори и модифицирани обекти (само модификаторът няма да ни каже кой елемент от филма се оценява).

С този код получаваме следния резултат:

  • стремително завръщане
  • вибриращ пулс
  • заговор
  • всички предсказуеми
  • трета секунда
  • Паралелно сглобяване
  • забавено връщане
  • Предсказуемо скучно
  • скучно повторение
  • творчески сцени
  • двойна игра
  • очевидна липса
  • нелепо конвенционално
  • ангелска майка
  • бял кон
  • прекомерна известност
  • неудобно присъствие
  • последен участък
  • дълго връщане
  • първоначален блясък
  • чудесна възможност

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

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

Обяснявам кода

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

След това ви показвам първите два елемента от списъка, който е резултат от зависимости (резултати за първите две думи: Котки и това беше).

С атрибута зависимости се показва списък с кортежи от три елемента: първият показва информация за думата, от която зависи (придружаваща дума); вторият елемент на кортежа представлява функционалния клас на думата; третият елемент показва информацията на думата, която се анализира. Можем да получим достъп до всеки елемент, който формира един от тези кортежи с индекс.

Но как да получим думите като такива от цялата тази информация? За това използваме текстовия атрибут след избор на първия и третия елемент на кортежа (индекси 0 и 2 съответно).

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

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

Ако се интересувате да се задълбочите повече по тази тема, можете да се консултирате с тетрадка на Юпитер, която подготвих за тази цел тук. Не е необходимо да инсталирате нищо, защото е направено със страхотен инструмент за онлайн сътрудничество, наречен Google Colab. Можете да направите копие на този бележник и да научите, като играете с кода, който ви представям там.