更好的方法来分配值以确定潜在的假句子

数据挖掘 机器学习 Python 决策树 文本挖掘 无监督学习
2021-09-29 01:33:22

我正在尝试根据有关主题标签、大写字母/单词(例如 HATE)和其他一些信息的存在为每个句子分配不同的值。

我创建了一个包含一些二进制值(1 或 0)的数据框:

Sentence           Upper case   Hashtags
 
I HATE migrants       1             0
I like cooking        0             0
#trump said he is ok  0             1
#blacklives SUPPORT   1             1  

如果满足与否,我想根据上面的二进制值分配一个值,例如:

- if Upper case = 1 and Hashtags = 1 then assign -10;
- if Upper case = 1 and Hashtags = 0 then assign -5;
- if Upper case = 0 and Hashtags = 1 then assign -5;
- if Upper case = 0 and Hashtags = 0 then assign 0;

这对于少量的请求和组合是可以的,但是要检查三个变量,手动考虑更多的组合!您知道是否有一种方法可以以简单(且可行)的方式考虑所有这些问题?

有人告诉我使用回归,但我以前从未将它用于类似的任务。上下文是关于假推文的。

3个回答

我建议测试句子或推文的极性。这可以使用textblob库来完成。它可以安装为pip install -U textblob. 一旦找到文本数据极性,就可以将其分配为数据框中的单独列。随后,可以使用句子极性进行进一步分析。

极性和主观性定义为;

极性是 [-1.0 到 1.0] 范围内的浮点值,其中 0 表示中性,+1 表示非常积极的情绪,-1 表示非常消极的情绪。

主观性是 [0.0 到 1.0] 范围内的浮点值,其中 0.0 非常客观,1.0 非常主观。主观句表达一些个人的感受、观点、信念、意见、指控、愿望、信念、怀疑和推测,而客观句是事实。

数据

import pandas as pd

# create a dictionary
data = {"Date":["1/1/2020","2/1/2020","3/2/2020","4/2/2020","5/2/2020"],
    "ID":[1,2,3,4,5],
    "Tweet":["I Hate Migrants",
             "#trump said he is ok", "the sky is blue",
             "the weather is bad","i love apples"]}
# convert data to dataframe
df = pd.DataFrame(data)

注意,情绪列是一个元组。所以我们可以把它分成两列,比如,df1=pd.DataFrame(df['sentiment'].tolist(), index= df.index)现在,我们可以创建一个新的数据框,我将在其中添加拆分列,如图所示;

df_new = df
df_new['polarity'] = df1['polarity']
df_new.polarity = df1.polarity.astype(float)
df_new['subjectivity'] = df1['subjectivity']
df_new.subjectivity = df1.polarity.astype(float)

接下来,根据之前找到的句子极性,我们现在可以在数据帧中添加一个标签,这将表明推文/句子是假的,不是假的或中性的。

import numpy as np
conditionList = [
    df_new['polarity'] == 0,
    df_new['polarity'] > 0,
    df_new['polarity'] < 0]
choiceList = ['neutral', 'positive', 'negative']
df_new['label'] = np.select(conditionList, choiceList, default='no_label')
print(df_new)

结果将如下所示;

结果

        Date  ID                 Tweet    sentiment  polarity  subjectivity  label
0  1/10/2020   1       I Hate Migrants    (-0.8, 0.9)  -0.8      -0.8        fake
1  2/10/2020   2  #trump said he is ok    (0.5, 0.5)    0.5       0.5        not_fake
2  3/10/2020   3       the sky is blue    (0.0, 0.1)    0.0       0.0        neutral
3  4/10/2020   4    the weather is bad    (-0.68, 0.66) -0.7      -0.7       fake
4  5/10/2020   5         i love apples    (0.5, 0.6)    0.5       0.5        not_fake

完整代码

import pandas as pd
import numpy as np
from textblob import TextBlob
data = {"Date":["1/10/2020","2/10/2020","3/10/2020","4/10/2020","5/10/2020"],
        "ID":[1,2,3,4,5],
        "Tweet":["I Hate Migrants",
                 "#trump said he is ok", "the sky is blue",
                 "the weather is bad","i love apples"]}
    # convert data to dataframe
df = pd.DataFrame(data)
# print(df)
df['sentiment'] = df['Tweet'].apply(lambda Tweet: TextBlob(Tweet).sentiment)
# print(df)

# split the sentiment column into two
df1=pd.DataFrame(df['sentiment'].tolist(), index= df.index)

# append cols to original dataframe
df_new = df
df_new['polarity'] = df1['polarity']
df_new.polarity = df1.polarity.astype(float)
df_new['subjectivity'] = df1['subjectivity']
df_new.subjectivity = df1.polarity.astype(float)
# print(df_new)

# add label to dataframe based on condition
conditionList = [
    df_new['polarity'] == 0,
    df_new['polarity'] > 0,
    df_new['polarity'] < 0]
choiceList = ['neutral', 'not_fake', 'fake']
df_new['label'] = np.select(conditionList, choiceList, default='no_label')
print(df_new)

我了解到您正试图从可用的推文文本中获取新的信息功能。您分两步进行:首先计算虚拟二元特征,然后要将所有二元特征聚合为一个数字特征。

我想到了几个聚合规则:

  1. 只需计算所有二进制特征的总和(如果您确实需要复制示例中的数字,则乘以 -5)。请注意,使用这种方法会丢失一些信息,因为您将无法区分 0,1 和 1,0(两者都会导致 -5,如您的示例中所示)
  2. 使用二进制或格雷码将二进制变量转换为一种数值特征。

例如,对于二进制代码和三个二进制变量,可以按如下方式完成

A) 0,0,0 -> 0

B) 0,0,1 -> 1

C) 0,1,0 -> 2

D) 0,1,1 -> 3

基本上,您只需将二进制变量乘以 2 的相应幂 (1,2,4,...),然后将其相加。

这种方法的问题可能在于它意味着从 A) 到 D) 的距离是从 A) 到 B) 的三倍,这可能不是您所需要的。此外,距离取决于二进制变量的顺序。

编辑1:从标签无监督学习中,我了解到您没有标记的数据集,即您不知道哪些文本属于“假推文”类别。如果没有标记数据,您将无法定义任何客观标准来告诉您一种聚合方法(例如上面建议的一种)比另一种更好。

你可以做什么:

  1. 根据您的直觉手动标记一些推文

  2. 将两种聚合方法应用于标记的推文并检查您是否看到任何模式。如果具有相同标签(例如“假”)的推文具有相似的分数,则可以将聚合方法评估为成功/适当。这可以使用分数和标签之间的相关性或仅使用列联表来量化。

可以手动将值分配给功能级别。但是,通常最好让机器学习算法在训练过程中学习不同特征的重要性。

一般的机器学习过程从标记数据开始。如果标签是数字,这是一个回归问题。在虚假推文的特定情况下,回归标签可能是推文的虚假程度(例如从 1 到 100)。通常,假推文被视为一个分类问题,无论是假的还是假的。

然后,对特征进行编码。您已经部分通过 one-hot 编码不同特征的存在来做到这一点。

接下来,将特征和标签输入机器学习算法。该算法将学习特征的相对权重,以便最好地预测标签。例如,它可能会知道大写字母不能预测,而主题标签可以很好地预测假推文。