yuliianikolaenko 28 августа 2021

πŸ€– ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ руководство ΠΏΠΎ NLP: ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ тСкстов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ fastText

РассматриваСм практичСскоС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ supervised NLP ΠΌΠΎΠ΄Π΅Π»ΠΈ fastText для обнаруТСния сарказма Π² новостных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ….
πŸ€– ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ руководство ΠΏΠΎ NLP: ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ тСкстов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ fastText
Около 80% всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅ структурировано, Π° тСкст являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Ρ‚ΠΈΠΏΠΎΠ² нСструктурированных Π΄Π°Π½Π½Ρ‹Ρ…. Из-Π·Π° Π΅Π΅ бСспорядочной ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹, Π°Π½Π°Π»ΠΈΠ·, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, организация ΠΈ сортировка тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ становятся слоТными ΠΈ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ. Π—Π΄Π΅ΡΡŒ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ приходят NLP ΠΈ классификация тСкста.

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ тСкстов – ΠΌΠ΅Ρ‚ΠΎΠ΄ машинного обучСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ тСкста являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ СстСствСнного языка с ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ: Π°Π½Π°Π»ΠΈΠ· сСнтимСнтов, ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚Π΅ΠΌ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ спама, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Ρ‚.Π΄. ΠžΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ классификации тСкстов Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½Ρ‹ для ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ классификаторов, ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π²ΠΈΠ΄Ρ‹ тСкста, начиная с элСктронных писСм, ΡŽΡ€ΠΈΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², постов Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях, сообщСний Π² Ρ‡Π°Ρ‚-Π±ΠΎΡ‚Π°Ρ…, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² опросов ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎ позволяСт ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ· ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ врСмя, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ бизнСс-процСссы ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ основанныС Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… бизнСс-Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

