Керас: классификация твитов

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

У меня есть набор данных из 20 миллионов случайно собранных отдельных твитов (нет двух твитов с одного аккаунта). Позвольте мне сослаться на этот набор данных как "общий" набор данных. Кроме того, у меня есть еще один "конкретный" набор данных, который включает 100000 твитов, собранных от наркоманов (опиоидов). С каждым твитом связан как минимум один тег, например, опиоиды, зависимость, передозировка, гидрокодон и т. Д. (Максимум 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 ответ

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам