翟天临不知道的知网是怎么用技术实现论文查重?不妨实现一个!

从春节开始,翟天临“学霸人设”崩盘的事件闹的不可谓不热闹。仅仅做了一场直播,就让翟天临此前在粉丝心中人设全无。

其导火索是翟天临做直播时面对粉丝的提问说不知道“知网”,结果被春节放假空闲在家的“硕士、博士”网友们,扒了个底朝天。

原本粉丝的意图是希望在知网上欣赏到偶像的论文大作,没想到翟天临的回答却是惹恼莘莘学子的“知网是啥?”

对于该事件不想说太多,我们从技术方面聊一下翟天临口中不知道的知网,并且...做一个出来!

知网全称为“中国知网”,是我国最大的文献数据库,其收录的文献总量超过2亿篇。可以说,只要用中文做学术,你就绕不开知网。

我大学念的仅仅是本科,说实话,当年毕业时写的毕业论文(国际经济与贸易),也是通过网上检索拼凑完成的,最后算是能顺利“蒙混”过关。但是这种学术不端的行为除了我自己需要反省外,也需要看到这归结于我国目前本科教育对于论文的不重视所致。所以对于知网,在我的学习生涯中接触是有限的。

而对于进一步的学术研究来说,知网是怎么也避免不了接触了(翟天临等算是例外)。无论是硕士还是博士的毕业都需要发表一定要求的学术论文。除了能在知网上搜索查阅到几乎所有的学术论文外,知网还提供一项最近被频繁提及的查重率服务。

查重率是指知网对用户提交的论文文本与其文献数据库收录的所有文献进行比对得出论文与数据库中的文献可能发生高度重合的一个报告结果。

之前在翟天临回答不知知网为何物后,就有网友自费查询(这也是知网很重要的一个盈利点)并曝光了对翟天临论文的“查重率”结果。中国知网显示,翟天临的论文文字复制比达40.3%,总字数2783的文章中重复字数1125。

知道了知网能做啥,不妨顺着我的思路和示例代码简单实现:

首先如果要做一个知网,我们不得不想方设法拿到足够多的文献作为基础数据库。

然后放一个客户端的提交论文按钮:

核心当然是后端代码。查重率在技术上是依靠分词技术配合上算法来实现比较两个文本之间的重合率。

对于算法和底层技术并非我熟悉和擅长,我主要想通过基于底层技术把查重实现:

类似这样涉及大量算法和海量数据的程序,通常使用底层C语言,我这里简单用node实现。

我搜了下有个文本查重算法是叫simhash,于是在npmjs库里意外搜到了simhash-js这个node写的类库,那就好办了:

先写个两个文本查重率的函数checkSim:


const sjs = require('simhash-js');
const simhash = new sjs.SimHash();

module.exports = (text1,text2)=>{
    return sjs.Comparator.similarity(
        simhash.hash(text1),
        simhash.hash(text2)
    )
}

其实只是用了别人的api,照着用就好了。亲自试试这个查重率函数:

const sim = require('./sim')
let res1 = sim('我是一个帅哥','我是一个美男')
let res2 = sim('我是一个超级超级大帅哥','我不是一个美男')
console.log(res1) //log 0.3
console.log(res2) //log 约0.16

嗯,还算可以,接着我们将函数暴露给控制器Controller:

const checkSim = require('./service/checkSim')

module.exports = async (ctx,next)=>{
    let userText = ctx.request.body.text
    //获取用户提交的论文
    let allArticleList = await ArticleModel.findAll()
    //拿到所有的论文,有点海量啊
    let allResult = allArticleList.map(item=>{
        return checkSim(userText,item.text)
    })
    //将用户论文与数据库里每篇文章进行查重率比较,并返回重复率
    return allResult.filter(item=>item>0.2)
    //将可能涉及抄袭(重合率大于20%)的文章返回用户
}

以上就是如果要自己打造一个知网,最核心的查重率的业务逻辑。当然了,实际业务肯定要复杂得多,我也只是利用别人写好的查重方法来做业务上的开发。实际上为了提高效率肯定和示例代码有不少原则上的出入,譬如为了在海量数据库里进行对比,估计是采用队列+通知来进行信息的反馈。

最后警示广大学子们 - 学术不规范 亲人两行泪!