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

时间:2017-02-14 08:02:38

标签: elasticsearch nlp tf-idf

我的弹性搜索中有一个文档,其中包含以下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。我应该自己重新计算吗?这是一个好主意吗?我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

是的,它会返回tf - 术语频率(此字段的两个术语频率和ttf - 这是总术语频率,例如所有字段中所有tf的总和)和df - 文档频率(您在响应中也有它)。您需要确定只想在您的字段或所有字段中计算哪个tf-idf。要计算tf-idf,您需要执行以下操作:

tf-idf = tf * idf

其中

idf = log (N / df)
来自您回复的

N = doc_count。 Elasticsearch不提供计算tf-idf的实现,因此您需要自己完成。

答案 1 :(得分:1)

您可以使用以下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为每个索引创建五个主碎片和一个副本。这意味着每个索引将包含五个主要分片,并且每个分片将具有一个副本。

分配多个分片和副本是分布式搜索功能设计的本质,它提供了高可用性,并且可以快速访问索引中的文档。主分片和副本分片之间的主要区别在于,只有主分片才能接受索引请求。副本和主要分片均可满足查询请求。