Автоматты аударма пайдаланылды

Streamlit көмегімен ML + Орналастыру Арқылы Мәтіндік Көңіл-Күйді Талдауды Орнату бойынша нұсқаулық

Менің атым Асхат Әубәкіров, МЕН ЖАҚЫНДА TECHORDA бағдарламасы аясында OUTPEERKZ Ұсынған Деректер Ғылымы Курсын бітірдім.

Бүгін Мен Өзім білетін нәрселермен бөлісу және жастарды деректер ғылымы әлеміне қосылуға шабыттандыру үшін Петропавлдағы Makerspace студенттеріммен деректер ғылымы жобаларын жасап жатырмын.

Міне, біз көптеген кездесулерімізде осылай жасадық. Бізді кезең-кезеңімен қадағалаңыз, сонда сіз деректер ғалымдарының қалай жұмыс істейтінінің маңызды қадамдарын түсінесіз.

Маңызды: осы нұсқаулықты орындаған кезде кітапханаларды орнатуды ұмытпаңыз пип және github репозиторийіндегі файлдарды қараңыз (https://github.com/askhat-aubakirov/sentiment/tree/main б.

  • Оқыту кезеңінде: Юпитер Дәптерінде:- Деректер Жиынтығымен жұмыс:--- Деректерді Жүктеу, --- Деректерді Барлау Талдауы, --- Деректерді Тазалау,--- Деректерді Өңдеу,--- Ерекшеліктер Инженериясы.- Тренингке дайындық:--- Кездейсоқ Орман Моделін Жүктеу,--- Массивтерді оқыту және сынау үшін деректерді бөлу.- Оқыту және тестілеу- Модельді сақтау
  • Орналастыру сатысында:- Жүктеу Streamlit--- Streamlit элементтері бар визуалды шаблон жасау--- Jupyter Ноутбугынан пайдаланушы кірістерін токенизациялауға, лемматизациялауға және векторлауға бейімдеу функциялары--- орналастыру үшін тек қажетті деректерді алу- Қолданбаны жергілікті түрде іске қосу және пайдаланушылармен процесті Тексеру
  • Жоба үшін github репо: https://github.com/askhat-aubakirov/sentiment

Біз NLP (Natural Language Processing) зерттеуін жүргіземіз және мәтіндерді сезім санаттарына жіктеу үлгісін жасаймыз. Қысқаша айтқанда, бұл қолданушыдан мәтін алуға және "оң", "теріс" және т.б. сияқты үкімдердің бірін қайтаруға арналған қосымша болуы керек.

Бұл мәселе бойынша деректер Kaggle сайтында оңай табылады. Міне сілтеме: https://www.kaggle.com/datasets/jp797498e/twitter-entity-sentiment-analysis

пандаларды есептеулер үшін pd #pandas ретінде импорттаңыз
matplotlib импорттау.pyplot plt # matplotlib РЕТІНДЕ EDA қадамдарында графиктерді салуға арналған
деректер жиынын тазалауға көмектесу үшін re #regexes кітапханасын импорттаңыз
импорттау кеңістігі # лемматизация функциясына арналған кітапхана
склерннен.ансамбльді импорттау RandomForestClassifier #біз қолданатын машиналық Оқыту моделі 
склерннен.метрикалар біздің жетістігімізді өлшеу үшін accuracy_score, f1_score #метрикаларын импорттайды
склерннен.ерекшелік_шығару.мәтінді импорттау TfidfVectorizer # сөздер мен мәтінді матрицаға түрлендіру әдісі
склерннен.model_selection импорттау train_test_split #деректерді бөліктерге бөлу
үлгіні жергілікті жерде сақтау үшін joblib #кітапханасын импорттаңыз

Осы уақытқа дейін біз қандай кітапханаларды импорттағанымызды көре аласыз:

  • пандалар: матрицалық алгебрадағы есептеулер үшін пайдаланылады (біз деректер жиынын матрица ретінде сақтаймыз және оған қол жеткіземіз)
  • матплотлиб: графиктерді жасау үшін пайдаланылады -> осылайша статистика және көрнекіліктер арқылы деректер жиынының теңгерімсіз немесе тым лас екенін көреміз
  • re: NLP үшін өте пайдалы құрал, күрделі жолдарды тану және оларды манипуляциялау үшін өрнектер жасауға көмектеседі
  • спейси: алдын ала жүктелген тоқтату сөздері мен тілдің корпустары бар кітапхана
  • Кездейсоқ орман жіктеуіші: біз қолданатын модель. (Бұл не? Міне, кейбір көрнекі түсініктеме: https://youtu.be/cIbj0WuK41w
  • көрсеткіштер: Формула-1 дәлдігі мен ұпайы (толығырақ төменде)
  • TfidfVectorizer: сөздерді сандық матрицаға түрлендірудің тамаша құралы-алгоритм бойынша сіңімді форма
  • train_test_split: модельді үйрету және көрсеткіштерді есептеу үшін сізге бірнеше бөліктер қажет, олар жаттығулар жиынтығы және тест жиынтығы.
  • joblib: оқытылған үлгіні бір файлға сақтауға арналған кітапхана - > біз оны кейінірек орналастыру процесінде қолданамыз

EDA-талдау алдында деректеріңізді түсіну үшін деректер ғылымындағы маңызды қадам. Бұл мыналарды қамтиды:

  • Қорытындылау: орташа, медианалық, стандартты ауытқу сияқты статистиканы Есептеу.
  • Көрнекілік: гистограммалар, шашырау учаскелері және қорап учаскелері сияқты учаскелерді Құру.
  • Тазалау: жетіспейтін мәндермен Және шектен тыс мәндермен Жұмыс істеу.

Тұтынушыларды сату туралы мәліметтер жиынтығы үшін:

  • Түйіндеме: сатып алудың орташа сомасын Және бірегей тұтынушылардың санын Есептеңіз.
  • Көрнекілік: сатып алу сомаларының таралуын көру үшін гистограмма Жасаңыз.
  • Тазалау: тұтынушы мекенжайларындағы жетіспейтін мәндерді Өңдеңіз.

EDA деректеріңіздегі үлгілерді, қатынастарды және ықтимал мәселелерді анықтауға көмектеседі.

Біріншіден, біз деректерді жүктейміз (Kaggle-ден алдын ала сақталған):

деректер = pd.read_csv ('twitter_training.csv')

Содан кейін біз әрі қарай жүріп, деректерді қарап шығамыз басы() пандалардан әдіс:

деректер.басы()

Осылайша, біз бұл нәтижені аламыз:

	2401 Borderlands Positive мен borderlands-Ке кіремін, мен бәріңді өлтіремін ,
0 2401 Шекаралас Аймақтар Оң мен шекараға келемін, мен сені өлтіремін...
1 2401 Шекаралас Аймақтар Оң, мен шекаралас аймақтарға жетемін, мен сені өлтіремін ...
2 2401 Шекаралас Аймақтар Оң, мен шекаралас аймақтарға келемін, мен сені өлтіремін...
3 2401 Borderlands Оң, мен borderlands 2-ге кіремін, мен өлтіремін ...
4 2401 Шекаралас Аймақтар Шекаралас аймақтарға Кіргеніме Оң болды, мен сені өлтіре аламын...

Біз Оның Кейбір Идентификаторлары бар екенін анық көреміз (2401 және т.б.).), Субъектілердің Атаулары (Шекаралық Аймақтар және т.б.) Және Көңіл-күй (Позитивті және т. б.). Бұл сынып, басқаша айтқанда). Бірақ бұл жерде бізде тақырыптар жоқ. Оларды қосайық:

