tf·idf 在Elasticsearch 数据中的应用

前期研究了使用 Elasticsearch term vectors API 的方法,从 ES 中提取文档的词频、文档频率等。其参数如下

  • sum_doc_freq:该字段中所有词的文档频率之和,即包含该词的文档数之和。
  • doc_count:该字段中包含词的文档数,即索引文档总数。
  • sum_ttf:该字段中所有词的总词频之和,即该词在所有文档中出现的次数之和。
  • doc_freq:该词的文档频率,即包含该词的文档数,即文档频率。
  • ttf:该词的总词频,即该词在所有文档中出现的次数。
  • term_freq:该词在当前文档中出现的次数。

其中sum_ttf 是指一个词汇在整个索引中出现的总次数,ttf 是指一个词汇在某个字段中出现的总次数。这些值可以用来衡量一个词汇的重要性或相关性 。
计算 tf·idf 用到的参数是 term_freq,doc_count,doc_freq,然而计算时发现这些参数用于计算词的重要性还不够灵活。

1. 词频的计算

首先,如果只是计算词在文档内的重要性,直接使用
term_freq*log(doc_count/doc_freq)
这个表达式中,term_freq 是 ES 在文档中统计一个词出现的次数,实际的 tf·idf 计算中,tf 要求使用 term_freq/N 来计算词在文档中出现的频率,N 是文档总词量,但是同一篇文档内,由于比较词频时 N不变,所以计算时可以省略。
但是我偏偏还想计算一天内,各词的重要性,即丢掉文档纬度,增加日期维度,这样的话,tf 的计算就不可以丢掉 N,即tf 最终计算得到的是小于1的小数,而不是大于1的整数。ES返回的参数中,无法得到 N,这样就无法计算实际的词频了吗?
我想到的方法是求同篇文档的 sum(term_freq) ≈ N

2. 标题与正文的权重分配

最开始,我将标题的权重设置为正文的 3 倍,即 boost = 3,一开始的处理方法是将标题中的词频 * boost ,与正文的词频相加得到该词在文档中的词频,然而在 ES 中,我将标题与正文拆分为了2个字段,标题的文档频率与正文的文档频率不同,如何统一也是问题,我的处理方法是求平均值。
然而这么处理,虽然可以实现让标题中出现的词在重要性计算中提高该词在文档中的重要性,但实际计算得到的数据让我感觉到,将标题与正文合在一起计算并不是最合理的。
接下来我将标题与正文的 tf·idf 单独分别计算,将得到的结果赋予不同权重,按照8/2分,给标题词得分 * 0.8,正文词得分 * 0.2,这样的得分可以用在按日期做为纬度计算 tf·idf 的分数中。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容