2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Задача классификации строк текстов на 3 класса
Сообщение17.02.2019, 17:58 
Всех приветствую! Так случилось, что мне нужно решить задачку из раздела NLP - прыгнув в море, не умея плавать.
Знаю, что эту конкретную мою задачу опытные аксакалы решают за 5 минут несколькими строками кода на Python3.
Как я уже сказал, плавать я не умею: я не сталкивался раньше ни с задачами машинного обучения, ни с самим Python. Поэтому очень прошу вашей помощи.
На просторах сети примеры решения задачи классификации текстов - описаны очень сложно, абстрактно и не понятно, особенно для новичка, задача решается гораздо проще.
Мне бы увидеть пример решения конкретного, а дальше я уже сам подобные задачи буду решать.

Итак, есть
1. обучаяющая выборка - csv файл со строками: id, text, label. id - номер строки, text - соотвественно текст не предобработанный, метка label - это номер одного из 3 классов.
2. тестовая выборка с полями id, text

Почитав теории, я понял, что скорее всего эту задачу можно решить используя преобразование word2vec и затем классификатор из sklearn. Но для меня это только абстрактные слова, далекие от понимания, как их реализовать в КОДЕ на python. Пожалуйста, помогите его написать. Очень прошу.

 
 
 
 Re: Задача классификации строк текстов на 3 класса
Сообщение17.02.2019, 19:30 
На голом Пайтоне такое не делают. Используют библиотеки. Вам для начала пойдет scikit-learn. Для этой конкретной задачи подходит классификатор SVM. Хм... Где-то у меня валяется на 90% готовый код, если память не изменяет...

 
 
 
 Re: Задача классификации строк текстов на 3 класса
Сообщение17.02.2019, 19:51 
Mihaylo в сообщении #1376673 писал(а):
На голом Пайтоне такое не делают. Используют библиотеки. Вам для начала пойдет scikit-learn. Для этой конкретной задачи подходит классификатор SVM. Хм... Где-то у меня валяется на 90% готовый код, если память не изменяет...


ооо, спасибо за ответ. было бы очень здорово, если бы нашли!

-- 17.02.2019, 21:29 --

Более точечный вопрос, который стоит наиболее остро: как классификатору при обучении SVM указать "правильный ответ" - то есть соотнести каждому тексту метку. И вообще дать ему понять, что каждая строка это есть новый "пример" для обучения.

 
 
 
 Re: Задача классификации строк текстов на 3 класса
Сообщение19.02.2019, 05:17 
Код ниже грузит некоторые готовые тексты из базы данных fetch_20newsgroups (Вам нужно переделать на чтение из файла .csv с помощью функции pd.read_csv()). Выход кода - по 10 самых важных слов в текстах о религии и в текстах о космосе. Эти важные слова - есть суть опорные вектора SVM, по которым собственно тексты классифицируются.

Также код выводит некоторую другую информацию в целях обучения начинающих машинообученцев.

Код:
#Определение опорных объектов

import pandas as pd
data = pd.read_csv('c:/Anaconda/share/svm-data.csv', names=['y','x1','x2'], index_col='y')
y=data.index
x=data.values

from sklearn.svm import SVC
clf = SVC(C=100000.0, kernel='linear', random_state=241)
clf.fit(x,y)
print(clf.support_)

#Настройка оптимизации
from sklearn import datasets
newsgroups = datasets.fetch_20newsgroups(subset='all', categories = ['alt.atheism', 'sci.space'])
data = newsgroups.data
y = newsgroups.target

#Векторизация текста
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(data)
x = vectorizer.fit_transform(data)

#Подбор оптимального параметра С
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
from sklearn.svm import SVC
import numpy as np
grid = {'C': np.power(10.0, np.arange(-5, 6))}
cv = KFold(n_splits=5, shuffle=True, random_state=241)
clf = SVC(kernel='linear', random_state=241)
gs = GridSearchCV(clf, grid, scoring='accuracy', cv=cv)
gs.fit(x,y)
print(gs.best_params_)

clf = SVC(C=1, kernel='linear', random_state=241)
clf.fit(x,y)
W = np.sort(np.absolute(clf.coef_.toarray())) #отсортированные по модулю веса слов
indices = np.argsort(np.absolute(clf.coef_.toarray())) #отсортированные по модулю весов индексы слов
ten_indices = np.array(indices[0,-10:], dtype=int) #последние 10 индексов
list = [vectorizer.get_feature_names()[i] for i in ten_indices]
print(np.sort(list))


Честно говоря, не помню, что за цифры в файле svm-data.csv, но там одни цифры:
Код:
0.0, 0.7, 0.29
1.0, 0.23, 0.55
0.0, 0.72, 0.42
0.0, 0.98, 0.68
0.0, 0.48, 0.39
1.0, 0.34, 0.73
0.0, 0.44, 0.06
1.0, 0.4, 0.74
0.0, 0.18, 0.18
1.0, 0.53, 0.53

 
 
 
 Re: Задача классификации строк текстов на 3 класса
Сообщение19.02.2019, 17:06 
Это похоже отдельная задача. Далее переменные $x$ и $y$ переназначаются.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group