13 ноября 2020

πŸ”₯ Β«Π›ΡŽΠ±Π»ΡŽΒ» ΠΈ Β«Π½Π΅Π½Π°Π²ΠΈΠΆΡƒΒ»: Π°Π½Π°Π»ΠΈΠ· ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ΠŸΠΈΡˆΡƒ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠΆΡƒ ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ IT-ΡΡ‚Π°Ρ‚ΡŒΠΈ. На proglib написал 140 ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². УвлСкаюсь Python, Π²Π΅Π±ΠΎΠΌ ΠΈ Data Science. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³Ρƒ – ссылки Π½Π° соцсСти ΠΈ мСссСндТСры: https://matyushkin.github.io/links/ Если понравился ΡΡ‚ΠΈΠ»ΡŒ излоТСния, упорядочСнный список ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ β€” https://github.com/matyushkin/lessons
РСшаСм Data Science-Π·Π°Π΄Π°Ρ‡Ρƒ опрСдСлСния ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ spaCy ΠΈ стопки Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΠΉ Π½Π° Ρ„ΠΈΠ»ΡŒΠΌΡ‹. Π‘Π΅Π½Ρ‚ΠΈΠΌΠ΅Π½Ρ‚-Π°Π½Π°Π»ΠΈΠ· Π² дСйствии.
πŸ”₯ Β«Π›ΡŽΠ±Π»ΡŽΒ» ΠΈ Β«Π½Π΅Π½Π°Π²ΠΈΠΆΡƒΒ»: Π°Π½Π°Π»ΠΈΠ· ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Π­Ρ‚Π° публикация прСдставляСт собой Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Кайла Бтратиса Use Sentiment Analysis With Python to Classify Movie Reviews. Π‘Π½Π°Ρ‡Π°Π»Π° Π² этой ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ этапы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с тСкстом, скрытыС Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° spaCy, ΠΏΠΎΡ‚ΠΎΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ практичСской Π·Π°Π΄Π°Ρ‡ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² Π½Π° IMDB рассматриваСтся процСсс построСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для сСнтимСнт-Π°Π½Π°Π»ΠΈΠ·Π°. ВСкст ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π° Jupyter.

***

Анализ Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (сСнтимСнт-Π°Π½Π°Π»ΠΈΠ·) – инструмСнт ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ лингвистики, ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΡƒΡŽ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ тСкста, ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡˆΡƒΡ‰Π΅Π³ΠΎ. Часто это составляСт Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ для ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ β€” Ρ‡Ρ‚ΠΎ ΡƒΠΆ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Однако ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ окраску тСкста всС-Ρ‚Π°ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов экосистСмы Python.

Π—Π°Ρ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ? БущСствуСт мноТСство ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ для Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкста. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ практичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΠΈΡ€ΠΆΠ΅Π²Ρ‹Ρ… Ρ‚Ρ€Π΅ΠΉΠ΄Π΅Ρ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΠΎ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°ΠΌ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΡ‚Π·Ρ‹Π²Π°ΠΌ.

Π’ этом руководствС ΠΌΡ‹ рассмотрим:

  • Π² Ρ‡Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ СстСствСнного языка (Π°Π½Π³Π». natural language processing, NLP);
  • ΠΊΠ°ΠΊ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ для опрСдСлСния Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ тСкста;
  • ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ spaCy для создания классификатора Π°Π½Π°Π»ΠΈΠ·Π° настроСний.

Π”Π°Π½Π½ΠΎΠ΅ руководство ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ² машинного обучСния.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ очистка тСкстовых Π΄Π°Π½Π½Ρ‹Ρ…

Π›ΡŽΠ±ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… начинаСтся с ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ (pipeline) ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

  • Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкст – Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ тСкст Π½Π° прСдлоТСния, слова ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹;
  • ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ стоп-слова;
  • привСсти слова ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅;
  • Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ тСксты – ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ числовыС прСдставлСния тСкстов для ΠΈΡ… дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ классификатором.

ВсС эти шаги слуТат для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΡˆΡƒΠΌΠ°, присущСго Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ тСксту, ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ точности Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² классификатора. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π΅ΡΡ‚ΡŒ нСсколько ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, NLTK, TextBlob ΠΈ spaCy. ПослСднюю ΠΌΡ‹ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² этом руководствС.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΠ΄Ρ‚ΠΈ дальшС, установитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ spaCy ΠΈ модСль для английского языка:

        pip install spacy
python -m spacy download en_core_web_sm
    
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°
ИспользованиС spaCy для тСкстов Π½Π° русском языкС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано Π² README-Ρ„Π°ΠΉΠ»Π΅ рСпозитория spacy-ru.

ВокСнизация

ВокСнизация – это процСсс разбиСния тСкста Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ spaCy ΡƒΠΆΠ΅ встроСн ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ (pipeline), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ тСкста с Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ этом руководствС ΠΌΡ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ тСкст Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ слова. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅:

        import spacy
nlp = spacy.load("en_core_web_sm")

text = """
Dave watched as the forest burned up on the hill,
only a few miles from his house. The car had
been hastily packed and Marta was inside trying to round
up the last of the pets. "Where could she be?" he wondered
as he continued to wait for Marta to appear with the pets.
"""

doc = nlp(text)
token_list = [token for token in doc]

print(token_list)
    
        [
, Dave, watched, as, the, forest, burned, up, on, the, hill, ,, 
, only, a, few, miles, from, his, house, ., The, car, had, 
, been, hastily, packed, and, Marta, was, inside, trying, to, round, 
, up, the, last, of, the, pets, ., ", Where, could, she, be, ?, ", he, wondered, 
, as, he, continued, to, wait, for, Marta, to, appear, with, the, pets, ., 
]
    

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π·Π½Π°ΠΊΠΈ прСпинания ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ строки, Π½Π΅ относящиСся ΠΊ словам. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² случаС использований ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ стоп-слов

