Сгруппировать похожие строки из массива в nodejs - PullRequest
0 голосов
/ 19 сентября 2019

Я работаю над системой часто задаваемых вопросов, где у меня есть большое количество вопросов-ответов.Я хочу сгруппировать вопросы, которые похожи.Я использовал npm set-clustering.

Пакет обеспечивает хорошее совпадение на основе сопоставления токенов.Проблема в том, что мне нужно указать количество создаваемых групп.

То, что я хочу, чтобы группировка была автоматической, алгоритм должен сам определять количество создаваемых групп (неконтролируемое обучение)!

Скажите, может ли мне помочь какой-либо другой пакет или платформа?

Вопросы будут такими:

Расскажите мне о цене вашего продукта?

Могу ли я поговорить с вашим агентом?

Привет

Привет, друг

Привет, доброе утро

Сколько это будет стоить мне?

Текущий результат: (Когда я даю '3' в качестве количества групп)

(Привет, привет, друг)

(Расскажите мне о цене вашегоproduct ?, Какова стоимость продукта?)

(Могу я поговорить с вашим агентом ?, Привет, доброе утро)

Я хочу сгруппировать его следующим образом: (Без указания «3» в качестве входных данных)

(Привет, привет, привет, доброе утро)

(Расскажите мне о цене вашего продукта? Какова стоимость продукт ?)

(Могу ли я поговорить с вашим агентом?)

Существующий код:

                    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

1 Ответ

1 голос
/ 20 сентября 2019
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

Дает хороший результат с моим набором данных.

...