【问题标题】:Keras: tweets classificationKeras:推文分类
【发布时间】:2019-04-17 19:10:21
【问题描述】:

亲爱的论坛成员,您好,

我有一个包含 2000 万条随机收集的个人推文的数据集(没有两条推文来自同一个帐户)。让我将此数据集称为“通用”数据集。此外,我还有另一个“特定”数据集,其中包括从药物(阿片类药物)滥用者那里收集的 100,000 条推文。每条推文至少有一个与之关联的标签,例如阿片类药物、成瘾、过量服用、氢可酮等(最多 25 个标签)。

我的目标是使用“特定”数据集使用 Keras 训练模型,然后使用它在“通用”数据集中标记推文,以识别可能由吸毒者撰写的推文。

按照source1source2 中的示例,我设法构建了此类模型的简单工作版本:

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

【问题讨论】:

  • 举个例子,有两条推文,你会说这条推文应该被归类为吸毒者发的推文,而这不是!
  • @RahulAgarwal 我在帖子中添加了两个推文示例。我想这将是区分这两种类型的主要挑战之一,因为一般的推文可能是字面上的任何东西,不太可能包含任何特定的药物相关关键字。我的假设是 Keras 能够从写作风格、拼写、标点符号和其他特定语言的提示中学习。

标签: python machine-learning keras text-classification tweets


【解决方案1】:

我对此的看法是:

  1. 使用来自通用 + 特定数据的推文创建一个新数据集。假设 200k-250K 其中 100K 是您的特定数据集,其余的是一般的

  2. 使用您的 25 个关键字/标签并编写一条规则,如果推文中存在任何一个或多个,它是 DA(吸毒者)或 NDA(非吸毒者)。这将是您的因变量。

  3. 您的新数据集将是一列包含所有推文,另一列包含因变量告诉它是 DA 还是 NDA

  4. 现在分为训练/测试并使用 keras 或任何其他算法。以便它可以学习。

  5. 然后通过绘制混淆矩阵来测试模型

  6. 将其他剩余数据集从 General 传递给此模型并检查,

如果它们是不在特定数据集中的 25 个以外的新词,则从您构建的模型中,它仍会尝试通过组合在一起的词组、音调等智能地猜测正确的类别。

【讨论】:

  • 非常感谢您如此全面的回复,Rahul。我会尽力落实你的建议。作为“标记”方法的替代方案,您认为以下方法是否可行。比如说,我通过 LIWC (liwc.wpengine.com) 运行一般和特定于阿片类药物的推文,它可以提供一组广泛的语言特定特征(大约 20 个参数)。然后将这些参数用作区分特定推文与一般推文的输入。我在这里的假设是 DA 可能使用不同于 NDA 的写作方式。
  • 我不确定这一点,因为对于推文,即使是同一个人也会针对不同的主题写不同的推文。例如:如果你想发布一些关于你的团队赢了一个严肃的话题,那么你的两条推文将是完全不同的。话虽如此,请尝试 LiWc 方法,他们会有所学习。
  • 如果您对答案感到满意,请为未来的用户点赞并接受!
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2015-01-11
  • 2019-01-28
  • 2016-12-27
  • 2019-01-23
  • 2018-03-08
相关资源
最近更新 更多