Π‘Ρ‚ΠΎΠΏ-слова – это слова, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² чСловСчСском ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ смысла для машин. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° spaCy поставляСтся со списком стоп-слов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ). ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ списка:

        filtered_tokens = [token for token in doc if not token.is_stop]
print(filtered_tokens)
    
        [
, Dave, watched, forest, burned, hill, ,, 
, miles, house, ., car, 
, hastily, packed, Marta, inside, trying, round, 
, pets, ., ", ?, ", wondered, 
, continued, wait, Marta, appear, pets, ., 
]
    

Одной строкой Python-ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π»ΠΈ стоп-слова ΠΈΠ· Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² .is_stop. ПослС удалСния стоп-слов список стал ΠΊΠΎΡ€ΠΎΡ‡Π΅, исчСзли мСстоимСния ΠΈ слуТСбныС слова: Π°Ρ€Ρ‚ΠΈΠΊΠ»ΠΈ, ΡΠΎΡŽΠ·Ρ‹, ΠΏΡ€Π΅Π΄Π»ΠΎΠ³ΠΈ ΠΈ послСлоги.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅

Π’ процСссС Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всС Ρ„ΠΎΡ€ΠΌΡ‹ слова приводятся ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ. НапримСр, watched, watching ΠΈ watches послС Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² watch. Π•ΡΡ‚ΡŒ Π΄Π²Π° основных ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ: стСмминг ΠΈ лСмматизация.

Π’ случаС стСмминга выдСляСтся основа слова, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ слова-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сработаСт Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Однако это Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ – стСмминг просто ΠΎΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ строку, отбрасывая ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ связь ΠΌΠ΅ΠΆΠ΄Ρƒ feel ΠΈ felt.

ЛСмматизация стрСмится Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ всС Ρ„ΠΎΡ€ΠΌΡ‹ слова ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с Π΅Π³ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ – Π»Π΅ΠΌΠΌΠΎΠΉ. ЛСмматизация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приносит большС ΠΏΠΎΠ»ΡŒΠ·Ρ‹, Ρ‡Π΅ΠΌ стСмминг, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ являСтся СдинствСнной стратСгиСй Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ spaCy. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… NLP-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° лСмматизация происходит автоматичСски. Π›Π΅ΠΌΠΌΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° хранится Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ .lemma_:

        lemmas = [
    f"Token: {token}, lemma: {token.lemma_}"
    for token in filtered_tokens
]

print(lemmas)
    
        ['Token: \n, lemma: \n', 'Token: Dave, lemma: Dave',
'Token: watched, lemma: watch', 'Token: forest, lemma: forest',
'Token: burned, lemma: burn', 'Token: hill, lemma: hill',
'Token: ,, lemma: ,', 'Token: \n, lemma: \n',
'Token: miles, lemma: mile', 'Token: house, lemma: house',
'Token: ., lemma: .', 'Token: car, lemma: car',
'Token: \n, lemma: \n', 'Token: hastily, lemma: hastily',
'Token: packed, lemma: pack', 'Token: Marta, lemma: Marta', 
'Token: inside, lemma: inside', 'Token: trying, lemma: try',
'Token: round, lemma: round', 'Token: \n, lemma: \n', 
'Token: pets, lemma: pet', 'Token: ., lemma: .',
'Token: ", lemma: "', 'Token: ?, lemma: ?',
'Token: ", lemma: "', 'Token: wondered, lemma: wonder',
'Token: \n, lemma: \n', 'Token: continued, lemma: continue',
'Token: wait, lemma: wait', 'Token: Marta, lemma: Marta',
'Token: appear, lemma: appear', 'Token: pets, lemma: pet',
'Token: ., lemma: .', 'Token: \n, lemma: \n']
    
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° символ подчСркивания Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ .lemma_. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ°, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ соглашСния ΠΏΠΎ имСнованию Π² spaCy Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся прСдставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° способом, понятным машинС. Π­Ρ‚ΠΎΡ‚ процСсс называСтся Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

ВСкторизация тСкста

ВСкторизация – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² числовой массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Π΅Π³ΠΎ свойства. Π’ контСкстС Π·Π°Π΄Π°Ρ‡ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π°. Π’Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ прСдставлСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΎΡ†Π΅Π½ΠΊΠΈ сходства слов, классификации тСкстов ΠΈ Ρ‚. Π΄. Π’ spaCy Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ»ΠΎΡ‚Π½Ρ‹Ρ… массивов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΡ‚ Ρ€Π°Π½Π½ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… для Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ†Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅ массивы ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ нулями.

Как ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ шаги, вСкторизация выполняСтся автоматичСски Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° nlp(). ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ прСдставлСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²:

        filtered_tokens[1].vector
    
        array([ 1.8371646 ,  1.4529226 , -1.6147211 ,  0.678362  , -0.6594443 ,
        1.6417935 ,  0.5796405 ,  2.3021278 , -0.13260496,  0.5750932 ,
        1.5654886 , -0.6938864 , -0.59607106, -1.5377437 ,  1.9425622 ,
       -2.4552505 ,  1.2321601 ,  1.0434952 , -1.5102385 , -0.5787632 ,
        0.12055647,  3.6501784 ,  2.6160972 , -0.5710199 , -1.5221789 ,
        0.00629176,  0.22760668, -1.922073  , -1.6252862 , -4.226225  ,
       -3.495663  , -3.312053  ,  0.81387717, -0.00677544, -0.11603224,
        1.4620426 ,  3.0751472 ,  0.35958546, -0.22527039, -2.743926  ,
        1.269633  ,  4.606786  ,  0.34034157, -2.1272311 ,  1.2619178 ,
       -4.209798  ,  5.452852  ,  1.6940253 , -2.5972986 ,  0.95049495,
       -1.910578  , -2.374927  , -1.4227567 , -2.2528825 , -1.799806  ,
        1.607501  ,  2.9914255 ,  2.8065152 , -1.2510269 , -0.54964066,
       -0.49980402, -1.3882618 , -0.470479  , -2.9670253 ,  1.7884955 ,
        4.5282774 , -1.2602427 , -0.14885521,  1.0419178 , -0.08892632,
       -1.138275  ,  2.242618  ,  1.5077229 , -1.5030195 ,  2.528098  ,
       -1.6761329 ,  0.16694719,  2.123961  ,  0.02546412,  0.38754445,
        0.8911977 , -0.07678384, -2.0690763 , -1.1211847 ,  1.4821006 ,
        1.1989193 ,  2.1933236 ,  0.5296372 ,  3.0646474 , -1.7223308 ,
       -1.3634219 , -0.47471118, -1.7648507 ,  3.565178  , -2.394205  ,
       -1.3800384 ], dtype=float32)
    

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .vector для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² спискС filter_tokens. Π’ этом Π½Π°Π±ΠΎΡ€Π΅ это слово Dave.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Если для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° .vector Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая вСрсия ΠΌΠΎΠ΄Π΅Π»ΠΈ en_core_web_sm ΠΈΠ»ΠΈ самой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ spaCy.

