Elasticsearch: 获取给定文档中每个术语的tf-idf值

5

我在elasticsearch中有一个文档,它的id是AVosj8FEIaetdb3CXpP-。我想要访问字段中每个单词的tf-idf值,我进行了以下操作:

GET /cnn/cnn_article/AVosj8FEIaetdb3CXpP-/_termvectors
{
  "fields" : ["author_wording"],
  "term_statistics" : true,
  "field_statistics" : true
}'

我收到的响应是:
{
  "_index": "dailystormer",
  "_type": "dailystormer_article",
  "_id": "AVosj8FEIaetdb3CXpP-",
  "_version": 3,
  "found": true,
  "took": 1,
  "term_vectors": {
    "author_wording": {
      "field_statistics": {
        "sum_doc_freq": 3408583,
        "doc_count": 16111,
        "sum_ttf": 7851321
      },
      "terms": {
        "318": {
          "doc_freq": 4,
          "ttf": 4,
          "term_freq": 1,
          "tokens": [
            {
              "position": 121,
              "start_offset": 688,
              "end_offset": 691
            }
          ]
        },
        "742": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 122,
              "start_offset": 692,
              "end_offset": 695
            }
          ]
        },
        "9971": {
          "doc_freq": 1,
          "ttf": 1,
          "term_freq": 1,
          "tokens": [
            {
              "position": 123,
              "start_offset": 696,
              "end_offset": 700
            }
          ]
        },
        "a": {
          "doc_freq": 14921,
          "ttf": 163268,
          "term_freq": 11,
          "tokens": [
            {
              "position": 1,
              "start_offset": 13,
              "end_offset": 14
            },
            ...
            "you’re": {
          "doc_freq": 1112,
          "ttf": 1647,
          "term_freq": 1,
          "tokens": [
            {
              "position": 80,
              "start_offset": 471,
              "end_offset": 477
            }
          ]
        }
      }
    }
  }
}

它返回了一些有趣的字段,比如词频(tf),但没有tf-idf。我应该自己重新计算吗?这是个好主意吗?如果是,我该怎么做?


你能展示一下你对这个查询的回应吗? - Mysterion
@Mysterion,我已经更新了我的答案。 - mel
2个回答

7

是的,它会返回一个tf——词频(此字段的词频,以及ttf——总词频,例如所有字段中所有tf的总和),以及df——文档频率(响应中也有此内容)。您需要决定要计算哪种仅限于您的字段还是所有字段的tf-idf。为计算tf-idf,您需要执行以下操作:

tf-idf = tf * idf

在哪里?
idf = log (N / df)

从您的响应中取出N = doc_count。Elasticsearch没有提供计算tf-idf的实现,因此您需要自己完成。


1
术语和字段统计仅针对请求文档所在的分片进行检索。因此,术语和字段统计仅作为相对度量有用,而绝对数字在这种情况下没有意义。 - LiJunjie

7
您可以使用此API:

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html

{
   "_index": "imdb",
   "_type": "_doc",
   "_version": 0,
   "found": true,
   "term_vectors": {
      "plot": {
         "field_statistics": {
            "sum_doc_freq": 3384269,
            "doc_count": 176214,
            "sum_ttf": 3753460
         },
         "terms": {
            "armored": {
               "doc_freq": 27,
               "ttf": 27,
               "term_freq": 1,
               "score": 9.74725
            },
            "industrialist": {
               "doc_freq": 88,
               "ttf": 88,
               "term_freq": 1,
               "score": 8.590818
            },
            "stark": {
               "doc_freq": 44,
               "ttf": 47,
               "term_freq": 1,
               "score": 9.272792
            }
         }
      }
   }
}

term_freq - 词项频率。一个词项在一个特定文档的某个字段中出现的次数。

doc_freq - 文档频率。一个词项出现在多少个文档中。

ttf - 总词项频率。这个词项在所有文档中出现的次数,即在所有文档中tf的总和。按字段计算。

df和ttf是每个分片计算的,因此这些数字可能因当前文档所在的分片而异。

如何计算得分?

返回的得分数字主要用于对不同建议进行排序,而不是为最终用户轻松理解而设计的。得分是从前景集和背景集中的文档频率派生出来的。简而言之,如果一个词项在子集和背景中出现的频率有明显的差异,则认为该词项很重要。排名方式可以配置,请参见“参数”部分。

请记住以下定义:

集群 - Elasticsearch集群由一个或多个节点组成,并可通过其集群名称进行识别。

节点 - 单个Elasticsearch实例。在大多数环境中,每个节点运行在单独的计算机或虚拟机上。

索引 - 在Elasticsearch中,索引是文档的集合。

分片 - 因为Elasticsearch是一个分布式搜索引擎,所以索引通常被分成多个元素,称为分片,并分布在多个节点上。 Elasticsearch自动管理这些分片的排列。它还会根据需要重新平衡分片,因此用户不必担心细节。

副本 - 默认情况下,Elasticsearch为每个索引创建五个主分片和一个副本。这意味着每个索引将包含五个主分片,每个分片将有一个副本。

分配多个分片和副本是分布式搜索能力设计的核心,提供高可用性和快速访问索引内文档的搜索。主分片和副本分片之间的主要区别在于只有主分片可以接受索引请求。副本和主分片都可以服务查询请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接