Дістаємо ключові слова з тексту на Python з допомогою NLP

В мережі вже є купа мануалів та прикладів того, як на пайтон можна дістати ключові слова (Extract Keywords) з тексту. Мені захотілось трохи розібратись в цій темі, тому вирішив дістати ключові слова з опису вакансій. 

Початкові умови

  • мова - англійська,
  • велика кількость тексту (більше 3000 знаків),
  • вакансія стосується айті,
  • бібліотеки для аналізу тексту використовуємо "as is" без додаткових оптимізацій та покращень. Максимум - використовуємо список стоп слів.

Навмання взяв вакансію з доу, на якій було доволі багато тексту: https://jobs.dou.ua/companies/allstars-it/vacancies/208565/. Це вакансія QA Automation Engineer (Python) в якійсь компанії. Тут є опис компанії, проекту, вимоги до кандидата та інші деталі. Текст вакансії:

We are looking for QA Automation Engineer for an innovative start-up that is developing a psychology-driven platform based on AI technology.

About Your Future Project:
Our client’s a promising and innovative Israeli-based start-up developing a behavior prediction platform. Motiv8AI is the pioneer behind EmpathAI™, a patented and field-proven behavioral prediction technology that leverages on psychological methodologies and advanced mathematical modeling to predict the future actions of an individual.
Headquartered in Tel Aviv, Motiv8AI has spent five years of dedicated research with leading psychologists and AI experts to arrive at a behavioral prediction solution that can create a multi-dimensional depiction of an individual’s personality. From this, future actions and interactions are simulated with unparalleled precision, at scale and near real-time.

By connecting with an individual’s mobile app, EmpathAI™ is able to build psychological constructs through the deployment of feature engineering and machine learning. Our novel machine-learning algorithm continuously fine-tunes predictions by integrating with ongoing digital footprints, mobile device metadata, and peer-group interactions.
The EmpathAI™ platform has demonstrated a 22% increase in business performance spanning millions of users. We serve sizable industries, including the Finance, E-Commerce, HR, and Insurance sectors, all of which have reported double-digit growth.

Specialization — AI, QA, Machine Learning
Headquarters — Tel Aviv, Israel
Years on the market — since 2020

Required skills:
At least 3 years of proven experience as a Test Automation Engineer, in Python, with a focus on Mobile mainly
At least 1 year of experience as a manual Quality Engineer
Proven Experience with building test automation infrastructure and frameworks from scratch and integration into CI pipeline
Good understanding of quality methodologies, testing tools, and the development process, including Continuous Testing, Continuous Integration (CI) and Agile
Diverse capabilities and willingness to do whatever it takes to deliver high-quality products under tight resources, including manual testing when needed
Excellent knowledge in testing infrastructure tools like Pytest, Git, Mobile Testing farms, or GitLab-CI
Good familiarity with iOS, Android, Mac, and Linux platforms
Upper-Intermediate level of English

You are a rock star if you have:
Experience with SDK test automation and data-driven
Your Scope of work:
You will be part of our growing quality assurance team for a world-class AI software platform:
-Build, execute and maintain our automation infrastructure, test automation, and manual software testing of motiv8ai’s Mobile and cloud applications
-Work directly under the QA Manager and own features End-to-End and work back-to-back with the development and product teams, in order to derive the full testing needs and plans
-Collaborate with an agile multi-disciplinary team, manage defect tracking, monitor and communicate results

Why AllSTARSIT?
Flexible working model: work from anywhere or choose one of our offices in Warsaw, Kyiv, Lviv, Prague, Bogotá, Dubai and premium coworking spaces with luxury amenities in 23 cities around the world.
Learning & Development program: we offer a team of senior developers, mentorship program, individual budget for self-education, free English, Spanish, and Polish courses, English for kids, regular tech & educational meetups, ability to become a meetup speaker, and online course subscriptions, among other perks and opportunities.
Wellness program: extended medical insurance, yoga & stretching, personal psychologist, sport/hobby compensation, Covid19/flu vaccination, rewarding culture, and unique corporate gifts.
Balanced lifestyle: workation programs, memorable corporate parties abroad, team building activities, Happy Fridays, family events, and charity events.

Тексту багато, він англйською мовою і тут більш ніж 3300 символів без пробілів. 

Текст вакансії в прикладах коду позначений як TEXT.

Які слова я б обрав?

Переглянувши текст вакансії, я б обрав наступні ключові слова: Test Automation Engineer, Python, Pytest, Git, CI, Upper-Intermediate. При тому що це чисто на інтуітивному рівні, те на що я б звернув увагу в першу чергу, аби розглядав вакансію. 

Спроуємо наступні бібліотеки:

  1. Rake (rake-nltk якщо точніше)
  2. yake
  3. KeyBERT
  4. spacy
  5. TextRank

Rake


RAKE (Rapid Automatic Keyword Extraction) - це відомий метод вилучення ключових слів, який знаходить найбільш релевантні слова або фрази у фрагменті тексту за допомогою набору стоп-слів і роздільників. Rake NLTK – це розширена версія RAKE, яка підтримується NLTK.

Більше інформації: https://github.com/csurfer/rake-nltk

Встановлення: pip install rake-nltk

from rake_nltk import Rake

r.extract_keywords_from_text(TEXT) 
rankedList = r.get_ranked_phrases_with_scores()
for keyword in rankedList[:10]:
keyword_updated = keyword[1].split()
keyword_updated_string = " ".join(keyword_updated[:3])
print((keyword_updated_string, keyword[0]))
  