ИспользованиС классификаторов машинного обучСния для прогнозирования настроСний

Π’Π΅ΠΏΠ΅Ρ€ΡŒ тСкст ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² Ρ„ΠΎΡ€ΠΌΡƒ, ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ Π΅Π³ΠΎ классификациСй. ΠœΡ‹ рассмотрим Ρ‚Ρ€ΠΈ Ρ‚Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π΄ΡƒΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎ классификации тСкстовых Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ машинного обучСния:

  1. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ машинного обучСния для Π·Π°Π΄Π°Ρ‡ классификации.
  2. Как происходит классификация.
  3. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ spaCy для классификации тСкста.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ машинного обучСния

Π’ ΠΌΠΈΡ€Π΅ Python Π΅ΡΡ‚ΡŒ ряд инструмСнтов для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ классификации. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных:

Π­Ρ‚ΠΎΡ‚ список Π½Π΅ являСтся ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌ, Π½ΠΎ это Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ) машинного обучСния, доступныС для питонистов. Π­Ρ‚ΠΎ ΠΌΠΎΡ‰Π½Ρ‹Π΅ инструмСнты, Π½Π° освоСниС ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

TensorFlow Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Google ΠΈ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² машинного обучСния. Он довольно Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΌΠ½ΠΎΠ³ΠΎ возмоТностСй. PyTorch – это ΠΎΡ‚Π²Π΅Ρ‚ Facebook Π½Π° TensorFlow, созданный с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹Ρ… с ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° scikit-learn отличаСтся ΠΎΡ‚ TensorFlow ΠΈ PyTorch, позволяя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ машинного обучСния, Π½Π΅ создавая собствСнных. Он прост Π² использовании ΠΈ позволяСт быстро ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ классификаторы всСго нСсколькими строками ΠΊΠΎΠ΄Π°.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, spaCy прСдоставляСт довольно простой встроСнный классификатор тСкста. Для Π½Π°Ρ‡Π°Π»Π° Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс любого Π²ΠΈΠ΄Π° Π·Π°Π΄Π°Ρ‡ классификации:

  1. РаздСляСм Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΡƒΡŽ ΠΈ Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…).
  2. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ для настройки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ (этот процСсс ΠΈ называСтся ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ).
  4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ тСстовыС Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ качСство обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ.
  5. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль Π½Π° Π½ΠΎΠ²Ρ‹Ρ…, Ρ€Π°Π½Π΅Π΅ Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π²ΡˆΠΈΡ…ΡΡ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для создания ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΎΠ².

CпСциалисты ΠΏΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ‚Ρ€ΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…:

  1. Π”Π°Π½Π½Ρ‹Π΅ для обучСния (training).
  2. Π”Π°Π½Π½Ρ‹Π΅ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ (validation).
  3. Π”Π°Π½Π½Ρ‹Π΅ для тСста (test).

ΠžΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для настройки Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ нСпосрСдствСнно Π² процСссС обучСния. Π“ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ процСсс обучСния ΠΈ структуру ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’Π°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обучСния ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… (Π±Π°Ρ‚Ρ‡Π΅ΠΉ). Набор Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ВСстовый Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… – Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ качСствС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°
ЀактичСски Π² Ρ€Π°ΠΌΠΊΠ°Ρ… руководства ΠΌΡ‹ ограничимся лишь Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² процСссС Π΅Π΅ обучСния. Π”Π°Π½Π½Ρ‹Π΅ для обучСния ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ лишь ΠΈΠ· ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ. Π’ качСствС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ ограничимся лишь Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ. Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ тСстированиС Π½Π΅ составит Ρ‚Ρ€ΡƒΠ΄Π° – тСстовый Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ структуру, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅. Π’ постскриптумС ΡΡ‚Π°Ρ‚ΡŒΠΈ рассмотрСн Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ тСстирования ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° сторонних Π΄Π°Π½Π½Ρ‹Ρ… нСсколько ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… рассмотрСли процСсс классификации, ΠΏΠΎΡ€Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ spaCy.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ spaCy для классификации тСкста

ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ spaCy Π±Π΅Ρ€Π΅Ρ‚ Π½Π° свои ΠΏΠ»Π΅Ρ‡ΠΈ Π·Π°Π±ΠΎΡ‚Ρ‹ ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ тСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора nlp(). ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ JSON, связанном с ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ модСлью (en_core_web_sm Π² этом руководствС) ΠΈΠ»ΠΈ модСлью, созданной ΠΏΠΎΠ»ΡŒΠ·Π²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Один ΠΈΠ· встроСнных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° называСтся textcat (сокр. TextCategorizer), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ тСкстовым Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти. Π§Ρ‚ΠΎΠ±Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого инструмСнта ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ модСль, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ textcat Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€.
  2. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ textcat Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ (ΠΈΠΌΠ΅Π½Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ).
  3. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° части Π΄Π°Π½Π½Ρ‹Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅.
  4. ΠžΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ модСль, оцСнивая ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ обучСния.
  5. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ настроСний Π½Π° тСкстах, Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠΈΡ… Π² ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ.
  6. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ: ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этих шагов ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ spaCy. Π­Ρ‚ΠΎ основной способ классификации тСкста Π² spaCy, поэтому ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° эти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ собствСнный Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ тСкстов

