利用Wikipedia Clickstream挖掘维基百科概念之间的依赖关系

概念之间的依赖关系

详细请见我之前写过的博文《利用维基百科挖掘概念之间的先决条件关系(初探)

Wikipedia Clickstream

Wikipedia Clickstream 我自己理解就是“维基百科的点击流”,主要是人们在浏览维基百科的时候,或者了解某一个知识时,通过网页查询到维基百科页面上记录下的一次请求。在维基百科当中,页面是通常包含各种各样的超连接,一个链接可能是指向另外一个维基百科概念,或者是指向外部资源例如论文或者新闻网页等。如果我们把链接的去向统一定为维基百科的概念,而请求来源不限(这个来源可以包括1、通过Google、Yahoo直接搜索到对应概念的维基百科页面,2、在维基百科一个概念的主页上点击对应链接来得到,3、其余非客户端网页的Http请求例如爬虫等)的话,统计其中的次数,得到的结果我们就称之为Wikipedia Clickstream。因此将这样的行为可以形式化为(referer, resource)模式,但是在这里resource必须是维基百科的概念页面,而referer形式任意。(如果把resource换为其余的,是不是Wikipedia Clickstream当中的Wikipedia可以改为其他的,感觉可以类推)。

例如可以看下面的图,维基百科词条“London”,获得它可以通过Google、或者维基百科概念“United Kingdom”当中的超链接,以及维基百科主页“Main Page”通过直接搜索等,而London的维基百科页面映射到其余页面点击数最高的就是图右侧当中的England、United Kingdom等。

统计这些请求数据后,将resource视为图中的结点,而请求的次数作为边的权值,那么是不是可以将整个结构看成有向图,推荐系统当中这样的图结构就可以帮助用户推荐各种各样的商品。当然这样的图结构还可以做很多事,我们这里仅讨论如何通过它发现概念之间的依赖关系。

依赖关系与Wikipedia Clickstream的关系

我最早看见他们之间的关系是从导师给的一篇论文当中看见的,这篇文章应该是首次使用Wikipedia Clickstream去挖掘概念之间的依赖关系,论文的题目是《Finding Prerequisite Relations using the Wikipedia Clickstream》,我在谷歌学术当中搜索关键词Wikipedia Clickstream的时候的确没看见很多相关文章,自己在浏览器当中搜索这个关键词的时候也发现与此类似的技术也很少(搜索时间是在2020年3月),因此才想写这篇博文。希望能够对Wikipedia Clickstream感兴趣的提供一些帮助,同时博文当中出现的错误等也希望各位能够理解,因为能够借鉴的知识比较少。

先讲讲如何将Wikipedia Clickstream与概念依赖关系联系起来吧。其实道理很简单,你想你在浏览维基百科当中某一个概念(例如人工智能)的页面的时候,你突然对其中一个词语(机器学习)很感兴趣,于是你就点开对应的链接去查看,这样就进入了该概念(机器学习)对应的维基百科页面(这里我们仅考虑referer和resource都是维基百科页面的情况),因此你想在这两个概念之间是否就存在概念的依赖关系呢?而如果在人工智能页面当中存在另外一个链接概念(例如Google),统计从人工智能到这两个概念(机器学习和Google)的点击次数,如果前者点击数很高(即人工智能到机器学习),那么我们是不是就可以认为人工智能和机器学习之间存在依赖关系,而人工智能与Google之间不存在呢?当然这只是一种猜想,这里也仅仅提供一点点思路。

Finding Prerequisite Relations using the Wikipedia Clickstream提供的相关思路

这篇论文发表与2019年,文章主要工作是利用Wikipedia Clickstream设计出10个特征,最后采用传统的机器学习分类器在CMU数据集以及Metacademy Prerequisite Data进行分类,实验结果证实了他们的想法,他们的十个特征包括:

  • Weight. Total number of clicks from article A to B.
  • Backward weight. Total number of clicks from B to A.
  • Sum. Sum of weight and backward weight.
  • Diff. Absolute difference between weight and backward weight features.
  • Sum of all transitions. Sum of the weights of all outgoing edges from A.
  • Mean of weights. Average of the weights of all outgoing edges from A.
  • Normalized weight. Weight divided by sum of transitions.
  • Normalized backward weight. The backward weight divided by the sum of all transitions for B.
  • Weight greater than mean. A binary feature indicating whether the weight is greater than the mean of weights.
  • Backward weight greater than mean. A binary feature indicating whether the backward weight is greater than B’s mean of weights.

这十个特征在你拥有了Wikipedia Clickstream数据集后实现起来问题不是很大(后文会讲数据集的来源和内容),主要是利用两个概念之间的Clickstream就行,有些搜索算法可能需要仔细写一下,因此在CMU数据集当中可能两个概念对之间不存在链接,这就需要你自己去找中间者将他们之间联系起来,而维基百科的数据量很大,因此搜索算法要好好考虑一下效率问题,不然跑起来很慢。

而我的想法是利用图结构来做实验,上面这篇文章说到底还没用到图当中的性质,只是仅仅采用图中边的权值数据。对于图我想到的算法是随机游走RWR算法,使用这个算法的思路来源于2012年发表的论文《Crowdsourced comprehension:Predicting prerequisite structure in wikipedia》,同时这篇文章也是CMU数据集的缔造者,文章当中就是用的随机游走算法来获得的数据集,因此我想数据从这里来,我就从这里进去。

Wikipedia Clickstream Dataset

