javascript - 在nodejs中对数组中的相似字符串进行分组

标签 javascript npm cluster-analysis

我正在开发一个常见问题解答系统,其中有大量问题的答案。我想将相似的问题分组。我一直在使用 npm set-clustering。

该包在 token 匹配的基础上提供了良好的匹配。 问题是我需要提供要创建的组的数量。

我希望分组应该是自动的,算法应该自行决定要创建的组的数量(无监督学习)!

告诉我是否有任何其他软件包或平台可以帮助我。

问题如下:

告诉我你们产品的定价?

我可以和你的经纪人谈谈吗?

你好 friend

嗨,早上好

我要花多少钱?

当前结果:(当我给出“3”作为组数时)

(嗨,嗨 friend )

(告诉我你们产品的定价?,产品成本是多少?)

(我可以和你的经纪人谈谈吗?,,嗨,早上好)

我想将其分组为:(不提供“3”作为输入)

(嗨,嗨 friend ,嗨早安)

(告诉我你们产品的定价?,产品成本是多少?)

(我可以和你的经纪人谈谈吗?)

现有代码:

                    var cluster = require('set-clustering');

                    for (let row of resp) {
                        articles.push({
                            title: row.que,
                            tags: row.tags
                        });
                    }

                    function similarity(x, y) {
                        var score = 0;
                        x.tags.forEach(function(tx) {
                            y.tags.forEach(function(ty) {
                            if (tx == ty)
                                score += 1;
                            });
                        });
                        return score;
                    }

                    // I do not want to provide number of groups over here, I want grouping to be done autonomous 
                    var groups = c.evenGroups(3);

                    var titles = groups.map(function(group) {
                        return group.map(function(article) {
                            return article.title;
                        });
                    });

                    console.log(titles);

引用https://www.npmjs.com/package/set-clustering

最佳答案

let ss = require('sentence-similarity')
var thesaurus = require("thesaurus");

let similarity = ss.sentenceSimilarity;
let similarityScore = ss.similarityScore;
let min = (a,b) => {
    if (a< b) return a;
    else return b;
}

let similar = (sentence1, sentence2) => {
    let s1 = sentence1.split(' ');
    let s2 = sentence2.split(' ');
    let numbers = [];
    for (let e of s1) {
    let syn= thesaurus.find(e);
    for (let i=0; i<syn, i<5; i++) {
        e=syn[i];
        numbers.push(similarity(s1, s2, winkOpts)['score']/min(s1.length,s2.length));
    } 
    }
    return Math.max.apply(null, numbers) >= 0.375;
}

let winkOpts = { f: similarityScore.winklerMetaphone, options : {threshold: 0} }
const filter = (source, maximum = 5) => {
  let _source, matches, x, y;
  _source = source.slice();
  matches = [];
  for (x = _source.length - 1; x >= 0; x--) {
    let output = _source.splice(x, 1);
    for (y = _source.length - 1; y >= 0; y--) {
      if (similar(output[0],_source[y])) {
    output.push(_source[y]);
    _source.splice(y, 1);
    x--;
      }
    }
    matches.push(output);
  }
  // matches.splice(0, 1);
  return matches;
}
let source = ['Your', 'array', 'here'] 
let output = filter(source);

同义词库有助于查找相似的单词。 https://www.npmjs.com/package/thesaurus

句子相似度有助于匹配。 https://www.npmjs.com/package/sentence-similarity

使用我的数据集给出了良好的结果。

关于javascript - 在nodejs中对数组中的相似字符串进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58010014/

相关文章:

cluster-analysis - 寻找基于对象属性对对象进行分类的方法

javascript - 将 CSS 应用于当前页面链接不起作用

javascript - 构建应用程序后 react 路由器不工作

node.js - 在 Node.js 应用程序中启动时无法找到绑定(bind)文件

python - 距离矩阵的树状图或其他图

matlab - 给定两组向量,如何为第一组中的每个向量找到第二组中最接近的向量?

javascript - Bootstrap 一个带两个轮播指示器的轮播

javascript - 我是否需要使用 TypeScript 在 JQueryStatic 定义文件中声明所有 JQuery 原型(prototype)?

javascript - 跨域ajax请求

node.js - 收到 404 错误,因为 npm install 的请求 url 随机添加了单词 "clear"