Π’ качСствС Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Large Movie Review, собранный Π­Π½Π΄Ρ€ΡŽ Маасом.

***

Вставка ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°. ИспользованиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… IMDB являСтся стандартным источником для сСнтимСнт-Π°Π½Π°Π»ΠΈΠ·Π°. Π’ рСцСнзиях ΠΊ Ρ„ΠΈΠ»ΡŒΠΌΠ°ΠΌ сами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΡƒΠΆΠ΅ соотнСсли Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡŽ ΠΈ ΠΎΡ†Π΅Π½ΠΊΡƒ Ρ„ΠΈΠ»ΡŒΠΌΠ° – ΠΊΠ°ΠΊ Π±Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, сопоставив Π±Π»ΠΎΠΊ тСкста ΠΈ Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ.

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ Π² пособии Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… хранится Π² Π²ΠΈΠ΄Π΅ сТатого tar-Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π½Π° диск нСпосрСдствСнно ΠΈΠ· Python. ДатасСты ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Π±Π»ΠΎΠΊΠ½ΠΎΡ‚ΠΎΠ² Jupyter (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π° GitHub), поэтому для дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ:

        import os
import tarfile

# Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ
# Π½Π° Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² вашСй систСмС
os.chdir(os.path.relpath('../../../Datasets/'))

fname = 'aclImdb_v1.tar.gz'
with tarfile.open(fname, "r:gz") as tar:
    tar.extractall()
    tar.close()
    

Π’ΡƒΠ΄Π° ΠΆΠ΅ впослСдствии ΠΌΡ‹ сохраним ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль классификации Π΄Π°Π½Π½Ρ‹Ρ….

***

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…. РазобьСм этап Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ шаги:

  1. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ тСкст ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈΠ· структуры Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².
  2. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅.
  3. Π Π°Π·Π΄Π΅Π»ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈ тСстовый Π½Π°Π±ΠΎΡ€Ρ‹.
  4. Π’Π΅Ρ€Π½Ρ‘ΠΌ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ….

Π­Ρ‚ΠΎΡ‚ процСсс самодостаточСн, поэтому Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Β«ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒΒ» Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

        def load_training_data(
    data_directory: str = "aclImdb/train",
    split: float = 0.8,
    limit: int = 0
) -> tuple:
    

Π’ сигнатурС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ² Python 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ясно, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ функция ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся Π΄Π°Π½Π½Ρ‹Π΅ (data_directory), ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΈ тСстовых Π΄Π°Π½Π½Ρ‹Ρ… (split) ΠΈ количСство ΠΎΡ‚Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Ρ… записСй (limit). Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ Π² Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅ Π² список:

        # ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ символами Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠΈ здСсь ΠΈ Π΄Π°Π»Π΅Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠΎΠ΄,
# Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ измСнившийся Π² сравнСнии с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
import os                                                     #

def load_training_data(
    data_directory: str = "aclImdb/train",
    split: float = 0.8,
    limit: int = 0) -> tuple:
    # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²
    reviews = []                                              #
    for label in ["pos", "neg"]:                              #
        labeled_directory = f"{data_directory}/{label}"       #
        for review in os.listdir(labeled_directory):          #
            if review.endswith(".txt"):                       #
                with open(f"{labeled_directory}/{review}") as f:
                    text = f.read()                           #
                    text = text.replace("<br />", "\n\n")     #
                    if text.strip():                          #
                        spacy_label = {                       #
                            "cats": {                         #
                                "pos": "pos" == label,        #
                                "neg": "neg" == label         #
                            }                                 #
                        }                                     #
                        reviews.append((text, spacy_label))   #
    

Π₯отя это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным, здСсь ΠΌΡ‹ просто создаСм структуру ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡ‰Π΅ΠΌ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ добавляСм ΠΊΠΎΡ€Ρ‚Π΅ΠΆ содСрТимого ΠΈ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΌΠ΅Ρ‚ΠΎΠΊ Π² список Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΠΉ reviews. ΠžΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ Π² Π²ΠΈΠ΄Π΅ словаря – это Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ модСлями spaCy Π²ΠΎ врСмя обучСния.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° этом этапС ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€, здСсь ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ HTML-Ρ‚Π΅Π³ΠΈ <br /> символами Π½ΠΎΠ²ΠΎΠΉ строки ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строковый ΠΌΠ΅Ρ‚ΠΎΠ΄ .strip () для удалСния Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

Π’ этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ сразу ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ стоп-слова ΠΈΠ· ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ – это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдлоТСния ΠΈΠ»ΠΈ Ρ„Ρ€Π°Π·Ρ‹ ΠΈ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ силу классификатора.

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ любоС влияниС, обусловлСнноС порядком Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…:

        import os
import random                                  #

def load_training_data(
    data_directory: str = "aclImdb/train",
    split: float = 0.8,
    limit: int = 0
) -> tuple:
    # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²
    reviews = []
    for label in ["pos", "neg"]:
        labeled_directory = f"{data_directory}/{label}"
        for review in os.listdir(labeled_directory):
            if review.endswith(".txt"):
                with open(f"{labeled_directory}/{review}") as f:
                    text = f.read()
                    text = text.replace("<br />", "\n\n")
                    if text.strip():
                        spacy_label = {
                            "cats": {
                                "pos": "pos" == label,
                                "neg": "neg" == label}
                        }
                        reviews.append((text, spacy_label))
    random.shuffle(reviews)                    #

    if limit:                                  #
        reviews = reviews[:limit]              #
    split = int(len(reviews) * split)          #
    return reviews[:split], reviews[split:]    #
    