деректер_ жарамдылығы.бағандар = ['ID', 'нысан', 'сезім', 'мазмұн']
деректер_ жарамдылығы.басшы(5)
        ID нысанының сезім мазмұны
0 352 Amazon Бейтарап BBC Жаңалықтары-Amazon бастығы Джефф Безос clay-ден бас тартады...
1 8312 Microsoft Теріс @Microsoft WORD жұмыс істеп тұрған кезде НЕГЕ ТӨЛЕЙМІН...
2 4371 CS-GO Теріс CSGO сәйкестігі шкафты бұзуға толы,...
3 4433 Google Бейтарап Қазір Президент Американдықтарды ұрып жатыр...
ФИФА-ның 4 6273 Теріс Нәтижесі, Сәлем @EAHelp, Менің камерамда Мадлен Макканн болды...

Енді бұл жақсырақ, біздің тақырыптарымыз жақсы және таза.

Кейбір диаграммаларды жасап, деректер жиынын статистикалық түрде қарастыратын кез келді. Біз қолданамыз матплотлиб. Мұқият оқып шығыңыз - > код өзін түсіндіреді.

# Деректер Шеңберінен нысан белгілерін алыңыз
entity_labels = деректер ['нысан']

entity_labels = деректер ["нысан"].value_counts () #бізде бар мәндерді санаңыз

басып шығару (entity_labels)

plt.сурет (сурет өлшемі=(12, 6))
белгілер_атауы.сюжет (түрі= "бар")
plt.атауы ("субъектілердің Мәндерін Санау")
plt.xlabel ("нысан")
plt.ylabel ("Санау")
plt.xticks (қаріп өлшемі=10) #оқылым үшін қаріп өлшемін азайтыңыз-өкінішке орай, оқылым нөлге жақын
plt.көрсету()

