使用Node JS客户端从Elasticsearch索引中提取最重要的单词

受以下git和video的启发,我试图为我的域名创build概念性search,使用word2vec作为我的查询的同义词filter。

给出以下文件结构:

 { "_index": "conversations", "_type": "conversation", "_id": "103130", "_score": 0.97602403, "_source": { "context": "Welcome to our service, how can I help? do you offer a free trial", "answer": "Yes we do. Here is a link for our trial account." } } 

我想遍历整个索引,并提取“更重要”(tf-idf?)的单词。
一旦我有了前100个单词列表,我将使用word2vec创build一个同义词filter。

我的问题是:如何使用ES节点JS客户端做到这一点?

文档的Tf-Idf通常用于查找文档的相似性(使用余弦相似度,欧几里得距离等)

Tf或术语频率表示文档中单词的频率。 单词的频率越高,单词的重要性越高。

Idf或逆文档频率表示包含该单词的(input集合的)文档的数量。 这个词更难得,更重要的是这个词。

如果我们只是使用TF来构build文档向量,我们很容易发生垃圾邮件,因为常见的单词(例如:代词,连词等)变得更加重要。 因此,td-idf的组合给出了更好的意义,并指出了这个词的真正意义。 或者换句话说,根据重要性对文档中的单词进行sorting,build议不要仅仅计算每个单词的tf,而应根据tf-idf值在整个input集合和排名上使用tf-idf关键字的真正意义。

看一下示例python解决scheme,计算json tweets列表的tf-idf值并find相似的tweets。

Github示例

弹性search提供了一个非常具体的数据聚合,使您可以为您的索引的一个子集提取“重要关键字”[1]

为了阐述什么是重要的,你需要一个前景(你想要分析的文档的子集)和一个背景(整个语料库)。

正如你可能意识到的,为了确定一个重要的术语,你需要比较一下你的语料库和其他东西(比如一个通用的语料库)是如何出现的。 你可能会发现一些档案,包括一个一般的IDF分数的条款(路透社语料库,棕色语料库,维基百科等)。 然后你可以:前台文件集 – >你的语料库后台文件集 – >通用语料库

[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html