检测假新闻:比较不同的分类方法的准确率(下)

简介: 检测假新闻:比较不同的分类方法的准确率

640.png


假新闻的词云:

from wordcloud import WordCloudfake_data = data[data["target"] == "fake"]
all_words = ' '.join([text for text in fake_data.text])wordcloud = WordCloud(width= 800, height= 500,
                          max_font_size = 110,
                          collocations = False).generate(all_words)plt.figure(figsize=(10,7))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

640.png

真新闻的词云:

from wordcloud import WordCloudreal_data = data[data[“target”] == “true”]
all_words = ‘ ‘.join([text for text in fake_data.text])wordcloud = WordCloud(width= 800, height= 500, max_font_size = 110,
  collocations = False).generate(all_words)plt.figure(figsize=(10,7))
plt.imshow(wordcloud, interpolation=’bilinear’)
plt.axis(“off”)
plt.show()

640.png

词频统计:

# Most frequent words counter (Code adapted from https://www.kaggle.com/rodolfoluna/fake-news-detector)  
from nltk import tokenizetoken_space = tokenize.WhitespaceTokenizer()def counter(text, column_text, quantity):
    all_words = ' '.join([text for text in text[column_text]])
    token_phrase = token_space.tokenize(all_words)
    frequency = nltk.FreqDist(token_phrase)
    df_frequency = pd.DataFrame({"Word": list(frequency.keys()),
                                    "Frequency": list(frequency.values())})
    df_frequency = df_frequency.nlargest(columns = "Frequency", n = quantity)
    plt.figure(figsize=(12,8))
    ax = sns.barplot(data = df_frequency, x = "Word", y = "Frequency", color = 'blue')
    ax.set(ylabel = "Count")
    plt.xticks(rotation='vertical')
    plt.show()

假新闻中出现频率最高的词汇:

counter(data[data[“target”] == “fake”], “text”, 20)

640.png

真新闻中出现频率最高的词汇:

counter(data[data[“target”] == “true”], “text”, 20)

640.png


建模

建模过程将包括对存储在“text”列中的语料库进行向量化,然后应用TF-IDF,最后使用分类机器学习算法。都是非常标准的文本分析和NLP操作。

对于建模,我们有这个函数来绘制模型的混淆矩阵:

# Function to plot the confusion matrix (code from https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html)
from sklearn import metrics
import itertoolsdef plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i, j],
                  horizontalalignment="center",
                  color="white" if cm[i, j] > thresh else "black")plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

分割数据

X_train,X_test,y_train,y_test = train_test_split(data['text'], data.target, test_size=0.2, random_state=42)

逻辑回归

# Vectorizing and applying TF-IDF
from sklearn.linear_model import LogisticRegressionpipe = Pipeline([('vect', CountVectorizer()),
                 ('tfidf', TfidfTransformer()),
                 ('model', LogisticRegression())])# Fitting the model
model = pipe.fit(X_train, y_train)# Accuracy
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

准确率是98.76%,混淆矩阵如下:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

640.png

决策树

from sklearn.tree import DecisionTreeClassifier# Vectorizing and applying TF-IDF
pipe = Pipeline([('vect', CountVectorizer()),
                  ('tfidf', TfidfTransformer()),
                  ('model', DecisionTreeClassifier(criterion= 'entropy',
                                            max_depth = 20,
                                            splitter='best',
                                            random_state=42))])
# Fitting the model
model = pipe.fit(X_train, y_train)# Accuracy
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

准确率是99.71 ,混淆矩阵如下:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

640.png

随机森林

from sklearn.ensemble import RandomForestClassifierpipe = Pipeline([('vect', CountVectorizer()),
                  ('tfidf', TfidfTransformer()),
                  ('model', RandomForestClassifier(n_estimators=50, criterion="entropy"))])model = pipe.fit(X_train, y_train)
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

准确率是98.98 % ,混淆矩阵如下:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

640.png

结论

文本分析和自然语言处理可以用来解决假新闻这一非常重要的问题。我们已经看到了它们对人们的观点、世界对一个话题的思考方式所产生的巨大影响。

