VocabAnalysisPlugin和ZipfAnalysisPlugin源码分析
首先明白二者分析输出的是啥,有什么作用。
(1)下面是VocabAnalysisPlugin截图
唯一id域输出
keywords域输出
keywords 域输出
Id 域完全不重复输出上图
不同文档集合的时候,覆盖这个域当前词典的情况。出现平行或者缓行时,随着文档增加,这个域的新词没有同步增加,或者增加趋势不大
分析图可以得到
1 某个域的Term增长情况,也就反应词典规模
2 越平,反应文档中重复的内容越多,文档的质量不是很好
3 随着文档集合的扩大,Field中Term结合也在扩大,趋势可以反应后面的文档添加共享新词的粒度问题。
源码分析
float firstDocId = td.doc();//firstDocId 表明首次出现 理解这个非常重要
域term统计就观察,随着文档的添加,这个域里面的term集合扩展情况,间接发现新增文档的内容质量,只统计首次出现了该term,而不是统计全部的。新增doc是id是递增的。 输出group的时候,也是按照id递增聚合起来,这样上图就顺利的生成了。
(2)ZipfAnalysisPlugin
基本原理:
Step1 收集df
遍历指定域,去每个term,取term的df。小于df的长尾数组收集,大于df的链接数组收集。
Step2 df排序
对longtail term 数组排序,按df降序
Step3初始桶个数100
唯一词数量小于初始值100,那每个term一桶,
唯一词数量大于初始值100,每个桶最多 totalNum/初始值
Step4
将排序的long-tail 数组元素,依次put到桶中,桶满就new一个
Step5
将short-tail 数组元素,从后向前依次put到桶中,桶满就new一个
Step6
遍历桶链,取最大的df 均值
桶的行为:只统计了Term数目、最大、最小df值、df总和、平均值
重要概念理解
most terms occur very infrequently - just keep group totals for the DFs
representing these "long tail" terms.
// 低频term分组聚会起来,保存他们的DFS 的和,和代替长尾
// 将出现term关联文档的个数低于1000的作为长尾的End
// For "short tail" terms there are less of them and they represent a lot of different DFs (typically in the thousands),so unlike long-tail terms ,we can't predict what common DF buckets to accumulate counts in. For this reason, we don't attempt to total them and keep a list of them individually (shouldn't occupy too much ram)
端链的-长尾词,聚会起来,计数他们的数量,然后从长到短收集到桶中。端链的收集时就合
长链的-端尾词,按照df降序,然后收集到桶中,长链的
横坐标表示:keywords这个域中不同term总数,纵坐标表示桶中df均值。
从左至右看,越右边越是长尾。这里对长尾的定义:稀有Term、Term关联的文档数量。
图中左边没有完整,因为df大于长尾的df=1000词没有出现。
低频词覆盖范围 或者说长尾词覆盖范围 长尾词对搜索引擎营销有帮助
另外长尾词搜索时,结果更准确。长尾词被查询的比例很大的话,那么搜索收益会更多,这是长尾在网络的效应