Керас: классификация твитов - PullRequest
0 голосов
/ 14 ноября 2018

Здравствуйте уважаемые участники форума,

У меня есть набор данных из 20 миллионов случайно собранных отдельных твитов (нет двух твитов с одного аккаунта). Позвольте мне сослаться на этот набор данных как «общий» набор данных. Кроме того, у меня есть еще один «конкретный» набор данных, который включает 100 000 твитов, собранных от наркоманов (опиоидов). С каждым твитом связан по крайней мере один тег, например опиоиды, зависимость, передозировка, гидрокодон и т. Д. (Максимум 25 тегов).

Моя цель - использовать «конкретный» набор данных для обучения модели с использованием Keras, а затем использовать его для пометки твитов в «общем» наборе данных для идентификации твитов, которые могли быть написаны наркоманами.

Следуя примерам source1 и source2 , мне удалось создать простую рабочую версию такой модели:

from tensorflow.python import keras
import pandas as pd
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import LabelBinarizer, LabelEncoder
from sklearn.metrics import confusion_matrix
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.preprocessing import text, sequence
from keras import utils

# load opioid-specific data set, where post is a tweet and tags is a single tag associated with a tweet
# how would I include multiple tags to be used in training?
data = pd.read_csv("filename.csv")
train_size = int(len(data) * .8)
train_posts = data['post'][:train_size]
train_tags = data['tags'][:train_size]
test_posts = data['post'][train_size:]
test_tags = data['tags'][train_size:]

# tokenize tweets
vocab_size = 100000 # what does vocabulary size really mean?
tokenize = text.Tokenizer(num_words=vocab_size)
tokenize.fit_on_texts(train_posts)
x_train = tokenize.texts_to_matrix(train_posts)
x_test = tokenize.texts_to_matrix(test_posts)

# make sure columns are strings
data['post'] = data['post'].astype(str)
data['tags'] = data['tags'].astype(str)

# labeling
# is this where I add more columns with tags for training?
encoder = LabelBinarizer()
encoder.fit(train_tags)
y_train = encoder.transform(train_tags)
y_test = encoder.transform(test_tags)

# model building
batch_size = 32
model = Sequential()
model.add(Dense(512, input_shape=(vocab_size,)))
model.add(Activation('relu'))
num_labels = np.max(y_train) + 1 #what does this +1 really mean?
model.add(Dense(1865))
model.add(Activation('softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size = batch_size, epochs = 5, verbose = 1, validation_split = 0.1)

# test prediction accuracy
score = model.evaluate(x_test, y_test, 
                       batch_size=batch_size, verbose=1)
print('Test score:', score[0])
print('Test accuracy:', score[1])

# make predictions using a test set
for i in range(1000):    
    prediction = model.predict(np.array([x_test[i]]))
text_labels = encoder.classes_ 
predicted_label = text_labels[np.argmax(prediction[0])]
print(test_posts.iloc[i][:50], "...")
print('Actual label:' + test_tags.iloc[i])
print("Predicted label: " + predicted_label)

Чтобы двигаться вперед, я хотел бы уточнить несколько вещей:

  1. Допустим, все мои тренировочные твиты имеют одну метку - опиоиды. Затем, если я пропущу через него не помеченные твиты, разве не вероятно, что модель просто пометит их всех как опиоиды, так как больше ничего не знает? Должен ли я использовать различные твиты / теги для учебы? Возможно, есть какие-то общие рекомендации по выбору твитов / тегов для учебных целей?
  2. Как добавить больше столбцов с тегами для обучения (в коде не используется ни один подобный)?
  3. Как только я обучу модель и достигну соответствующей точности, как мне пропустить немеченые твиты через нее, чтобы делать прогнозы?
  4. Как добавить матрицу путаницы?

Любая другая важная обратная связь также приветствуется.

Спасибо!

Примеры «общих» твитов:

everybody messages me when im in class but never communicates on the weekends like this when im free. feels like that anyway lol.
i woke up late, and now i look like shit. im the type of person who will still be early to whatever, ill just look like i just woke up.

Примеры «определенных» твитов:

$2 million grant to educate clinicians who prescribe opioids
early and regular marijuana use is associated with use of other illicit drugs, including opioids

1 Ответ

0 голосов
/ 14 ноября 2018

Мой выстрел к этому:

  1. Создайте новый набор данных с твитами из общих + специфических данных. Скажем, 200k-250K, где 100K - это ваш конкретный набор данных, остальное - общее

  2. Возьмите свои 25 ключевых слов / тегов и напишите правило, если в твиттере присутствует какой-либо один или несколько из них, будь то DA (злоупотребляющий наркотиками) или NDA (не злоупотребляющий наркотиками). Это будет ваша зависимая переменная.

  3. Ваш новый набор данных будет одним столбцом со всеми твитами и другим столбцом с зависимой переменной, указывающей, что это DA или NDA

  4. Теперь разделитесь на поезд / тест и используйте керас или любой другой алгоритм. чтобы он мог учиться.

  5. Затем протестируйте модель, построив матрицу путаницы

  6. Передайте вам другой оставшийся набор данных от General к этой модели и проверьте,

Если это новые слова, отличные от 25, которых нет в конкретном наборе данных, из построенной вами модели он все равно будет пытаться разумно угадать правильную категорию по группе слов, которые объединяются, звучат и т. Д.

...