Класифициране на текст с Python - изходен код
Учител | 29 октомври 2018 г.
Четенето на настроението на текста с машинно обучение се нарича анализ на чувствата и е един от най-известните случаи на употреба при класификацията на текста. Това попада в много активната изследователска област на обработка на естествен език (NLP).
Други често използвани случаи за класификация на текст включват откриване на нежелана поща, автоматично маркиране на запитвания на клиенти и категоризиране на текста в определени теми. И така, как можете да направите това?
Изберете набор от данни
Преди да започнем, нека да разгледаме данните, с които разполагаме. Продължете и изтеглете набора от данни, преведен на испански от хранилището за машинно обучение на UCI.
Този набор от данни включва маркирани отзиви от IMDb, Amazon и Yelp. Всяка рецензия се отбелязва с оценка 0 за отрицателно настроение или 1 за положително настроение.
Извлечете папката в папка с данни и продължете и заредете данните с Pandas:
Резултатът трябва да бъде следният:
С този набор от данни можете да обучите модел, който да предсказва настроението на изречение.
Един от начините да направите това е да преброите честотата на всяка дума във всяко изречение и да свържете този брой с пълния набор от думи в набора от данни. Бих започнал с вземане на данните и създаване на речник на всички думи във всички изречения. Колекцията от текстове се нарича корпус в PLN.
Речникът в този случай е списък с думи, появили се в нашия текст, където всяка дума има свой собствен индекс. Това ви позволява да създадете вектор за изречение. След това ще вземете изречението, което искате да векторизирате, и ще преброите появата му в речника. Полученият вектор ще бъде лексиката и броят на всяка дума в речника.
Полученият вектор се нарича още вектор на характеристиките. Във вектор на характеристика всяко измерение може да бъде числова или категорична характеристика, като например височината на сградата, цената на запас или, в нашия случай, броят на думите в речника. Тези функционални вектори са решаваща част в науката за данни и машинното обучение, тъй като моделът, който искате да обучите, зависи от тях.
Ще илюстрираме това. Представете си, че имате следните две изречения:
След това можете да използвате CountVectorizer, предоставен от библиотеката scikit-learn, за да векторизирате изречения.
Вземете думите от всяко изречение и създайте речник на всички уникални думи в изреченията. Този речник може да се използва за създаване на вектор от характеристики на броя на думите:
Този речник служи и като индекс за всяка дума. Сега можете да вземете всяко изречение и да получите думите, които се появяват според речника по-горе. Речникът се състои от петте думи в нашите изречения, като всяка от тях представлява дума в речника. Когато вземете двете изречения по-горе и ги трансформирате с CountVectorizer, ще получите вектор, представляващ броя на всяка дума в изречението:
Сега можете да видите получените вектори на характеристиките за всяко изречение въз основа на речника по-горе. Например, ако погледнете първия елемент, можете да видите, че и двата вектора имат 1. Това означава, че и двете изречения имат поява на Джон, който е първи в речника.
Това се счита за модел Bag of Words, което е често срещан начин в PLN за създаване на вектори от текст. Всеки документ е представен като вектор. Вече можете да използвате тези вектори като вектори на функции за модел на машинно обучение. Това ни води до следващата ни част, дефинираща базов модел.
Определяне на базов модел
Когато работите с машинно обучение, важна стъпка е дефинирането на базовия модел. Обикновено това включва прост модел, който след това се използва като сравнение с по-напредналите модели, които искате да тествате. В този случай ще използвате базовия модел, за да го сравните с по-напредналите методи, които включват (дълбоки) невронни мрежи.
Първо, ще разделите данните на набор от обучения и тестове, които ще ви позволят да оцените точността и да видите дали вашият модел обобщава добре. Това означава, ако моделът може да работи добре с данни, които не сте виждали преди. Това е един от начините да видите дали моделът е прекалено подходящ.
Пренастройването е, когато моделът тренира твърде добре по данните за обучение. Искате да избегнете прекаленото монтиране, тъй като това би означавало, че моделът запаметява предимно само данните за обучение. Това би обяснило висока точност на данните за обучение, но ниска точност в данните от теста.
Започваме с вземането на набора от данни Yelp, който извличаме от нашия обединен набор от данни. Оттам вземаме фразите и етикетите. Стойностите ".values" връщат масив NumPy вместо обект на панди, който в този контекст е по-лесен за четене:
Тук отново ще използваме модела Bag of Words по-горе, за да векторизираме изреченията. Можете отново да използвате CountVectorizer за тази задача. Тъй като може да не разполагате с тестови данни по време на обучение, можете да изградите речника, като използвате само данните за обучението. Използвайки този речник, можете да създадете вектори на функции за всяко изречение в набора за обучение и тестване:
Резултат
Можете да видите, че получените вектори на характеристиките имат 750 проби, което е броят на обучителните проби, които имаме след разделяне за набора за обучение. Всяка извадка има 1714 измерения, което е размерът на речника. Освен това може да се види, че получаваме оскъдна матрица.
Това е тип данни, който е оптимизиран за масиви само с няколко ненулеви елемента, който следи само ненулеви елементи, намалявайки натоварването на паметта.
CountVectorizer извършва токенизация, която разделя изреченията в набор от символи, както се вижда по-рано в речника. Освен това премахва пунктуацията и специалните символи и може да приложи друга предварителна обработка към всяка дума. Ако искате, можете да използвате персонализиран токенизатор от библиотеката NLTK с CountVectorizer или да използвате произволен брой персонализации, за да подобрите производителността на вашия модел.
Класификационният модел, който ще използваме, е логистична регресия, която е прост, но мощен линеен модел. Това е форма на регресия между 0 и 1 въз основа на вектора на входните характеристики.
Чрез задаване на гранична стойност (по подразбиране, 0,5), регресионният модел се използва за класификация.
Можете да видите, че логистичната регресия е достигнала впечатляващите 78,8%, но нека видим как работи този модел в другите набори от данни, които имаме. В този скрипт изпълняваме и оценяваме целия процес за всеки набор от данни, който имаме:
Резултат
Страхотен! Можете да видите, че този доста прост модел постига доста добра точност. Би било интересно да видим дали можем да преодолеем този модел. В следващата част ще се запознаем с (дълбоки) невронни мрежи и как да ги приложим за класификация на текста.