Ми беремо тільки перші 10 варіантів. Кількість слів у ключивій фразі ми обмежили трьома першими словами.

Результат:

('market — since', 35.0)
('machine learning headquarters', 25.583333333333336)
('testing infrastructure tools', 20.30952380952381)
('manual quality engineer', 16.5)
('business performance spanning', 16.0)
('memorable corporate parties', 15.5)
('learning algorithm continuously', 15.25)
('pioneer behind empathai', 15.0)
('ci pipeline good', 14.166666666666666)
('growing quality assurance', 13.75)
('proven behavioral prediction', 13.5)

Yake


Yet Another Keyword Extractor (Yake) - бібліотека вибирає найважливіші ключові слова за допомогою методу статистичних ознак тексту. За допомогою Yake ви можете контролювати кількість витягнутих ключових слів та інші функції.

Більше інформації: https://github.com/LIAAD/yake

Встановлення: pip3 install yake

import yake 

kw_extractor = yake.KeywordExtractor()
keywords = kw_extractor.extract_keywords(TEXT)
for kw in keywords[:10]:
print(kw)

Набагато менше коду. Результат:

('psychology-driven platform based', 0.016053881734942575)
('Israeli-based start-up developing', 0.029593236691757063)
('innovative Israeli-based start-up', 0.031052706413707942)
('Test Automation', 0.032390169295336814)
('Test Automation Engineer', 0.04692416591524621)
('Automation', 0.049528927354166384)
('Automation Engineer', 0.04992127166791937)
('testing', 0.0512786637232601)
('Tel Aviv', 0.05166831940639215)
('Future Project', 0.057097605230063235)

KeyBERT

KeyBERT - простий у використанні алгоритм вилучення ключових слів, який використовує переваги вбудовування SBERT для створення ключових слів і ключових фраз з документа, які є найбільш схожими. KeyBERT використовує попередньо навчені моделі на основі трансформатора huggingface. За замовчуванням використовується модель all-MiniLM-L6-v2.

Більше інформації: https://maartengr.github.io/KeyBERT/

Встановлення: pip install keybert

from keybert import KeyBERT

model = KeyBERT()
keywords = model.extract_keywords(TEXT)
for kw in keywords[:10]:
print(kw)

Доволі лаконічно і просто. Відпрацьовує довше за попередні бібліотеки. Результат:

('motiv8ai', 0.4326)

('ai', 0.3999)

('predict', 0.3662)

('automation', 0.3628)

('empathai', 0.3606)

spacy

Space - багатофункціональна бібліотека для NLP, проет нас цікавлять тільки ключові слова. Для опрацювання тексту підключимо модель en_core_web_sm. Це доволі проста модель для англійської мови, оптимізована для CPU та займає близько 12 мегабайт.

Більше інформації: https://spacy.io/

Встановлення: pip install spacy

import spacy
from collections import Counter
PUNCTUATION = "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~’—"

nlp = spacy.load("en_core_web_sm")

def get_hotwords(text):
result = []
     pos_tag = ['PROPN', 'ADJ', 'NOUN'] 
doc = nlp(text.lower())
for token in doc:
if(token.text in nlp.Defaults.stop_words or token.text in PUNCTUATION):
  continue
if(token.pos_ in pos_tag):
result.append(token.text)
return result

output = set(get_hotwords(TEXT))
most_common_list = Counter(output).most_common(10)
for item in most_common_list:
print(item[0])

В даному випадку ми використали стоп слова з завантаженої моделі та знаки пунктуації (PUNCTUATION). В результаті, ми отримали 10 ключових слів: 

assurance
gitlab
linux
business
knowledge
behavioral
class
perks
capabilities
users

TextRank

TextRank — це неконтрольований метод вилучення ключових слів і речень. Він заснований на графах, де кожен вузол є словом, а ребра представляють відносини між словами, які формуються шляхом визначення спільних слів у рухомому вікні попередньо визначеного розміру.Цей метод був натхненний алгоритмом PageRank, який створила гугл для ранжування результатів упошуковій видачі.

Більше інформації: https://github.com/davidadamojr/TextRank

Встановлення: pip install summa

from summa import keywords

res = keywords.keywords(vacancy.content, scores=True)
print(res[0:10])

Результат:

('test', 0.23693750196544497), 

('testing', 0.23693750196544497), 

('platforms', 0.18976466272592876), 

('program', 0.16099603396574114), 

('programs', 0.16099603396574114), 

('quality', 0.1496072189629141), 

('ai', 0.14736200089556228), 

('mobile', 0.14158290528767245), 

('psychology platform', 0.13967469684166395), 

('courses', 0.13033213122029938)

Висновки

Як бачите, жоден з підходів не показав задовільного результату без додаткової оптимізації та доналаштувань. Впевнений, що можна отримати більш якісні результати, пропрацювавши мінус слова для кожної з моделей. 

Окрім того, для spacy можна було використати більший датасет (наприклад en_core_web_trf) а для KeyBERT модель all-mpnet-base-v2 і отримати кращі результати. Більше того, треба погратись з ngram параматреми, і були б більш релевантні показники. 

Що ще глянути по темі:

1. Four of the easiest and most effective methods to Extract Keywords from a Single Text using Python

2. Keyword Extraction Methods from Documents in NLP