Π’ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… строках ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠ°Π»ΠΈ записи ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° random.shuffle(). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ ΠΈ раздСляСм Π΄Π°Π½Π½Ρ‹Π΅. НаконСц, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΄Π²Π° списка ΠΎΠ±Π·ΠΎΡ€ΠΎΠ².

Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ записи:

        load_training_data(
    data_directory = "aclImdb/train",
    split = 0.8,
    limit = 0)[0][0]
    
        ('HOLLOW MAN is one of the better horror films of the past decade.
The sub-plot is original and the main plot is even better.
The special effects are brilliant and possibly the best I have ever
seen in a horror film. Kevin Bacon proves again that he can handle...',
 {'cats': {'pos': True, 'neg': False}})
    
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ spaCy Ρ‚Π°ΠΊΠΆΠ΅ выпустили ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ thinc (Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ GitHub), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ большим Π½Π°Π±ΠΎΡ€Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎΠΌ числС датасСт ΠΎΠ±Π·ΠΎΡ€ΠΎΠ² IMDB, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ классификатора

ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ spaCy позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ²Π΅Ρ€Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ (CNN) для классификации тСкстовых Π΄Π°Π½Π½Ρ‹Ρ…. Π—Π΄Π΅ΡΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сСнтимСнт-Π°Π½Π°Π»ΠΈΠ·Π°, Π½ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ классификации тСкстов.

Π’ этой части ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Ρ€ΠΈ шага:

  1. ИзмСнСним Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ spaCy для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° textcat.
  2. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ†ΠΈΠΊΠ» для обучСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° textcat.
  3. Научимся ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ прогрСсс обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ послС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ количСства Ρ†ΠΈΠΊΠ»ΠΎΠ² обучСния.

ИзмСнСниС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° spaCy для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ textcat

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π² Π½Π°Ρ‡Π°Π»Π΅ руководства, Π΄Π°Π»Π΅Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ textcat. ПослС этого ΡƒΠΊΠ°ΠΆΠ΅ΠΌ textcat ΠΌΠ΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π΄Π°Π½Π½Ρ‹Ρ…: pos для ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² ΠΈ neg для Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ…:

        import os
import random
import spacy

def train_model(
    training_data: list,
    test_data: list,
    iterations: int = 20
) -> None:
    # Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€
    nlp = spacy.load("en_core_web_sm")
    if "textcat" not in nlp.pipe_names:
        textcat = nlp.create_pipe(
            "textcat", config={"architecture": "simple_cnn"}
        )
        nlp.add_pipe(textcat, last=True)
    

Если Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ textcat ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ spaCy, Ρ‚ΠΎ этот ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΌ Π·Π½Π°ΠΊΠΎΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ встроСнный ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ en_core_web_sm, Π·Π°Ρ‚Π΅ΠΌ провСряСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .pipe_names, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, доступСн Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ textcat. Если это Π½Π΅ Ρ‚Π°ΠΊ, создаСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° .create_pipe(), ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ инструкции описаны Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ TextCategorizer. НаконСц, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .add_pipe() добавляСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΊΠΎΠ½Π΅Ρ† ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ случай, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ textcat ΡƒΠΆΠ΅ доступСн. ДобавляСм ΠΌΠ΅Ρ‚ΠΊΠΈ:

        import os
import random
import spacy

def train_model(
    training_data: list,
    test_data: list,
    iterations: int = 20
) -> None:
    # Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€
    nlp = spacy.load("en_core_web_sm")
    if "textcat" not in nlp.pipe_names:
        textcat = nlp.create_pipe(
            "textcat", config={"architecture": "simple_cnn"}
        )
        nlp.add_pipe(textcat, last=True)
    else:                                   #
        textcat = nlp.get_pipe("textcat")   #

    textcat.add_label("pos")                #
    textcat.add_label("neg")                #
    

ПишСм Ρ†ΠΈΠΊΠ» обучСния textcat

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» обучСния, настраиваСм ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π½Π° ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° textcat, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ для Π½Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° spacy.util – minibatch() ΠΈ compounding(). Под ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π±Π°Ρ‚Ρ‡Π΅ΠΌ (Π°Π½Π³Π». batch) понимаСтся просто Ρ‚Π° нСбольшая Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, которая участвуСт Π² ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ. ΠŸΠ°ΠΊΠ΅Ρ‚Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ объСм памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π²ΠΎ врСмя обучСния ΠΈ быстрСС ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ДинамичСский Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Ρ‚Ρ‡Π° (compounding) – ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ новая ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² машинного обучСния, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡƒΡΠΊΠΎΡ€Π΅Π½ΠΈΡŽ процСсса обучСния. О Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² совСтах ΠΏΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ spaCy.

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ описанный Ρ†ΠΈΠΊΠ» обучСния, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ строки:

        import os
import random
import spacy
from spacy.util import minibatch, compounding  #

def train_model(
    training_data: list,
    test_data: list,
    iterations: int = 20
) -> None:
    # Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€
    nlp = spacy.load("en_core_web_sm")
    if "textcat" not in nlp.pipe_names:
        textcat = nlp.create_pipe(
            "textcat", config={"architecture": "simple_cnn"}
        )
        nlp.add_pipe(textcat, last=True)
    else:
        textcat = nlp.get_pipe("textcat")

    textcat.add_label("pos")
    textcat.add_label("neg")

    # ΠžΠ±ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ textcat
    training_excluded_pipes = [                               #
        pipe for pipe in nlp.pipe_names if pipe != "textcat"  #
    ]                                                         #
    with nlp.disable_pipes(training_excluded_pipes):          #
        optimizer = nlp.begin_training()                      #
        # Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ обучСния                           
        print("НачинаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅")                            #
        batch_sizes = compounding(                            #
            4.0, 32.0, 1.001                                  #
        )  # Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ бСсконСчной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… чисСл
    

