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

时间:2016-11-14 14:10:01

标签: javascript node.js elasticsearch word2vec

受到以下gitvideo的启发我试图为我的域创建概念性搜索,使用word2vec作为查询的同义词过滤器。

提供以下文件结构:

{
        "_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创建一个同义词过滤器。

我的问题是:如何使用ES Node JS客户端完成这项工作?

2 个答案:

答案 0 :(得分:1)

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

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

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

如果我们只使用TF来构建文档向量,我们就容易出现垃圾邮件,因为常用词(例如:代词,连词等)变得更加重要。因此,td-idf的组合给出了更好的含义并表明了该词的真正意义。或者换句话说,基于重要性对文档的单词进行排名,不建议仅计算每个单词的tf,而是在整个输入集合上使用tf-idf,并根据显示的tf-idf值排名关键词的真正意义。

看一下示例python解决方案,用于计算json推文列表的tf-idf值并找到类似的推文。

Github Sample

答案 1 :(得分:1)

弹性搜索提供了一种非常具体的数据聚合,允许您为索引的子集提取“重要关键字”[1]

要详细说明重要内容,您需要前景(您要分析的文档子集)和背景(整个语料库)。

正如您可能已经意识到的,要确定一个重要的术语,您需要比较您的语料库中出现的与其他内容相比的方式(例如通用语料库)。 您可能会发现一些存档包含一些IDF的一般IDF分数(Reuter语料库,棕色语料库,维基百科等)。 然后你可以 : 前景文档集 - >你的语料库 背景文档集 - >通用语料库

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