fastText – популярная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ для классификации тСкстов, которая Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² 2015 Π³ΠΎΠ΄Ρƒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΈΠ΅ΠΉ искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π° Facebook. Компания Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт ΠΌΠΎΠ΄Π΅Π»ΠΈ: English word vectors (ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½Π° английскому webcrawl ΠΈ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ) ΠΈ Multi-lingual word vectors (ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ для 157 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Supervised ΠΈ Unsupervised learning для получСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… прСдставлСний слов. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ Python. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ для классификации новостных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ².

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° срСды ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

        import pandas as pd
import fasttext
from sklearn.model_selection import train_test_split
import re
from gensim.parsing.preprocessing import STOPWORDS
from gensim.parsing.preprocessing import remove_stopwords

pd.options.display.max_colwidth = 1000
    
TIP
для ознакомлСния с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:
        help(fasttext.FastText)
    

Π”Π°Π½Π½Ρ‹Π΅

ДатасСт прСдставляСт собой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² новостных статСй ΠΈ ΠΈΡ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊ сарказм (ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈΠ· новостного издания The Onion) ΠΈ Π½Π΅ сарказм (ΠΈΠ· HuffPost). Бсылка Π½Π° Π΄Π°Π½Π½Ρ‹Π΅: https://www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

  • is_sarcastic: 1 Ссли Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ с сарказмом, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС 0
  • headline: Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ новостной ΡΡ‚Π°Ρ‚ΡŒΠΈ
  • article_link: ссылка Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ
        # Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅
df_headline = pd.read_json("Sarcasm_Headlines_Dataset.json", lines=True)
# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ количСство ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ наблюдСний
df_headline.shape
(26709, 3)
# ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²
df_headline.head(3)
    
article_link headline is_sarcastic
https://www.huffingtonpost.com/entry/versace-black-code_us_5861fbefe4b0de3a08f600d5 former versace store clerk sues over secret 'black code' for minority shoppers 0
https://www.huffingtonpost.com/entry/roseanne-revival-review_us_5ab3a497e4b054d118e04365the the 'roseanne' revival catches up to our thorny political mood, for better and worse 0
https://local.theonion.com/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697 mom starting to fear son's web series closest thing she will have to grandchild 1
        # ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ количСство саркастичСских ΠΈ нСсаркастичСских статСй Π² датасСтС ΠΈ ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π½ΠΎΠ΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅
df_headline.is_sarcastic.value_counts()
0    14985
1    11724
df_headline.is_sarcastic.value_counts(normalize=True)
0    0.561047
1    0.438953
    

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² саркастичСских ΠΈ Π½Π΅ саркастичСских Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²:

        df_headline[df_headline['is_sarcastic']==1].head(3)

    
article_link headline is_sarcastic
https://local.theonion.com/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697 mom starting to fear son's web series closest thing she will have to grandchild 1
https://politics.theonion.com/boehner-just-wants-wife-to-listen-not-come-up-with-alt-1819574302 boehner just wants wife to listen, not come up with alternative debt-reduction ideas 1
https://politics.theonion.com/top-snake-handler-leaves-sinking-huckabee-campaign-1819578231 top snake handler leaves sinking huckabee campaign 1
        df_headline[df_headline['is_sarcastic']==0].head(3)
    
article_link headline is_sarcastic
https://www.huffingtonpost.com/entry/versace-black-code_us_5861fbefe4b0de3a08f600d5 former versace store clerk sues over secret 'black code' for minority shoppers 0
https://www.huffingtonpost.com/entry/roseanne-revival-review_us_5ab3a497e4b054d118e04365 the 'roseanne' revival catches up to our thorny political mood, for better and worse0 0
https://www.huffingtonpost.com/entry/jk-rowling-wishes-snape-happy-birthday_us_569117c4e4b0cad15e64fdcb j.k. rowling wishes snape happy birthday in the most magical way 0

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° тСкста

Один ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… шагов для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ – ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ простой ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкста. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ классификатора, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ тСкст: привСсти всС слова ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ рСгистру, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹. Для этого создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ очистки ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π΅Π΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ headline.

        # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ очистки тСкста
def clean_text(text):
    text = text.lower()
    text = re.sub(r'[^\sa-zA-Z0-9@\[\]]',' ',text) # УдаляСт ΠΏΡƒΠ½ΠΊΡ‚Ρ†Π°Ρ†ΠΈΡŽ
    text = re.sub(r'\w*\d+\w*', '', text) # УдаляСт Ρ†ΠΈΡ„Ρ€Ρ‹
    text = re.sub('\s{2,}', " ", text) # УдаляСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹
    return text

# ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π΅Π΅ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ
df_headline['headline'] = df_headline['headline'].apply(clean_text)
    

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ тСстовыС

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊ. Π§Π°Ρ‰Π΅ всСго для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 80% ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π² зависимости ΠΎΡ‚ объСма Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ) ΠΈ 20% – для тСстирования (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ точности).

        # РаздСляСм Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ тСкстовыС
train, test = train_test_split(df_headline, test_size = 0.2)

    

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ тСкстового Ρ„Π°ΠΉΠ»Π°

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ txt. Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ __label__ <Label> <Text>. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ прСфикс вмСсто __label__, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²ΠΎ врСмя обучСния. Π’ нашСм датасСтС __ label __0 ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ отсутствиС сарказма, Π° __label __1 ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ сарказм.

        # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ тСкстовыС файля для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ с Π»Π΅ΠΉΠ±Π»ΠΎΠΌ ΠΈ тСкстом
with open('train.txt', 'w') as f:
    for each_text, each_label in zip(train['headline'], train['is_sarcastic']):
        f.writelines(f'__label__{each_label} {each_text}\n')
        
with open('test.txt', 'w') as f:
    for each_text, each_label in zip(test['headline'], test['is_sarcastic']):
        f.writelines(f'__label__{each_label} {each_text}\n')

# ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выглядят наши Π΄Π°Π½Π½Ρ‹Π΅ для обучСния
!head -n 10 train.txt

__label__0 singapore airlines flight catches fire no casualties
__label__1 area man wins conversation
__label__0 stephen colbert explains the conspiracies against donald trump in nsfw diagram
__label__1 turkey sandwich given locally relevant name
__label__1 quiet riot speaks out against nation s poor metal health care
    

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ

Для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ fastText Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΅Π΅ имя:

        # ΠŸΠ΅Ρ€Π²Π°Ρ модСль Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
model1 = fasttext.train_supervised('train.txt')

# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΡƒΡŽ для отобраТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ
def print_results(sample_size, precision, recall):
    precision   = round(precision, 2)
    recall      = round(recall, 2)
    print(f'{sample_size=}')
    print(f'{precision=}')
    print(f'{recall=}')

# ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
print_results(*model1.test('test.txt'))

sample_size=5342
precision=0.85
recall=0.85
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, хотя ΠΈ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Π΅, выглядят ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌΠΈ.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Поиск Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΡ… Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ модСль fastText Π²ΠΎ врСмя обучСния Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ довольно ΠΌΠ°Π»ΠΎ, учитывая, Ρ‡Ρ‚ΠΎ Π² нашСм Π½Π°Π±ΠΎΡ€Π΅ всСго 12 тыс. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ просмотров ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (Ρ‚Π°ΠΊΠΆΠ΅ извСстноС ΠΊΠ°ΠΊ количСство эпох) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ epoch:

        # Вторая модСль с количСством эпох Ρ€Π°Π²Π½ΠΎΠΉ 25
model2 = fasttext.train_supervised('train.txt', epoch=25)

print_results(*model2.test('test.txt'))

sample_size=5342
precision=0.83
recall=0.83

    

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅ возрасла. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ процСсса – ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ (ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ) ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обучСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π­Ρ‚ΠΎ соотвСтствуСт Ρ‚ΠΎΠΌΡƒ, насколько сильно мСняСтся модСль послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обучСния равная 0 Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ модСль Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ мСняСтся ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΈΡ‡Π΅ΠΌΡƒ Π½Π΅ учится. Π₯ΠΎΡ€ΠΎΡˆΠΈΠ΅ значСния скорости обучСния находятся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0.1 – 1.0. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° lr:

        # Π’Ρ€Π΅Ρ‚ΡŒΡ модСль с количСством эпох Ρ€Π°Π²Π½ΠΎΠΉ 10 ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ обучния Ρ€Π°Π²Π½ΠΎΠΉ 1
model3 = fasttext.train_supervised('train.txt', epoch=10, lr=1.0)

print_results(*model3.test('test.txt'))

sample_size=5342
precision=0.83
recall=0.83
    

НаконСц, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹ слов, Π° Π½Π΅ просто ΡŽΠ½ΠΈΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ особСнно Π·Π½Π°Ρ‡ΠΈΠΌΠΎ для Π·Π°Π΄Π°Ρ‡ классификации, Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ порядок слов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π½Π°Π»ΠΈΠ· сСнтимСнтов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΈ, сарказма ΠΈ Ρ‚. Π΄. Для этого ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² модСль Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ wordNgrams Ρ€Π°Π²Π½Ρ‹ΠΉ 2.

        model4 = fasttext.train_supervised('train.txt', epoch=10, lr=1.0, wordNgrams =2)

print_results(*model4.test('test.txt'))

sample_size=5342
precision=0.86
recall=0.86

    

Благодаря этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ шагов ΠΌΡ‹ смогли ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ точности Π² 86%:

  • ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° тСкста;
  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ количСства эпох (с использованиСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° epoch, стандартный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ [5 – 50]) ;
  • ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ скорости обучСния (с использованиСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° lr, стандартный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ [0,1 – 1,0]) ;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ n-Π³Ρ€Π°ΠΌΠΌΡ‹ слов (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° wordNgrams, стандартный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ [1-5]).

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ поиск Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Π½Ρ‚Ρ€ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ†Π΅Π½ΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π»Π΅ΠΉΠ±Π»Π°, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ autotuneMetric:

        model5 = fasttext.train_supervised('train.txt', autotuneValidationFile='test.txt')

print_results(*model5.test('test.txt'))

sample_size=5342
precision=0.87
recall=0.87
    

Ѐункция автоматичСской настройки fastText позволяСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для получСния Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠ΅Π³ΠΎ показатСля F1. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ модСль Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ autotuneValidationFile ΠΈ тСстовый датасСт:

        
model6 = fasttext.train_supervised('train.txt', autotuneValidationFile='test.txt', autotuneMetric="f1:__label__1")

print_results(*model6.test('test.txt'))

sample_size=5342
precision=0.87
recall=0.87
    

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для классификации Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

        # Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ модСль с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ самой высокой Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ 
model6.save_model('optimized.model')

    