Π’ послСдних строчках Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаСм список ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ textcat. Π”Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ диспСтчСр контСкста nlp.disable(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для всСго ΠΊΠΎΠ΄Π° Π² области дСйствия диспСтчСра контСкста.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ nlp.begin_training(), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ nlp.update() Π±ΡƒΠ΄Π΅Ρ‚ впослСдствии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обновлСния вСсов Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π—Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ compounding() для создания Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ batch_sizes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² дальнСйшСм Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ minibatch().

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Ρ‚Ρ‡Π°Ρ…:

        import os
import random
import spacy
from spacy.util import minibatch, compounding  #

def train_model(
    training_data: list,
    test_data: list,
    iterations: int = 20
) -> None:
    # Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€
    nlp = spacy.load("en_core_web_sm")
    if "textcat" not in nlp.pipe_names:
        textcat = nlp.create_pipe(
            "textcat", config={"architecture": "simple_cnn"}
        )
        nlp.add_pipe(textcat, last=True)
    else:
        textcat = nlp.get_pipe("textcat")

    textcat.add_label("pos")
    textcat.add_label("neg")

    # ΠžΠ±ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ textcat
    training_excluded_pipes = [
        pipe for pipe in nlp.pipe_names if pipe != "textcat"
    ]
    with nlp.disable_pipes(training_excluded_pipes):
        optimizer = nlp.begin_training()
        print("НачинаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅")
        batch_sizes = compounding(
            4.0, 32.0, 1.001
        )  # Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ бСсконСчной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… чисСл
        for i in range(iterations):                           #
            loss = {}                                         #
            random.shuffle(training_data)                     #
            batches = minibatch(training_data, size=batch_sizes)
            for batch in batches:                             #
                text, labels = zip(*batch)                    #
                nlp.update(                                   #
                    text,                                     #
                    labels,                                   #
                    drop=0.2,                                 #  
                    sgd=optimizer,                            #
                    losses=loss                               #
                )                                             #
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² сигнатурС train_model(), ΠΌΡ‹ создаСм пустой ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ loss, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ nlp.update(). ΠŸΠ΅Ρ€Π΅Ρ‚Π°ΡΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ раздСляСм ΠΈΡ… Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ minibatch().

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° отдСляСм тСкст (text) ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠΊ (labels) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΈΡ… Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ nlp.update(). Π­Ρ‚ΠΎ фактичСски запускаСт ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ dropout сообщаСт nlp.update(), ΠΊΠ°ΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² этом ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Ρ‹Π»ΠΎ слоТнСС ΠΏΠ΅Ρ€Π΅ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ – Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· создания ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ΠžΡ†Π΅Π½ΠΊΠ° прогрСсса обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство ΠΎΡ†Π΅Π½ΠΎΠΊ Π½Π° большом количСствС вычислСний, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ evaluate_model(). Π’ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСксты ΠΈΠ· Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π½Π΅Π΄ΠΎΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ исходных Π΄Π°Π½Π½Ρ‹Ρ….

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ вычислим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ:

  • Π˜ΡΡ‚ΠΈΠ½Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (true positives, TP) – число ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ модСль ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ прСдсказала ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅.
  • Π›ΠΎΠΆΠ½ΠΎΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (false positives, FP) – число ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ модСль Π½Π΅Π²Π΅Ρ€Π½ΠΎ прСдсказала ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, хотя Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ.
  • Π˜ΡΡ‚ΠΈΠ½Π½ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (true negatives, TN) – число ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ модСль ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ прСдсказала ΠΊΠ°ΠΊ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅.
  • Π›ΠΎΠΆΠ½ΠΎΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (false negatives, FN) – число ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ модСль Π½Π΅Π²Π΅Ρ€Π½ΠΎ прСдсказала ΠΊΠ°ΠΊ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅, хотя Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наша модСль для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ ΠΎΡ‚ 0 Π΄ΠΎ 1, ΠΌΡ‹ опрСдСляСм ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° основС этой ΠΎΡ†Π΅Π½ΠΊΠΈ. На основС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… описанных статистичСских Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ вычисляСм Π΄Π²Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ: Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚Ρƒ. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ показатСлями эффСктивности ΠΌΠΎΠ΄Π΅Π»ΠΈ классификации:

  • Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ (precision) – ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ истинно ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΊΠΎ всСм элСмСнтам, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌ модСлью ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (истинныС ΠΈ Π»ΠΎΠΆΠ½Ρ‹Π΅ срабатывания). Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ 1.0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π·Ρ‹Π², ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ нашСй модСлью ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ относится ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ классу.
  • ΠŸΠΎΠ»Π½ΠΎΡ‚Π° (recall) – это ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ истинно ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² ΠΊΠΎ всСм фактичСским ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚Π·Ρ‹Π²Π°ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ количСство истинно ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ², Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π½Π° суммарноС количСство истинно ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π»ΠΎΠΆΠ½ΠΎΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ².
precision=TPTP+FP,recall=TPTP+FN.

Π•Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ популярной ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΎΠΉ являСтся F1-ΠΌΠ΅Ρ€Π° – срСднСС гармоничСскоС точности ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹. ΠœΠ°ΠΊΡΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ F1-ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ максимизации этих Π΄Π²ΡƒΡ… ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π²:

F1=2β‹…precisionβ‹…recallprecision+recall
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°Ρ… машинного обучСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ АлСксандра Π”ΡŒΡΠΊΠΎΠ½ΠΎΠ²Π°.

Π’ evaluate_model() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ‚ΠΎΡ€, textcat ΠΈ тСстовый Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ….

        def evaluate_model(tokenizer, textcat, test_data: list) -> dict:
    reviews, labels = zip(*test_data)
    reviews = (tokenizer(review) for review in reviews)
    # Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ TP ΠΊΠ°ΠΊ ΠΌΠ°Π»ΠΎΠ΅ число, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π·Π½Π°ΠΌΠ΅Π½Π°Ρ‚Π΅Π»Π΅
    # нС оказался 0
    TP, FP, TN, FN = 1e-8, 0, 0, 0
    for i, review in enumerate(textcat.pipe(reviews)):
        true_label = labels[i]['cats']
        score_pos = review.cats['pos'] 
        if true_label['pos']:
            if score_pos >= 0.5:
                TP += 1
            else:
                FN += 1
        else:
            if score_pos >= 0.5:
                FP += 1
            else:
                TN += 1    
    precision = TP / (TP + FP)
    recall = TP / (TP + FN)
    f_score = 2 * precision * recall / (precision + recall)
    return {"precision": precision, "recall": recall, "f-score": f_score}
    

Π’ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ раздСляСм ΠΎΠ±Π·ΠΎΡ€Ρ‹ ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΊΠΈ, Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ для Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±Π·ΠΎΡ€ΠΎΠ², подготавливая ΠΈΡ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² textcat. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ позволяСт ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Π·ΠΎΡ€Ρ‹, Π½Π΅ сохраняя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π² памяти.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ score ΠΈ true_label для опрСдСлСния Π»ΠΎΠΆΠ½Ρ‹Ρ… ΠΈ истинных срабатываний ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π»Π΅Π΅ подставляСм для расчСта точности, ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΈ F-ΠΌΠ΅Ρ€Ρ‹.

Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ evaluate_model() ΠΈΠ· описанной Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ train_model():

        import os
import random
import spacy
from spacy.util import minibatch, compounding

def train_model(
    training_data: list,
    test_data: list,
    iterations: int = 20) -> None:
    # Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€
    nlp = spacy.load("en_core_web_sm")
    if "textcat" not in nlp.pipe_names:
        textcat = nlp.create_pipe(
            "textcat", config={"architecture": "simple_cnn"}
        )
        nlp.add_pipe(textcat, last=True)
    else:
        textcat = nlp.get_pipe("textcat")

    textcat.add_label("pos")
    textcat.add_label("neg")

    # ΠžΠ±ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ textcat
    training_excluded_pipes = [
        pipe for pipe in nlp.pipe_names if pipe != "textcat"
    ]
    with nlp.disable_pipes(training_excluded_pipes):
        optimizer = nlp.begin_training()
        # Training loop
        print("НачинаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅")
        print("Loss\t\tPrec.\tRec.\tF-score")          #
        batch_sizes = compounding(
            4.0, 32.0, 1.001
        )  # Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ бСсконСчной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… чисСл
        for i in range(iterations):
            loss = {}
            random.shuffle(training_data)
            batches = minibatch(training_data, size=batch_sizes)
            for batch in batches:
                text, labels = zip(*batch)
                nlp.update(
                    text,
                    labels,
                    drop=0.2,
                    sgd=optimizer,
                    losses=loss
                )
            with textcat.model.use_params(optimizer.averages):
                evaluation_results = evaluate_model(   #
                    tokenizer=nlp.tokenizer,           #
                    textcat=textcat,                   #
                    test_data=test_data                #
                )                                      #
                print(f"{loss['textcat']:9.6f}\t\
{evaluation_results['precision']:.3f}\t\
{evaluation_results['recall']:.3f}\t\
{evaluation_results['f-score']:.3f}")
                
    # БохраняСм модСль                                 #
    with nlp.use_params(optimizer.averages):           #
        nlp.to_disk("model_artifacts")                 #
    

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² print(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ evaluate_model(), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π² контСкстном ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ .use_param (), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ модСль Π² Π΅Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии.

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса обучСния сохраняСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ модСль Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ model_artifacts:

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΎΠ±ΡƒΡ‡Π°Π΅Ρ‚ модСль, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ обучСния ΠΈ позволяСт ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π΅Π΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅:

        train, test = load_training_data(limit=5000)
train_model(train, test, iterations=10)
    
        НачинаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅
Loss		Prec.	Rec.	F-score
13.758302	0.809	0.776	0.792
 1.080611	0.827	0.784	0.805
 0.264118	0.833	0.776	0.804
...
 0.005302	0.833	0.776	0.804
    
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ВрСмя обучСния зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ систСмы. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (limit), ΠΎΠ΄Π½Π°ΠΊΠΎ Π² этом случаС Π΅ΡΡ‚ΡŒ риск ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ модСль.

По ΠΌΠ΅Ρ€Π΅ обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ, точности, ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΈ F-ΠΌΠ΅Ρ€Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ обучСния. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ: ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ΠΈ растут Π½Π° самых ΠΏΠ΅Ρ€Π²Ρ‹Ρ… итСрациях, Π° послС этого дСрТатся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΎΡ‚ числа ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ
Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΎΡ‚ числа ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Π·ΠΎΡ€Ρ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ обучСнная модСль, ΠΏΠΎΡ€Π° ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Π·ΠΎΡ€Π°Ρ… – насколько ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ½Π° справится с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ ΠΈΡ… ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски. Для Ρ†Π΅Π»Π΅ΠΉ этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΡ‹ ΠΎΡ†Π΅Π½ΠΈΠΌ лишь ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Π·ΠΎΡ€, вмСсто ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΠ½Ρ‹Π΅ строковыС значСния.

        TEST_REVIEW = """
Transcendently beautiful in moments outside the office, it seems almost
sitcom-like in those scenes. When Toni Colette walks out and ponders
life silently, it's gorgeous.<br /><br />The movie doesn't seem to decide
whether it's slapstick, farce, magical realism, or drama, but the best of it
doesn't matter. (The worst is sort of tedious - like Office Space with less humor.)
"""
    

ΠŸΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ тСкст ΠΎΠ±Π·ΠΎΡ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ· ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ:

        def test_model(input_data: str):
    # Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ модСль
    loaded_model = spacy.load("model_artifacts")
    parsed_text = loaded_model(input_data)
    # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ прСдсказаниС
    if parsed_text.cats["pos"] > parsed_text.cats["neg"]:
        prediction = "ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π·Ρ‹Π²"
        score = parsed_text.cats["pos"]
    else:
        prediction = "НСгативный ΠΎΡ‚Π·Ρ‹Π²"
        score = parsed_text.cats["neg"]
    print(f"ВСкст ΠΎΠ±Π·ΠΎΡ€Π°: {input_data}\n\
ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅: {prediction}\n\
Score: {score:.3f}")
    

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ модСль ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ прСдсказаниС Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ cats ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ parsed_text. Π—Π°Ρ‚Π΅ΠΌ провСряСм ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ настроСния ΠΈ сохраняСм ΠΌΠ΅Ρ‚ΠΊΠΈ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΎΠΌ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ модСль ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

        test_model(input_data=TEST_REVIEW)
    
        ВСкст ΠΎΠ±Π·ΠΎΡ€Π°: 
Transcendently beautiful in moments outside the office, it seems almost
sitcom-like in those scenes. When Toni Colette walks out and ponders
life silently, it's gorgeous.<br /><br />The movie doesn't seem to decide
whether it's slapstick, farce, magical realism, or drama, but the best of it
doesn't matter. (The worst is sort of tedious - like Office Space with less humor.)

ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅: ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π·Ρ‹Π²
Score: 0.612
    

ΠžΡ‚Π·Ρ‹Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСсСт ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Score слуТит характСристикой увСрСнности ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ test_model() Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… строковых значСниях.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ создали ряд нСзависимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ load_data(), train_model(), evaluate_model() ΠΈ test_model(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вмСстС взятыС, Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ, ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ, ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классификатор Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ окраски тСкста Π² Python. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… вмСстС Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ достаточно, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ if __name__ == "__main__":

        if __name__ == "__main__":
    train, test = load_training_data(limit=2500)
    train_model(train, test)
    print("Testing model")
    test_model()
    

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ! Π’Ρ‹ ΠΎΠ±ΡƒΡ‡ΠΈΠ»ΠΈ модСль Π°Π½Π°Π»ΠΈΠ·Π° настроСний, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ СстСствСнного языка.

Π’ этом руководствС ΠΌΡ‹ рассмотрСли:

  • Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкста;
  • инструмСнты создания классификаторов;
  • процСсс создания NLP-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ spaCy.

ΠžΡ‚Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ ΠΎΡ‚ этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π’ΠΎΡ‚ нСсколько ΠΈΠ΄Π΅ΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅:

  • Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ load_data() тСкст ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π·Ρ‹Π²Π° загруТаСтся Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ процСсс Π±ΠΎΠ»Π΅Π΅ эффСктивным, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ вмСсто этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹?
  • ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ стоп-слова Π²ΠΎ врСмя ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Как мСняСтся качСство ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ?
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ click, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.
  • Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° textcat ΠΈ поэкспСримСнтируйтС с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ настройками.

P.S. ΠžΡ†Π΅Π½ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° рСцСнзиях с Кинопоиска

НапослСдок ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ модСль Π½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²Π°Ρ… Π½Π° русском языкС. Для этого ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€ΡƒΡΡΠΊΠΎΡΠ·Ρ‹Ρ‡Π½ΡƒΡŽ модСль spaCy (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅) ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ модСль Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, Π½ΠΎ Ρ€Π°Π΄ΠΈ интСрСса ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ модСлью, ΡƒΠΆΠ΅ ΠΎΠ±ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π½Π° рСцСнзиях IMDB. Для этого протСстируСм модСль Π½Π° датасСтС ΠΈΠ· 3000 записСй, собранных с Кинопоиска ДСнисом ΠšΡƒΠ΄Ρ€ΡΠ²Ρ†Π΅Π²Ρ‹ΠΌ. Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° сбалансирована: содСрТится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ тысячС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…, Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² (Π² датасСтС IMDB ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΡ‚Π·Ρ‹Π²Ρ‹). Для удобства Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Π½Π°Π±ΠΎΡ€ тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ csv-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ машинного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°.

        import pandas as pd
import sklearn.metrics

df = pd.read_csv("kinopoisk.zip", index_col=0)
df.sample(frac=1)[:5]
    

АдаптируСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ test_model для ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ.

        def test_model(input_data):
    loaded_model = spacy.load("model_artifacts")
    parsed_text = loaded_model(input_data)
    if parsed_text.cats["pos"] > parsed_text.cats["neg"]:
        prediction = "good"
        score = parsed_text.cats["pos"]
    else:
        prediction = "bad"
        score = parsed_text.cats["neg"]
    return prediction

pred = df.translation.apply(test_model)
df['pred'] = pred
yy = df.iloc[:1999]
y_true = yy['type']
y_pred = yy['pred']

y_true[y_true == 'good'] = 1
y_true[y_true == 'bad'] = 0
y_pred[y_pred == 'good'] = 1
y_pred[y_pred == 'bad'] = 0

accuracy = sklearn.metrics.accuracy_score(y_true.astype(int), y_pred.astype(int))
f_score = sklearn.metrics.f1_score(y_true.astype(int), y_pred.astype(int))

print(f"ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° accuracy составила: {accuracy:.3f}.")
print(f"F1-ΠΌΠ΅Ρ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π²Π½Π° {f_score:.3f}.")
    
        ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° accuracy составила: 0.693.
F1-ΠΌΠ΅Ρ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π²Π½Π° 0.735.
    

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ смыслового содСрТания скрадываСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ машинного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° с русского Π½Π° английский, модСль всё Ρ€Π°Π²Π½ΠΎ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ опрСдСляСт Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ тСкстов.

        >>> df[df['type'] == 'neutral']['pred'].value_counts()
good    559
bad     441
Name: pred, dtype: int64
    

Для Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… записСй ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ порядок числа ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… прСдсказаний – модСль сомнСваСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ, вСдь Π² Π½Π΅ΠΉ Π½Π΅ происходило обучСния Π½Π° Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… записях.

***

Если Π²Π°ΠΌ понравился этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»Π°ΠΉΠΊ. На сайтС Π΅ΡΡ‚ΡŒ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹Ρ… Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Data Science, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

А Ссли ΠΌΠΎΠ·Π³ ΡƒΠΆΠ΅ достаточно напрягся, Π΅ΡΡ‚ΡŒ нСслоТный тСст Π½Π° Π·Π½Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅ΡŽΡ‚ нСйросСти.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ C++
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•