python检查中文文章、字段、新闻抄袭情况,returntopN抄袭文章(抄袭识别技术方案一)

项目背景

国内文章、新闻、微博抄袭情况严重(包括CSDN),如何在大数据背景下快速识别抄袭来源于“我方”的文本显得尤为重要,word自带的查重,网上一些查重软件只能查一份文件的查重率,暴露两大缺点,一是作为机构方,只想查到抄袭我方机构的文献及抄袭我方的情况,且是否抄袭过大,而不是查重软件的查重率,二是一份一份上传效率上不高。

一、项目总体介绍

大数据时代下,对数据库的文本进行查询,设置我方机构和非我方的文本,将非我方机构涉嫌抄袭我方机构的文本可能抄袭的topN文献输出。(数据源、代码在文末链接)

二、使用到的技术

jieba:对中文进行分词(如是英文考虑用NLTK);
TF-IDF(term frequency–inverse document frequency):分词后计算词频,依据文本的词频初步进行判断文本之间的相似情况;
朴素贝叶斯分类:依据TF-IDF输出的特征进行分类(也可用lr,xgb等等分类);
KMeans聚类(手肘法):对TF-IDF输出的特征进行降维;
cosine_similarity:计算文本之间的余弦相似度;
字典、numpy、pandas等

三.整体步骤

step1.数据加载
step2.数据预处理。删除文本为空的行业,结巴分词+去除停用词
step3.分词后的文本特征TF-IDF
step4.切分数据集,验证二分类(是否为我方的)算法的召回率、准确率
step5.基于文本特征进行风格预测,判断是否与我方风格一致,如来源不是我方,但风格一致的可能便是copy的文章;
step6.对文本特征进行聚类降维;
step7.用余弦相似度计算文本之间的距离,只在我方发布的文章中查找
step8.找一篇可能是copy的文章,查看可能抄袭的文章,余弦相似度最近的topN文章

四.实战

数据源如下(一列为数据来源,一列为文本):
在这里插入图片描述
step1.数据加载

#数据加载
data = pd.read_csv('G:/git/python检查文章、新闻、字段的抄袭情况/sqlResult.csv',encoding = 'gb18030' )
data.head()

在这里插入图片描述
step2.数据预处理。删除文本为空的行业,结巴分词+去除停用词

#step2.数据预处理1.删除content、source为空的行
data = data.dropna(axis=0,subset=['content'])
data = data.dropna(axis = 0,subset = ['source'])
#2.结巴分词+加载停用词
with open('G:/git/python检查文章、新闻、字段的抄袭情况/chinese_stopwords.txt',encoding='utf-8') as file:
    stopwords = [i[:-1] for i in file.readlines()]
def word_split(text):
    text = text.replace(' ','').replace('/n','')
    text2 = jieba.cut(text)
    result = ' '.join([t for t in text2 if t not in stopwords])
    return result
print(stopwords)
print(data.iloc[0].content)
print(word_split(data.iloc[0].content))
corpus = list(map(word_split,[str(i) for i in data.content]))

在这里插入图片描述
step3.查看文本的特征,TFIDF

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
countVectorizer = CountVectorizer(encoding='gb18030',min_df=0.015)
tfidfTransformer = TfidfTransformer()
countVectorizer = countVectorizer.fit_transform(corpus)
tfidfTransformer = tfidfTransformer.fit_transform(countVectorizer)
print(tfidfTransformer)

在这里插入图片描述
#step4.切分数据集,验证二分类(是否为我方的)算法的召回率、准确率

#step4标记是否为新华社文章,切分数据集
label = list(map(lambda i:1 if '新华社' in str(i) else 0,data.source))
#数据集切分
x_train,x_test,y_train,y_test = train_test_split(tfidfTransformer.toarray(),label,test_size=0.2)
#多项式朴素贝叶斯、伯努利贝叶斯分类准确率
model_m = MultinomialNB()
model_m.fit(x_train,y_train)
pred_m = model_m.predict(x_test)
print('MultinomialNB的准确率',accuracy_score(y_test,pred_m))
print('MultinomialNB的精确率',precision_score(y_test,pred_m))
print('MultinomialNB的召回率',recall_score(y_test,pred_m))

在这里插入图片描述
step5.预测文章风格是否和自己一致

#step5.预测文章风格是否和自己一致
prediction = model_m.predict(tfidfTransformer.toarray())
label = np.array(label)
compare = pd.DataFrame({'label':label , 'pred':prediction})
copy_index= compare[(compare['label'] == 0)&(compare['pred']==1)].index
print('可能为copy的新闻条数:',len(copy_index))
#实际为新华社的新闻
xinhuashe_news_index = compare[(compare['label'] == 1)].index

在这里插入图片描述
step6.对tfidf.toarray()进行聚类降维

from sklearn.preprocessing import Normalizer
from sklearn.cluster import KMeans
normalizer = Normalizer()
scale_array = normalizer.fit_transform(tfidfTransformer.toarray())
kmeans = KMeans(n_clusters=25)
k_label = kmeans.fit_predict(scale_array)
#对分类创建序号
id_class = {index:class_ for index,class_ in enumerate(k_label)}

step7.创建新华社发布的字典

from collections import defaultdict
class_id = defaultdict(set)
for index,class_ in id_class.items():
    if index in xinhuashe_news_index.tolist():
        class_id[class_].add(index)
#查找相似的文章
from sklearn.metrics.pairwise import cosine_similarity
#只在新华社发布的文章中查找
def find_similar_text(cpindex,top=10):
    dist_dict = {i:cosine_similarity(tfidfTransformer[cpindex],tfidfTransformer[i]) for i in class_id[id_class[cpindex]]}
    return sorted(dist_dict.items(),key = lambda  x:x[1][0],reverse=True)[:top]

step8.如查找某一篇是否为copy的,如果是抄袭的,查看可能抄袭的文章

cpindex = 2447
print('是否在新华社',cpindex in xinhuashe_news_index)
print('是否在copy_news',cpindex in copy_index)
similar_list = find_similar_text(cpindex)
print(similar_list)

print('怀疑抄袭:\n',data.iloc[cpindex].content)
#找一篇相似的原文
similar2 = similar_list[0][0]
print('相似的原文:\n',data.iloc[similar2].content)

在这里插入图片描述
检查中文文章、字段、新闻抄袭情况(数据及代码)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝翔厨师长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值