fastText Ρ‚Π°ΠΊΠΆΠ΅ способСн ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ТСртвуя лишь нСбольшой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π·Π° счСт количСствСнной ΠΎΡ†Π΅Π½ΠΊΠΈ.

        model.quantize(input='train.txt', retrain=True)
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π° Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ввСдя любоС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

        # Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ, ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ модСль
model = fasttext.load_model("optimized.model")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ классификации ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°
model.predict("Fed official says weak data caused by weather, should not slow taper")

(('__label__0',), array([0.99874038]))
    

ΠœΠ΅Ρ‚ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° с максимальной Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π²Π½Π° __label__0. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π½Π΅ являСтся саркастичСским. Π’ model.predict() Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ k ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ количСство Π»Π΅ΠΉΠ±Π»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вмСстС с ΠΈΡ… показатСлями вСроятности. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ использовали Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ softmax (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² fastText), сумма вСроятностСй Π΄Π²ΡƒΡ… ΠΌΠ΅Ρ‚ΠΎΠΊ Ρ€Π°Π²Π½Π° 1.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ…. Для этого Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ News Aggregator Dataset ΠΈΠ· Kaggle:

        # Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅
df_headline_test = pd.read_csv('uci-news-aggregator.csv')
# ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ 
df_headline_test.TITLE.head(3)

0     Fed official says weak data caused by weather, should not slow taper
1       Fed's Charles Plosser sees high bar for change in pace of tapering
2    US open: Stocks fall after Fed official hints at accelerated tapering
3               Fed risks falling 'behind the curve', Charles Plosser says
4                       Fed's Plosser: Nasty Weather Has Curbed Job Growth
    

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ тСкста ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ ΠΈ создадим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ Π»Π΅ΠΉΠ±Π»ΠΎΠΌ ΠΈ Π΅Π³ΠΎ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ:

        # ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для классификации
df_headline_test['TITLE'] = df_headline_test['TITLE'].apply(clean_text)
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для классификации тСкста
def predict_sarcasm(text):
    return model.predict(text, k=1)
# ВрансформируСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ 
df_headline_test['predict_score'] = df_headline_test.TITLE.apply(predict_sarcasm)
df_headline_test['predict_score'] = df_headline_test['predict_score'].astype(str)
df_headline_test[['label','probability']] = df_headline_test.predict_score.str.split(" ",expand=True)
df_headline_test['label'] = df_headline_test['label'].str.replace("(", '')
df_headline_test['label'] = df_headline_test['label'].str.replace(")", '')
df_headline_test['label'] = df_headline_test['label'].str.replace("__", ' ')
df_headline_test['label'] = df_headline_test['label'].str.replace(",", '')
df_headline_test['label'] = df_headline_test['label'].str.replace("'", '')
df_headline_test['label'] = df_headline_test['label'].str.replace("label", '')
df_headline_test['probability'] = df_headline_test['probability'].str.replace("array", '')
df_headline_test['probability'] = df_headline_test['probability'].str.replace("(", '')
df_headline_test['probability'] = df_headline_test['probability'].str.replace(")", '')
df_headline_test['probability'] = df_headline_test['probability'].str.replace("[", '')
df_headline_test['probability'] = df_headline_test['probability'].str.replace("]", '')

# УдаляСм Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
df_headline_test = df_headline_test.drop(columns=['predict_score'])

# ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ количСство спрогнозированых саркастичСских ΠΈ нСсаркастичСских Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²
df_headline_test.label.value_counts(normalize=True)

0    0.710827
1    0.289173
    

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ 28% Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π±Ρ‹Π»ΠΈ классифицированы ΠΊΠ°ΠΊ сарказм.

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

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ fastText Π½Π΅ являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых послСдних Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ классификации тСкстов (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² 2015 Π³ΠΎΠ΄Ρƒ). Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя это Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ основа для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²: ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ NLP-классификации тСкстов любой слоТности, модСль ΠΈΠΌΠ΅Π΅Ρ‚ сущСствСнноС прСимущСство ΠΈΠ·-Π·Π° простоты Π΅Π΅ использования, скорости обучСния ΠΈ автоматичСской настройки Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ fastText ΠΌΠΎΠΆΠ½ΠΎ ознакомится ΠΏΠΎ ссылкС.

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

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

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

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