我正在构建一种在位置倒排索引中执行邻近搜索的方法- Implementing proximity search in positional inverted index nodejs.这是一个子问题.

我有一个数组数组,其中包含页面上不同单词的位置.

{
    pageno: [
        [positions of word 1],
        [positions of word 2],
        [positions of word n]
    ]
}

例如-

{
    1 : [
        [1, 5, 6],
        [2, 41],
        [4, 7, 11]
    ],
    2 : [
        [1, 5, 6],
        [2, 41],
        [3, 7, 11]
    ]
}

我想为每pageNo个单词找出出现的次数,使单词位置之间的差异之和不超过指定值(proximity).

如果值proximity为1,则所有单词之间不应超过1个单词.因此,"Hello world NodeJS"应该与"Hello world in NodeJS"匹配,因为中间只有一个单词--in. 但是,它不会匹配‘Hello from world in NodeJS’,因为中间总共有两个单词--‘from’和‘in’.

请注意,允许使用乱七八糟的单词.

如何在JavaScript中做到这一点?-我试图做类似Finding matches between multiple JavaScript Arrays的事情,但无法进行必要的更改以使其在这里工作.

上述情况的预期输出为(邻近度:2):

{
    1 : 3,
    2 : 3
}

第1页:(1,2,4)-邻近度(2-1-1)+(4-2-1)=1,(5,2,4)-邻近度(5-4-1)+(4-2-1)=1和(6,2,4)

第二页:(1,2,3),(5,2,3),(6,2,3)

推荐答案

我用的是从another answer开始的"笛卡尔积"函数. 然后对每个结果进行排序,计算项目之间的最大差异.对照接近程度进行判断,如果合法则增加计数.

更新:根据 comments 更正距离公式.同样,这里的sort需要显式转换为数字.(为什么?在下面的 comments 中让我知道)

var input = {
  1: [
    [1, 5, 6],
    [2, 41],
    [4, 7, 11]
  ],
  2: [
    [1, 5, 6],
    [2, 41],
    [3, 7, 11]
  ]
}

function cartesianProduct(arr) {
  return arr.reduce(function(a, b) {
    return a.map(function(x) {
      return b.map(function(y) {
        return x.concat([y]);
      })
    }).reduce(function(a, b) {
      return a.concat(b)
    }, [])
  }, [
    []
  ])
}

function distance(arr) {
  arr.sort(function(a,b) {
    return +a - +b;
  });
  var total = 0;
  for (var i = 1; i < arr.length; i++) {
    total += (arr[i] - arr[i - 1] - 1)
  }
  return total;
}

function count_index(arrs, proximity) {
  var product = cartesianProduct(arrs);
  var count = 0;
  product.forEach(function(series) {
    if (distance(series) <= proximity) {
      console.log("found: " + series)
      count++
    }
  })
  return count
}

var result = {}
var proximity = 2;
Object.entries(input).forEach(function([key, value]) {
  result[key] = count_index(value, proximity)
})
console.log(result)

Javascript相关问答推荐

Snowflake - .toISOString()错误地舍入JS存储过程中的时间戳

我无法使用tailwind-css和reactJS修改图像的位置

如何在dataTables PDF输出中正确渲染字形?

如何循环访问对象数组并以关键值形式获得结果?

用户单击仅在JavaScript中传递一次以及其他行为

JS、C++和C#给出不同的Base 64 Guid编码结果

*ngFor和@代表输入decorator 和选角闭合

react—router v6:路由没有路径

有没有可能使滑动img动画以更快的速度连续?

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

如何将Cookie从服务器发送到用户浏览器

使用Promise.All并发解决时,每个promise 的线性时间增加?

使用原型判断对象是否为类的实例

使用auth.js保护API路由的Next.JS,FETCH()不起作用

让chart.js饼图中的一个切片变厚?

一个实体一刀VS每个实体多刀S

当代码另有说明时,随机放置的圆圈有时会从画布上消失

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

用于测试其方法和构造函数的导出/导入类