如何分类文本答案是否与初始文本问题相关

数据挖掘 分类 Python 支持向量机
2022-03-14 19:46:10

我有一个文本分类问题,我需要将消息的答案分类为相关或不相关。

在我计算的第一阶段,我已经使用 SVM 来确定原始消息是否相关,确定消息是否包含提示或问题是否有人的 Twitter 帐户已被黑客入侵。

example:
"Hey @foobar, have you been hacked?"   <-- relevant
"My bank account has just been hacked" <-- not relevant

但是,当我想对答案是否相关进行分类时,我希望将原始消息和答案都作为输入,对吗?如果答案以任何方式响应原始消息,则与我的情况相关。这种方法是否可以使用 SVM 或任何其他机器学习工具?我将 python 与 scikit-learn 库一起使用。

example:
"Hey @foobar, have you been hacked?"
"@barfoo it seems so, thx for suggesting" <-- relevant

"Hey @foobar, have you been hacked?"
"Lose 20 pounds quickly! http://blabla.com" <-- not relevant

我在这个领域不是很有经验,所以任何输入将不胜感激。

1个回答

消息和答案都是您的输入,因此您的特征向量应该包含有关两者的信息。

这是使用 scikit-learn 的可能解决方案的简单结构:

import numpy as np
from sklearn.svm import SVC
from sklearn.feature_extraction import DictVectorizer

dataset = (("Hey @foobar, have you been hacked?",
            "@barfoo it seems so, thx for suggesting",
            True), # True for relevant, False for not relevant
           ("Hey @foobar, have you been hacked?",
            "Lose 20 pounds quickly! http://blabla.com",
            False))

def extractMessageFeatures(message):
    # here comes your real feature extraction algorithm
    return { 'message_predicted_spam': False,
             'message_contains_valid_username': True }

def extractAnswerFeatures(answer):
    # here comes your real feature extraction algorithm
    return { 'answer_predicted_spam': False,
             'answer_contains_valid_username': True }

def extractFeatures(data):
    features = []
    for instance in data:
        instanceFeatures = extractMessageFeatures(data[0])
        instanceFeatures.update(extractAnswerFeatures(data[1]))
        features.append(instanceFeatures)
    return features

def trainClassifier(data):
    features = extractFeatures(data)
    vec = DictVectorizer()
    featureVector = vec.fit_transform(features)

    print vec.get_feature_names()
    print featureVector.toarray()

    svc = SVC()
    svc.fit(featureVector, np.array([i[2] for i in data]))
    return svc

clf = trainClassifier(dataset)

# now, you can clf.predict(...)

现在,最困难的部分是决定从消息和答案中提取哪些特征。由你决定。

最简单的解决方案之一是使用 n-gram 特征。

其他方法是使用一些垃圾邮件检测来确定答案是否为垃圾邮件,并将此信息视为一个特征。

您还可以使用特定于 Twitter 的信息(例如,用户是否在他们的推文中相互提及,使用相同的主题标签等)。

当然,您可以以任何您喜欢的方式组合这些功能。

除了创建特征提取功能之外,您还需要一个包含消息、答案和相关/非相关标签的标记数据集。

但是,一旦您拥有两者(特征提取功能和适当的数据集),您就可以开始执行与标准机器学习方法明显匹配的任务。