plt.сурет (сурет өлшемі=(4, 4))
белгілер_атауы.сюжет (түрі= "қорап")
plt.атауы ("субъектілердің Мәндерін Санау")
plt.xlabel ("нысан")
plt.ylabel ("Санау")
plt.xticks (қаріп өлшемі=10)
plt.көрсету()

матплотлиб деп аталады plt. Біз жай ғана графиктердің 2 түрін құрудың кіріктірілген әдістерін атаймыз: штрих-график және қорап графигі. Біз мұны нәтиже ретінде аламыз:

нысан
TomClancysRainbowSix 2400
Мадденнфль 2400
Microsoft 2400
Лиганың талаптары 2394
Каллофдути 2394
Verizon 2382
CallOfDutyBlackopsColdWar 2376
Апекслегендтер 2376
Facebook 2370
WorldOfCraft 2364
Нүкте2 2364
НБА 2К 2352
Томклансгострекон 2346
Ұрыс алаңы 2346
ФИФА 2340
Xbox(Xseries) 2334
Overwatch 2334
johnson&johnson 2328
Amazon 2316
PlayStation5 (PS5) 2310
Үй қоймасы 2310
Киберпанк2077 2304
КС-ГО 2304
Грандтефтавто (GTA) 2304
...
Фортнита 2274
RedDeadRedemption(RDR) 2262
AssassinsCreed 2244
Аты: count, dtype: int64

Нәтиже деректер жиынындағы нысандардың саны туралы ақпаратты береді. Деректер жиынтығы теңдестірілген (себебі ол кураторланған), сондықтан бізде шешуге болатын деректерге қатысты мәселелердің санына "минус бір" бар. 

Екі сюжет те теңдестірілген деректерді көрсетеді. Бұл дегеніміз, оқу процесі өте дәл модельге әкелуі мүмкін. Алға қарай жүрейік.

Бізде мәтіндік деректер бар екенін білеміз. Бірақ бұл лас. Біз жұмыс істеп жатқан твиттер қате жазулармен, тыныс белгілерімен, тіркелгі өңдеушілерімен, Url Мекенжайларымен және нөмірлермен толтырылған. Біз қажетсіз таңбалардан құтылу функциясын анықтаймыз таза_твит. 