官方下载地址:figshare

维基百科下载地址:维基百科clickstream数据

维基百科对应的Clickstream API:不好意思,目前还没找到!!!

这里我仅介绍官方提供的数据情况,这里也仅介绍 2015_01_en_clickstream.tsv.gz 数据情况,其余数据也类似。将其下载后(大约313MB,下载过程比较慢),正常解压到本地后获得文件 2015_01_clickstream.tsv (大约1.06 GB)。文件很大,用一般的文本编辑器也很难打开,不过以后就算这个文件很小也最好不要想着用文本编辑器打开,因为你要想万一以后用的是命令行或者在一些没有编辑器的机器上怎么办,这时候我们应该借用程序去读取几行看看。代码见下:

file_name = r"D:\xxxxxxxx\Wikipedia_Clickstream\2015_01_clickstream.tsv"
index = 0
with open(file_name, encoding="UTF8") as f:
    for line in f:
        index = index + 1
        if index < 100:   # 打印文件当中的前100行
            print(line)
        else:
            break

结果见截图:

似乎每行数据之间还有东西相隔,而且行与行之间也有一个换行。这里自己可以去尝试一下。.tsv(tab separated values;即“制表符分隔值”)其实是和.csv(comma separated values;即“逗号分隔值”)文件类似,都是用对应的分隔符来分割,而每行之间存在一个换行是由于每行文件在读取过程当中将末尾的‘\n’给显示出来了,我们去掉即可。将每行分割后转换为列表,由于头几行比较特殊,这里我们读取中间部分的数据,代码如下:

file_name = r"D:\xxxxxxxx\Wikipedia_Clickstream\2015_01_clickstream.tsv"
index = 0
with open(file_name, encoding="UTF8") as f:
    for line in f:
        index = index + 1
        if index > 10000 and index < 11000:   # 打印文件第10000行和11000之间的数据
            line = line[: -1].split("\t") # 将每行末尾的'\n'去掉,并按照制表符'\t'来分割数据
            print(line)
        if index > 11000:
            break

结果如下:

这次应该就很好理解了吧,每行数据包含5个数据,第一个数据是referer,一般是一个数字(表示维基百科概念对应的id,id的获取可以见我之前的博文《通过Python获取维基百科中概念词条的维基信息》),如果为空的话,那就说明referer一般就是其他的方式,例如Google等,那么第四个字段一般就是other-google等。如果第一个字段是具体的数字的话,那么该值就是第四个字段的概念在维基百科当中的id。第二个字段是resource,均是数字,也就是resource对应概念的维基百科id,第三个字段也是数字,表示从referer到resource对应的Clickstream,而第五个字段就是第二个字段对应id的维基百科概念。需要注意的是数据仅包含Clickstream大于10的,另外还有就是编码问题等,目前还没找到中文维基百科的对应数据,这里展示的是英文的。

利用Wikipedia Clickstream挖掘维基百科概念之间的依赖关系

接下来的工作就很简单了,将这些数据提取出来后,采用随机游走算法对图结构进行训练,计算CMU数据集中概念的特征组,最后用机器学习分类器进行训练即可。

我在这里已经将CMU数据集整理好,包括概念名字、对应id和分类结果,如果你想更加详细了解CMU数据集可以看2012年发表的论文《Crowdsourced comprehension:Predicting prerequisite structure in wikipedia》,数据集很小,但是很经典。下载地址:链接:https://pan.baidu.com/s/1_k0Vi8y6q6zwhp4fcLW_Dw 
提取码:z273

实验大概是这样的,采用PageRank算法和RWR算法分别计算CMU数据集当中每个概念对的特征值,其中对于RWR算法,每次选择的种子seed是概念对当中的第一个概念。RWR算法和PageRank算法迭代次数均为100,容错误差为1e-9,从一个点到另外一个点的概率为0.15。对于Wikipedia Clickstream数据实验过程也不是全部使用,而是将那些referer为空的删除,也就是你需要筛选数据集当中第一个字段不为空的数据。最原始的2015_01_en_clickstream.tsv文件一共包含21998518条记录,而由维基概念点击到另外一个维基概念的记录有12795259条,其中包含最大概念id为44696121,最小id是12。大家可以自己去尝试一下。

对于一个概念对 <A, B> ,我设计的特征包含六个,见下:

  • RWR_A:概念A的RWR值(将A作为RWR算法的seed)
  • RWR_B:概念B的RWR值(将A作为RWR算法的seed)
  • RWR_A - RWR_B:概念A的RWR值与概念B的RWR值之差
  • PageRank_A:概念A的PageRank值
  • PageRank_B:概念B的PageRank值
  • PageRank_A - PageRank_B:概念A的PageRank值与概念B的PageRank值之差

我在这里仅计算了Global Warming对应的featrue值,大家也可以尝试着去计算一下,我计算得到的特征值下载地址:链接:https://pan.baidu.com/s/17okCdxphYw7JRxSwEJCLqw 
提取码:vqui 

最后我采用传统的机器学习算法SVM跑出了64%的正确率(准确率0.662, 召回率0.640),比我导师设计的特征稍微高一点点,但是效果不是很明显。另外2019年的论文正确率有80%多,但是他是二分类,我这里是三分类,因此不能进行直接比较。

希望以上实验和思路可以对概念之间的依赖关系以及Wikipedia Clickstream感兴趣的提供一些思路,有什么不足的地方欢迎各位指正!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值