Elasticsearch:获取给定文档中每个术语的 tf-idf
Elasticsearch: getting the tf-idf of every term in a given document
我的 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
}
]
}
}
}
}
}
它 returns 我有一些有趣的领域,例如术语频率 (tf) 但不是 tf-idf。我应该自己重新计算吗?这是一个好主意吗?我该怎么做?
是的,它 returns 你 tf
- 术语频率(你有这个领域的术语频率,以及 ttf - 这是总术语频率,例如所有领域的所有 tf 的总和) 和 df
- 文档频率(您在响应中也有它)。您需要决定只计算您的字段或所有字段的 tf-idf。要计算 tf-idf,您需要执行以下操作:
tf-idf = tf * idf
其中
idf = log (N / df)
和 N = doc_count
来自您的回复。 Elasticsearch没有提供计算tf-idf的实现,需要自己动手
您可以使用这个 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 是按分片计算的,因此这些数字可能因当前文档所在的分片而异。
分数是如何计算的?
分数返回的数字主要是为了对不同的建议进行合理的排名,而不是最终用户容易理解的东西。分数来自前景和背景集中的文档频率。简而言之,如果某个术语在子集中和背景中出现的频率存在显着差异,则该术语被认为是重要的。可以配置术语的排名方式,请参阅 "Parameters" 部分。
记住这些定义:
cluster – Elasticsearch 集群由一个或多个节点组成,可通过其集群名称进行识别。
node – 单个 Elasticsearch 实例。在大多数环境中,每个节点都在单独的机器或虚拟机上运行。
index – 在 Elasticsearch 中,索引是文档的集合。
shard – 因为 Elasticsearch 是一个分布式搜索引擎,所以索引通常被分成称为分片的元素,这些元素分布在多个节点上。 Elasticsearch 自动管理这些分片的排列。它还会根据需要重新平衡分片,因此用户无需担心细节。
replica – 默认情况下,Elasticsearch 为每个索引创建五个主分片和一个副本。这意味着每个索引将由五个主分片组成,每个分片将有一个副本。
分配多个分片和副本是分布式搜索功能设计的本质,它提供了对索引中文档的搜索的高可用性和快速访问。主分片和副本分片之间的主要区别是只有主分片可以接受索引请求。副本分片和主分片都可以为查询请求提供服务。
我的 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
}
]
}
}
}
}
}
它 returns 我有一些有趣的领域,例如术语频率 (tf) 但不是 tf-idf。我应该自己重新计算吗?这是一个好主意吗?我该怎么做?
是的,它 returns 你 tf
- 术语频率(你有这个领域的术语频率,以及 ttf - 这是总术语频率,例如所有领域的所有 tf 的总和) 和 df
- 文档频率(您在响应中也有它)。您需要决定只计算您的字段或所有字段的 tf-idf。要计算 tf-idf,您需要执行以下操作:
tf-idf = tf * idf
其中
idf = log (N / df)
和 N = doc_count
来自您的回复。 Elasticsearch没有提供计算tf-idf的实现,需要自己动手
您可以使用这个 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 是按分片计算的,因此这些数字可能因当前文档所在的分片而异。
分数是如何计算的?
分数返回的数字主要是为了对不同的建议进行合理的排名,而不是最终用户容易理解的东西。分数来自前景和背景集中的文档频率。简而言之,如果某个术语在子集中和背景中出现的频率存在显着差异,则该术语被认为是重要的。可以配置术语的排名方式,请参阅 "Parameters" 部分。
记住这些定义:
cluster – Elasticsearch 集群由一个或多个节点组成,可通过其集群名称进行识别。
node – 单个 Elasticsearch 实例。在大多数环境中,每个节点都在单独的机器或虚拟机上运行。
index – 在 Elasticsearch 中,索引是文档的集合。
shard – 因为 Elasticsearch 是一个分布式搜索引擎,所以索引通常被分成称为分片的元素,这些元素分布在多个节点上。 Elasticsearch 自动管理这些分片的排列。它还会根据需要重新平衡分片,因此用户无需担心细节。
replica – 默认情况下,Elasticsearch 为每个索引创建五个主分片和一个副本。这意味着每个索引将由五个主分片组成,每个分片将有一个副本。
分配多个分片和副本是分布式搜索功能设计的本质,它提供了对索引中文档的搜索的高可用性和快速访问。主分片和副本分片之间的主要区别是只有主分片可以接受索引请求。副本分片和主分片都可以为查询请求提供服务。