def clean_tweet (мәтін):
    егер жағдай болса (мәтін, str):
        мәтін = мәтін.төменгі () # кіші әріпке Түрлендіру
        мәтін = re.sub(r' http\S+|www\S+|https\S+',", мәтін, жалаушалар=re.MULTILINE) # Url Мекенжайларын Жою
        мәтін = re.sub (r'\@\w+|\#', ", мәтін) # ескертулер Мен хэштегтерді Алып Тастаңыз
        мәтін = re.sub (r'[^\w\s]', ", мәтін) # тыныс белгілерін Алып Тастаңыз
        мәтін = re.sub (r'\d+', ", мәтін) # Сандарды Алып Тастаңыз
    басқа:
        мәтін = " # бос жолды қайтару немесе қажетінше өңдеу арқылы float (NaN) сияқты жолсыз кірістерді Өңдеңіз
    
    мәтінді қайтару

Мұндағы негізгі бөлім re кітапхана пайдаланылуда. Бұл тұрақты тіркестер кітапханасы. 

Http\s+|www\s+|https\s+ тұрақты өрнегі мәтіндегі Url Мекенжайларын сәйкестендіру үшін пайдаланылады. Міне, оның құрамдас бөліктерінің бөлінуі:

  • http\S+: "Http" жолына сәйкес келеді, содан кейін бір немесе бірнеше бос емес таңбалар. Бұл http Url Мекенжайларын түсіреді.
  • www\S+: "Www" жолына сәйкес келеді, содан кейін бір немесе бірнеше бос емес таңбалар. Бұл "www"деп басталатын Url Мекенжайларын түсіреді.
  • https\S+: "Https" жолына сәйкес келеді, содан кейін бір немесе бірнеше бос емес таңбалар. БҰЛ HTTPS Url Мекенжайларын түсіреді.
  • Туралы | таңба-тұрақты өрнектің үш үлгінің кез келгеніне сәйкес келуіне мүмкіндік беретін "немесе" операторы ретінде әрекет ететін құбыр таңбасы.

Енді біз әдісті қолданамыз қолдану() бұл функцияны деректер жиынының әрбір элементіне пайдалану үшін:

# Тазалау функциясын "мазмұн" бағанына қолданыңыз
деректер ['clean_content'] = деректер ['content'].қолдану(clean_tweet)

Жарайсың. Біздің деректер қорымызда қазір таза мәтін бағанасы бар:

деректер.басшы(5)
	ID нысанының сезім мазмұны clean_content
0 2401 Шекаралас Аймақтар Оң мен шекараға келемін, мен сені өлтіремін...	мен шекараға келе жатырмын, мен сені өлтіремін...
1 2401 Шекаралас Аймақтар Оң, мен шекаралас аймақтарға жетемін, мен сені өлтіремін ...	мен шекаралас жерлерге барамын, мен бәріңді өлтіремін
2 2401 Шекаралас Аймақтар Оң, мен шекаралас аймақтарға келемін, мен сені өлтіремін...	мен шекаралас жерлерге барамын, мен сені өлтіремін...
3 2401 Borderlands Оң, мен borderlands 2-ге кіремін, мен өлтіремін ...	мен шекаралас жерлерге барамын, мен сені өлтіремін...
4 2401 Шекаралас Аймақтар Шекаралас аймақтарға Кіргеніме Оң болды, мен сені өлтіре аламын...	мен шекаралас аймақтарға кіремін, мен сені өлтіре аламын...

Енді NLP-дің ең жақсы бөлігі! Осы үш процестің түсіндірмелерін қараңыз:

  • Мәтінді кішірек бірліктерге (таңбалауыштарға) бөлу.
  • Мысал:" жылдам қоңыр түлкі жалқау иттің үстінен секіреді"болады ["The"," quick"," brown"," fox"," jumps"," over"," the"," жалқау","dog"].
  • Сөздерді түбір формасына дейін азайту (лемма).
  • Мысалы:" жүгіру"," жүгіру"," жүгіру ""жүгіру" болып қысқартылады.
  • Мәтінді сандық көріністерге (векторларға) түрлендіру.
  • Мысал: мәтінді сандық вектор ретінде көрсету үшін Сөз Қапшығы (Садақ) немесе TF-IDF сияқты әдістерді Пайдалану.

Ал енді, код:

nlp = кеңістік.жүктеу ('en_core_web_sm')

токенизация_және_лемматизация (мәтін):
  """
  Кіріс мәтінін таңбалауыштайды және лемматизациялайды.

  Арг:
      мәтін: енгізілген мәтінді білдіретін жол.

  Қайтару:
      леммалардың тізімі
  """
  леммалар = []

  doc = nlp (мәтін)

  doc ішіндегі таңбалауыш үшін:
      егер token. is_alpha емес, token. is_stop болса:
          леммалар.қосымша (жетон.лемма_)
    
  жаңа_лемма_токендер ="".қосылу (леммас) #Арсен дұрыс айтты - > менде шегініс қатесі болды

  жаңа_лемма_токендерді қайтару
деректер ['lemmas'] = деректер ['clean_content'].қолдану(таңбалауыш_және_лемматизациялау)

Ал қазір деректер жинағын қарасақ, біз келесідей нәрсені көреміз:

        ID нысанының сезім мазмұны clean_content lemmas
0 352 Amazon Бейтарап BBC Жаңалықтары-Amazon бастығы Джефф Безос clay-ден бас тартады...	bbc news amazon бастығы джефф безос бұл мәлімдемені қабылдамайды...	bbc news amazon бастығы джефф безос бұл мәлімдемені қабылдамайды ...
1 8312 Microsoft Теріс @Microsoft WORD жұмыс істеп тұрған кезде НЕГЕ ТӨЛЕЙМІН...	неліктен мен word үшін ақы төлеймін, ол осылай жұмыс істейді...	word функциясын нашар төлеңіз chromebook
2 4371 CS-GO Теріс CSGO сәйкестігі шкафты бұзуға толы,...	csgo матчтарын жасау шкафтарды бұзуға толы ...	csgo matchmaking closet hack шынымен қорқынышты ойын
3 4433 Google Бейтарап Қазір Президент Американдықтарды ұрып жатыр...	қазір президент американдықтарды ұрып жатыр...	президент американдықтарды шапалақпен ұрып, оларды заңсыз деп таныды ...
ФИФА-ның 4 6273 Теріс Нәтижесі, Сәлем @EAHelp, Менің камерамда Мадлен Макканн болды...	сәлем, менің жертөлемде мадлен макканн болды ...	сәлем mad мадлен макканнның жертөлесі өткен жылы кішкентай болды...

Осы уақытқа дейін мәтінге қандай айырмашылықтар енгізгенімізді қарастырайық:түпнұсқа мәтін " @Microsoft WORD жұмыс істеп тұрған кезде МЕН НЕГЕ ТӨЛЕЙМІН..."болды" неге мен word бағдарламасы осылай жұмыс істегенде төлеймін..."содан кейін "chromebook-тің ақылы сөз функциясы нашар"болды.Қулық мынада: твиттің мағынасы әр сөзді емес, тек леммаларды оқығанда анық болады.

Ал Енді Векторлау. Бұл сандарға түрлендіру. Біз модель матрицаларын сөзбен емес, сандармен тамақтандыруымыз керек. Бұл тапсырма Үшін БІЗ Tf-IDF Векторын қолданамыз:

Ол осылай жұмыс істейді: 1) біз жетондарды аламыз (сөздер, терминдер) x және оның құжатта қанша рет бар екенін есептеңіз y, содан кейін біз терминнің жиілігін есептейміз x бұл құжатта y - > бұл TF_x, y2) біз көбейтеміз TF_x, у бірге IDF (бұл терминді қамтитын құжаттар көлеміне бөлінген құжаттардың жалпы көлемінің логарифмі x.

Бұл бізге сөздің маңыздылығы туралы үлкен түсінік береді. Мысалы, бізде "мен", "бар", "біз" және т.б. сияқты көптеген сөздер болуы мүмкін. Олардың көпшілігі болғанымен, олар өте маңызды емес. Екінші жағынан, бізде "бақытты", "ұсқынсыз" немесе осыған ұқсас сөздер туралы аз ғана ескертулер болуы мүмкін, бірақ олар маңызды.Сонымен, Tf-IDF Векторизаторы жиіліктің салыстырмалы коэффициенттерін береді (0-ден 1-ге дейінгі кез келген қалқыма), оның көмегімен терминдердің маңыздылығын бағалауға болады.

Бұл кодта қалай көрінеді:

# лемматизацияланған мәтінді векторлау - > бұл негізінен Мүмкіндіктер Инженериясы, өйткені бізде мәтіндік деректер бар және max_features анықтаймыз
векторизатор = TfidfVectorizer (кіші әріп=Жалған, max_features=10000, ngram_range=(1, 2))
векторланған_деректер = векторландырушы.fit_transform (деректер ['леммалар'].құндылықтар.астип ('U'))
векторланған_деректер = pd.Деректер шеңбері (векторланған_деректер.toarray (), бағандар=векторизатор.get_feature_names_out())

ТҮСІНДІРУ:векторизатор = TfidfVectorizer (кіші әріп=Жалған, max_features=10000, ngram_range=(1, 2)) сияқты параметрлері бар векторизатор жасайды кіші әріп=Жалған, өйткені кіші әріп бұрын қолданылған, max_features=10000 жаңа мүмкіндіктер бағандарының санын анықтау үшін, және ngram_range=(1, 2) ерекшеліктер тек бір сөзден ғана емес, екі сөздің тіркесімінен де тұруы керек. Бұл өте ыңғайлы, өйткені, мысалы, медициналық деректер жағдайында "жүрек" және "ұстама" сияқты сөздер бөлек мағынаға ие болуы мүмкін, бірақ "инфаркт" маңыздырақ мағынаға ие.

Енді бізде бар деректер жинағы келесідей және пішіні 74681 x 10000:

аа аа аа аа аа аарон аб санкциядан бас тартады abc абелла абелла қаупі ...	zero dawn zion zip zoe zombie zone zonestreamcx zoom zsmitty zuckerberg
0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
1	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
2	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
3	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
4	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
5	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
6	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
7	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
8	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
9	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0

Оның 10 000 сөзі мен сөз тіркестері бар екенін ескеріңіз, олардың әрқайсысының құжаттарда өз жиілігі бар. Енді бұл біз модельге бере алатын матрица.

Біз оны үйрету үшін деректер жинағын бөліп алуымыз керек, содан кейін көрсеткіштерімізді алу үшін оны сынауымыз керек.

Қазіргі уақытта біз схеманың сол жағындамыз. Біздің ерекшеліктеріміздің матрицасы және сыныптарымыз бар. Біз Оны X_train, y_train (оқу матрицасы немесе "сұрақтар" және мақсатты сыныптар немесе "жауаптар") деп бөлуіміз керек. Сонымен қатар, X_test және y_test. Бұл біздің модельдің қаншалықты жақсы (немесе нашар) жұмыс істейтінін тексеру үшін қажет.

X_train, X_test, y_train, y_test = train_test_split(векторланған_деректер, деректер ["сезім"], test_size=0,2, random_state=42)

Біз жұмыс істейтін модель-Кездейсоқ Орман Классификаторы. 

  1. Жүктеу Жолағын Іріктеу: Ауыстыру арқылы кездейсоқ іріктеу: бастапқы деректер жиынынан Бірнеше ішкі жиындар (жүктеу жолағының үлгілері) жасалады. Әрбір ішкі жиында қайталанатын даналар болуы мүмкін.
  2. Ауыстыру арқылы кездейсоқ іріктеу: бастапқы деректер жиынынан Бірнеше ішкі жиындар (жүктеу жолағының үлгілері) жасалады. Әрбір ішкі жиында қайталанатын даналар болуы мүмкін.
  3. Шешім Ағашының Ғимараты: Кездейсоқ мүмкіндіктерді таңдау: әрбір ағаш үшін мүмкіндіктердің жалпы санынан мүмкіндіктердің кездейсоқ жиыны таңдалады.Шешім ағашының өсуі: әрбір шешім ағашы кесілмей максималды тереңдікке дейін өсіріледі.
  4. Кездейсоқ мүмкіндіктерді таңдау: әрбір ағаш үшін мүмкіндіктердің жалпы санынан мүмкіндіктердің кездейсоқ жиыны таңдалады.
  5. Шешім ағашының өсуі: әрбір шешім ағашы кесілмей максималды тереңдікке дейін өсіріледі.
  6. Болжау: Дауыс беру: жаңа инстанцияға болжам жасау үшін әрбір шешім ағашы өз дауысын береді. Қорытынды болжам ретінде ең көп дауыс жинаған сынып таңдалады.
  7. Дауыс беру: жаңа инстанцияға болжам жасау үшін әрбір шешім ағашы өз дауысын береді. Қорытынды болжам ретінде ең көп дауыс жинаған сынып таңдалады.
рф = Кездейсоқ Орман Жіктеуіші (n_estimators=100, random_state=42)

рф.жарамды (X_train, y_train)

n_estimators Кездейсоқ Орман жіктеуішінде ансамбльде өсірілетін шешім ағаштарының саны туралы айтылады. кездейсоқтық_мемлекет=42 бұл тұқымның бір түрі - > репродуктивтілікті қамтамасыз ету үшін қолданылады. Сондай-ақ, бұл "Автостопшылардың Галактикаға Арналған Нұсқаулығы" кітабына сілтеме, онда өркениет өмірдің мәні неде деп сұрап, галактикадағы ең үлкен компьютерден жауап ретінде "42" алды. Бұл өте қызық емес пе?

Кездейсоқ Орман Моделі жаттығуды аяқтаған кезде (маған 11 минут кетті), бұл мынаны көрсетеді:

Енді тексеріп көрейік. Біз өзіміздің болжамдарымызды жасаймыз X_test орнату, алу y_pred нәтиже ретінде, содан кейін нәтижелерді салыстырыңыз тест тапсырыңыз сияқты көрсеткіштер арқылы Дәлдігі және Формула-1 Ұпайы.

Міне, осы көрсеткіштердің не екенін түсіндіру (басқа көрсеткіштермен бірге):

Ал енді код және шығыс:

y_pred = рф.болжау(X_test)

дәлдік = дәлдік_скор(y_test, y_pred)
f1 = f1_score (y_test, y_pred, average= "макро")

басып шығару ("Дәлдік:", дәлдік)
басып шығару ("Формула-1 ұпайы:", формула-1)
Дәлдігі: 0.8594764678315592
Формула-1 ұпайы: 0,8567240271159241

Біздің модельдің дәлдігі 86,95% және Формула-1 ұпайы 85,67 деп айта аламыз%

Енді модельді "органикалық" үлгіде сынап көрейік. Модельге кіріс ретінде басымыздан біраз мәтін беріңіз, бірақ оны алдын ала өңдеуді ұмытпаңыз (тазалау, токенизация, лемматизация, векторлау + пішімді салыстыру және өзгерту -> кіріс матрицасының бағандары бағандармен бірдей болуы керек.пойыз матрицасы). Міне, бұл үшін код:

nlp = кеңістік.жүктеу ('en_core_web_sm', өшіру=['талдаушы', 'ner'])
тақырыптар = pd.read_csv ("тек тақырыптар.csv")
rf_model = joblib.жүктеу ('rf_model.джоблиб")
векторизатор = TfidfVectorizer (кіші әріп=Жалған, max_features=10000, ngram_range=(1, 2))

токенизация_және_лемматизация (мәтін):
  """
  Кіріс мәтінін таңбалауыштайды және лемматизациялайды.

  Арг:
      мәтін: енгізілген мәтінді білдіретін жол.

  Қайтару:
      леммалардың тізімі
  """
  леммалар = []

  doc = nlp (мәтін)

  doc ішіндегі таңбалауыш үшін:
      егер token. is_alpha емес, token. is_stop болса:
          леммалар.қосымша (жетон.лемма_)
          жаңа_лемма_токендер ="".қосылу (леммалар)

  жаңа_лемма_токендерді қайтару

def predict_condition (user_input):
  """
  Пайдаланушының енгізуін алдын-ала өңдейді, SVM моделін қолдана отырып терінің күйін болжайды,
  және болжау нәтижесін қайтарады.

  Арг:
      user_input: пайдаланушының сипаттамасын білдіретін жол.

  Қайтару:
      Терінің болжамды күйі бар жіп.
  """
  көріңіз:
      # Кіші әріппен және тыныс белгілерін алып тастаңыз
      #user_input = user_input.төмен()
      #user_input ="".қосылу ([егер char болса, user_input ішіндегі char үшін char.isalnum () немесе char.isspace ()])
      
      # Токенизация және лемматизация
      # lemmatized_text = таңбалауыш_және_лемматизация (пайдаланушы_инпутация)
      
      # Мәтінді векторлау
      vectorized_input = векторизатор.fit_transform ([user_input])
      векторланған_инпут = pd.Деректер шеңбері (векторланған_инпут.toarray (), бағандар=векторизатор.get_feature_names_out())
      #векторланған_инпутация = pd.Деректер шеңбері (векторланған_инпутация)

      # Оқу деректерінен жетіспейтін бағандарды жүктеңіз (бар болса)
      missing_columns = set (тақырыптар.бағандар) - set (векторланған_input.бағандар)
      векторланған_инпут = векторланған_инпут.reindex (бағандар=тақырыптар.бағандар, толтыру_мәні=0)

      vectorized_input = vectorized_input [тақырыптар.бағандар]
      
      # Модель арқылы болжау
      болжау = rf_model.болжау(векторланған_инпутация)[0]

      # Болжау нәтижесін қайтарыңыз
      қайтару болжамы

  Ерекшелікті қоспағанда e:
      # Алдын ала өңдеу немесе болжау кезінде ықтимал қателерді өңдеңіз
      error_message = f " қате орын алды: {str (e)}"
      қайтару Жоқ
  
user_input = " ИӘ, менің моделім жақсы және өте жылдам жұмыс істейді! Оны сынап көрейік"
user_input = user_input.төмен()

болжам = болжам_кондиционы(пайдаланушы_кірісі)
басып шығару (болжам)

Мына жолдарға назар аударыңыз:

  • missing_columns = set (тақырыптар.бағандар) - set (векторланған_input.бағандар)
  • векторланған_инпут = векторланған_инпут.reindex (бағандар=тақырыптар.бағандар, толтыру_мәні=0)

Олар пойыздар жиынтығының бағандары кіріс бағандарымен бірдей екеніне көз жеткізу үшін осында. Бұл механизмнің қарапайым көрінісі, адам сөйлеуден білетін сөздерді ғана танитын кездегідей. Біздің модель білмейтін сөздерге келетін болсақ, ол жай ғана нөлдерді қояды, бұл біз біреудің сөйлеуіндегі бір немесе бірнеше сөз туралы білмейтін нәрсені елемейтінімізге тең.

Сонымен, " ИӘ, менің моделім жақсы және өте жылдам жұмыс істейді! Оны сынап көрейік " - бұл Оң

Оң

Енді оны қолданбаға айналдырайық. Streamlit-Бұл Деректерді Зерттеушілер үшін арнайы пайдалануға болатын қарапайым кітапхана, өйткені ОЛ БАРЛЫҚ ПАЙДАЛАНУШЫ ИНТЕРФЕЙСІН көрсетуге қамқорлық жасайды. 

Есіңізде болсын, streamlit қолданбасы үшін пайдаланушы енгізуін жоғарыдағы енгізу ретінде мәтінді алдын ала өңдеудің барлық қадамдарынан өту керек. Бірақ мәселе мынада, біз Жаттығуға арналған пойыздардың барлық жиынтығын Юпитер Дәптеріне жүктедік, бұл жерде бізге қажет емес, өйткені деректер жиынтығы өте үлкен. Бізге тек тақырыптар қажет, сондықтан біз жаттығулар жиынтығын тек бағандарды қалдыру үшін басқарамыз (мәліметтерді мына жерден көруге болады пойыз_жинағы.ипынб).

Бізге тек деректер жиынтығын жүктеп, осы әдісті қолдану қажет (бұл өте қарапайым):

жаңа_df = pd.Деректер шеңбері (бағандар=X_train.бағандар)

Осыны ескере отырып, бізде streamlit қолданбасын іске қосу үшін осы код болады:

импорт кеңістігі
импорт streamlit ретінде st
joblib импорттау
пандаларды pd ретінде импорттаңыз
склерннен.ерекшелік_шығару.мәтінді импорттау TfidfVectorizer
# sklearn сайтынан.model_selection импорттау train_test_split
# sklearn сайтынан.көрсеткіштер импорттау дәлдігі_скор, дәлдік_скор, еске түсіру_скор, f1_скор

nlp = кеңістік.жүктеу ('en_core_web_sm', өшіру=['талдаушы', 'ner'])
тақырыптар = pd.read_csv ("тек тақырыптар.csv")
rf_model = joblib.жүктеу ('rf_model.джоблиб")
векторизатор = TfidfVectorizer (кіші әріп=Жалған, max_features=10000, ngram_range=(1, 2))

@st. cache_resource
def load_model():
    жұмысқа қайта оралу.жүктеу ('rf_model.джоблиб")

токенизация_және_лемматизация (мәтін):
  """
  Кіріс мәтінін таңбалауыштайды және лемматизациялайды.

  Арг:
      мәтін: енгізілген мәтінді білдіретін жол.

  Қайтару:
      леммалардың тізімі
  """
  леммалар = []

  doc = nlp (мәтін)

  doc ішіндегі таңбалауыш үшін:
      егер token. is_alpha емес, token. is_stop болса:
          леммалар.қосымша (жетон.лемма_)
          жаңа_лемма_токендер ="".қосылу (леммалар)

  жаңа_лемма_токендерді қайтару


def predict_condition (user_input):
  """
  Пайдаланушының енгізуін алдын-ала өңдейді, SVM моделін қолдана отырып терінің күйін болжайды,
  және болжау нәтижесін қайтарады.

  Арг:
      user_input: пайдаланушының сипаттамасын білдіретін жол.

  Қайтару:
      Терінің болжамды күйі бар жіп.
  """
  көріңіз:
      # Тыныс белгілерін кіші әріппен жазыңыз және алып тастаңыз
      user_input = user_input.төмен()
      user_input ="".қосылу ([егер char болса, user_input ішіндегі char үшін char.isalnum () немесе char.isspace ()])
      
      # Токенизация және лемматизация
      lemmatized_text = tokenize_and_lemmatize (user_input)
      
      # Мәтінді векторлау
      vectorized_input = векторизатор.fit_transform ([lemmatized_text])
      векторланған_инпут = pd.Деректер шеңбері (векторланған_инпут.toarray (), бағандар=векторизатор.get_feature_names_out())
      векторланған_инпут = pd.Деректер шеңбері (векторланған_инпутация)

      # Оқу деректерінен жетіспейтін бағандарды жүктеңіз (бар болса)
      #missing_columns = set (тақырыптар.бағандар) - set (векторланған_input.бағандар)
      векторланған_инпут = векторланған_инпут.reindex (бағандар=тақырыптар.бағандар, толтыру_мәні=0)
      #векторланған_инпут = векторланған_инпут.тағайындау (**{col: 0 үшін col in missing_columns})

      vectorized_input = vectorized_input [тақырыптар.бағандар]
      ст. жазу (векторланған_инпутация)
      # Модель арқылы болжау
      болжау = rf_model.болжау(векторланған_инпутация)[0]

      # Болжау нәтижесін қайтарыңыз
      қайтару болжамы

  Ерекшелікті қоспағанда e:
      # Алдын ала өңдеу немесе болжау кезінде ықтимал қателерді өңдеңіз
      error_message = f " қате орын алды: {str (e)}"
      ст. қате (error_message)
      қайтару Жоқ

# Қолданбаның орналасуы мен функционалдығын оңтайландырыңыз
st. title (": көк[Мәтіндік Көңіл-Күй Анализаторы] Қолданбасы")
user_input_text = st. text_area ("мәтінді мына Жерге Жаз:", биіктігі=100)

егер st. батырмасы("Болжау"):
    болжам = болжам_кондиционы(user_input_text)
    егер болжам болса:
        ст. сәттілік (f " Болжамды шарт: {болжам}. \n")
    басқа:
        ст. ескерту ("Болжам сәтсіз аяқталды. Қайталап көріңіз және / немесе әзірлеушілермен кеңесіңіз.")

# Модель туралы ақпаратты көрсету (міндетті емес)
ст. тақырып ("Модель Туралы Ақпарат")
st. header ("бұл қолданба Оқытылған Кездейсоқ Орман үлгісімен жұмыс істейді.", бөлгіш = "кемпірқосақ")

ст. жазу ("- көңіл-Күй тұрғысынан талданатын Мәтін")
ст. жазу ("- Data Science Club Group One")
ст. жазу ("- IG: @american_corner_petropavlovsk")
ст. жазу ("- клуб жүргізушісі: Асхат Әубәкіров")
ст. жазу ("- Жарияланған Күні: 2024 жылғы 17 қыркүйек")

Кейбір өңдеушілер мен жеңілдетілген арнайы әдістер бар екеніне назар аударыңыз. Олардың барлығын олардың ресми парағынан табуға болады: https://docs.streamlit.io/develop/quick-reference/cheat-sheet

Міне, өнім қалай көрінеді:

Сіз бұл мақаланы пайдалы деп таптыңыз деп үміттенемін.Ізгі ниетпен,Асхат.

Менің LinkedIn: https://www.linkedin.com/in/askhattio/

Пікірлер 8

Кіру пікір қалдыру үшін

👍👍👍👍👍👍👍👍👍👍👍👍

Жауап беру

🔥🔥

Жауап беру

🔥🔥🔥🔥

Жауап беру

Классно. Как раз поступил на курсы дата скайнс при поддержке техорда

Жауап беру

Поздравляю! Надеюсь, этот материал поможет разобраться в ML и NLP)

Жауап беру

супер!

Жауап беру

спасибо за отзыв)

Жауап беру