我们已经建立了一个机器学习模型,使用样本数据来检测虚假文章,使用Python构建模型,并且比较不同分类模型的准确率。

感谢阅读这篇文章,希望它能对您当前的工作或对数据科学的调查和理解有所帮助。

目录
相关文章
|
1月前
|
编解码 算法 数据挖掘
WoodYOLO:用于木材种类鉴定的YOLO改进版
【论文解读】WoodYOLO通过木材的显微图像发现木材的特征,可用于木材种类鉴定,性能优于通用的YOLO
45 7
|
8月前
|
机器学习/深度学习 自然语言处理
专治大模型说胡话,精确率100%!华科等提出首个故障token检测/分类方法
【4月更文挑战第29天】华中科技大学等机构研究者提出首个针对大语言模型故障token的检测与分类方法,精确率高达100%,显著提升文本质量。该方法利用上下文信息及注意力机制的神经网络,有效识别语法、语义和事实错误,但在逻辑和风格错误检测上仍有待改进。虽然计算成本高且无法实时干预生成过程,但为优化LLM提供了新途径。[论文链接](https://arxiv.org/abs/2404.09894)
70 1
|
机器学习/深度学习 自然语言处理 算法
【网安AIGC专题11.1】11 Coreset-C 主动学习:特征选择+11种采样方法+CodeBERT、GraphCodeBERT+多分类(问题分类)二元分类(克隆检测)非分类任务(代码总结)
【网安AIGC专题11.1】11 Coreset-C 主动学习:特征选择+11种采样方法+CodeBERT、GraphCodeBERT+多分类(问题分类)二元分类(克隆检测)非分类任务(代码总结)
219 0
|
SQL 机器学习/深度学习 开发框架
【网安AIGC专题10.25】8 CoLeFunDa华为团队:静默漏洞检测(识别+多分类)+数据增强、样本扩充+对比学习+微调+结果分析(降维空间,分类错误样本归纳,应用场景优势,有效性威胁分析)
【网安AIGC专题10.25】8 CoLeFunDa华为团队:静默漏洞检测(识别+多分类)+数据增强、样本扩充+对比学习+微调+结果分析(降维空间,分类错误样本归纳,应用场景优势,有效性威胁分析)
317 0
|
数据采集 存储 机器学习/深度学习
秒懂算法 | 基于朴素贝叶斯算法的垃圾信息的识别
本文将带领大家亲手实现一个垃圾信息过滤的算法。 在正式讲解算法之前,最重要的是对整个任务有一个全面的认识,包括算法的输入和输出、可能会用到的技术,以及技术大致的流程。 本任务的目标是去识别一条短信是否为垃圾信息,即输入为一条文本信息,输出为二分类的分类结果。2002年,Paul Graham提出使用“贝叶斯推断”过滤垃圾邮件。1000封垃圾邮件可以过滤掉995封,且没有一个误判。另外,这种过滤器还具有自我学习的功能,会根据新收到的邮件,不断调整。收到的垃圾邮件越多,它的准确率就越高。 朴素贝叶斯算法是一种有监督的机器学习算法,即算法的实现包含了构建训练集、数据预处理、训练、在测试集上验证
525 0
秒懂算法 | 基于朴素贝叶斯算法的垃圾信息的识别
|
数据可视化 计算机视觉
其实没有NMS检测也可以很强很快 | O2F样本匹配助力目标检测逃离NMS时代(二)
其实没有NMS检测也可以很强很快 | O2F样本匹配助力目标检测逃离NMS时代(二)
211 0
|
机器学习/深度学习 算法 固态存储
其实没有NMS检测也可以很强很快 | O2F样本匹配助力目标检测逃离NMS时代(一)
其实没有NMS检测也可以很强很快 | O2F样本匹配助力目标检测逃离NMS时代(一)
182 0
|
机器学习/深度学习 编解码 自动驾驶
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
联合训练2D-3D多任务学习 | 深度估计、检测、分割、3D检测通吃
361 0
|
机器学习/深度学习 存储 自然语言处理
大规模蛋白质翻译后修饰提取模型BioBERT,具有远程监督和置信度校准
大规模蛋白质翻译后修饰提取模型BioBERT,具有远程监督和置信度校准
286 0