Я пытаюсь адаптировать this example к некоторым данным в социальных сетях, которые у меня есть в базе данных SQL-сервера.SciKit-Learn Text Classification от ODBC
Я намеренно заставлял как учебные, так и тестовые комплекты иметь только сообщения в социальных сетях, содержащие слово «пучки». Поэтому я ожидал бы чрезвычайно высокий f-score для этого слова, когда я запускаю его через все алгоритмы. Вместо этого я получаю f-десятки около 2-4%. У меня такое чувство, что я не правильно подаю данные в алгоритмы.
from __future__ import print_function
import numpy as np
from time import time
from sklearn.feature_extraction.text import TfidfVectorizer
import pyodbc
import pprint
#local windows connection
train = []
db = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=SERVER_IP;DATABASE=DB_NAME;Trusted_Connection=Yes;')
cursor = db.cursor()
training_query = "SELECT top 2 percent postTitle FROM dbo.All_CH_Posts where monitorID ='1168136050' and postTitle like '%bunches%' ORDER BY NEWID()"
trainquery = cursor.execute(training_query)
traindata = cursor.fetchall()
for row in traindata:
train.extend(row)
test = []
test_query = "SELECT top 1 percent postTitle FROM dbo.All_CH_Posts where monitorID ='1168136050' and postTitle like '%bunches%' ORDER BY NEWID()"
testquery = cursor.execute(test_query)
testdata = cursor.fetchall()
for row in testdata:
test.extend(row)
print('traindata')
pp.pprint(traindata)
print('testdata')
pp.pprint(testdata)
print('data loaded')
# split a training set and a test set
y_train = train
y_test =test
print("Extracting features from the training dataset using a sparse vectorizer")
t0 = time()
vectorizer = TfidfVectorizer(decode_error='ignore',sublinear_tf=True,
stop_words='english', lowercase=True, min_df=20)
X_train = vectorizer.fit_transform(train)
duration = time() - t0
print("Extracting features from the test dataset using the same vectorizer")
t0 = time()
X_test = vectorizer.transform(test)
duration = time() - t0
print("n_samples: %d, n_features: %d" % X_test.shape)
feature_names = np.asarray(vectorizer.get_feature_names())
print(feature_names)
Я намеренно установить min_df высоко, чтобы взглянуть на то, что слова в моей разреженной матрицы:
n_samples: 237, n_features: 26
['almonds' 'amp' 'best' 'bowl' 'box' 'bunches' 'cereal' 'cheerios' 'crunch'
'day' 'don' 'eat' 'eating' 'good' 'gt' 'honey' 'http' 'just' 'like' 'lol'
'love' 'miss' 'morning' 'oats' 'rt' 'want']
Так что я делаю неправильно? Или я думаю об этой проблеме неправильным образом/имеет неправильное представление о классификации текста?
Итак, каковы ваши ярлыки? В коде вы устанавливаете '' y_train = train'', который выглядит так, будто вы используете текст в качестве ярлыков, что я считаю довольно запутанным. Какие f-баллы вы используете? Фактически, если все тексты имеют общую особенность, эта функция неинформативна и должна иметь f-оценку нуля (iirc). –
Добавляя к комментарию @AndreasMueller, есть ** Загрузите некоторые категории из раздела учебного набора ** в код примера, что означает, что вам нужно указать категории/метки для классификации. Вы можете проверить значение 'data_train.target_names'? Это должен быть список классов, которые вы пытаетесь классифицировать. –
@Guru Ok я думаю я понимаю. Если бы я добавил метки/категории, они были бы идентификатором monitorID. Я не понимаю, как я привязываю метку к данным, которые проходят через вектор, если мои данные поступают из «select monitorID, postTitle from Table», так как это будет список кортежей и приведет к сбою vectorizor. – dreyco676