语义泛化系统-聚类方案

为了加速搜索,本文提出一种聚类策略,通过比较词向量的余弦相似度将数据分组。在关键词查询时,先筛选出与查询词向量相似度高的簇,再进行精确匹配。使用nodejs进行预处理以提高执行速度,同时考虑了错误处理和数据缓存。尽管存在性能问题,但计划采用annoy二叉树进一步优化。
摘要由CSDN通过智能技术生成

为了加快搜索速度,我们打算通过将源数据进行聚类以减少后续搜索的计算次数。

方案简介

  • 设定初始值 d 作为高位空间角度阈值

    聚类流程

  • 对于所有词和对应词向量,执行以下

  • 与现有所有簇的中心向量对比,若存在余弦值>cos(d)内,则将其放入该簇

  • 否则,以该词和词向量建立新簇,簇的中心向量为该词向量值

    关键词查询流程

  • 将查询的词向量与所有簇的中心向量对比,筛选出余弦值>cos(2d)的簇

  • 将筛选出的簇中的所有元素再与查询词向量做对比,返回所有余弦值>c(c为所需精度,c>cos(d))的词或最接近的前k个词

代码实现

考虑到聚类流程是单纯的预处理,不参与后续组间工作对接,故选用nodejs以加快代码执行速度。

本次代码实现考虑了sql执行错误日志,程序多次衔接运行,本地关键数据缓存,流式读取文件以减少内存压力等。

主文件index.js

const fs = require('fs');
const {
    con, do: query } = require('./db');
const {
    load, save } = require('./tool/cache');
const vectorLength = 200;
//基本误差角度
const loss = 1 / 180 * Math.PI;
//聚类流程余弦阈值
const threshold = Math.cos(loss);
//搜索流程余弦阈值
const thresholdQuery = Math.cos(loss * 2);
// 保存执行错误的sql语句,用于重试
const resqlPath = './resql.txt';
/**
 * 本地缓存已有聚类和文件读取的位置
 * @type {
   {
 *  clusters:{
 *  center:string,
 *  id:number,
 *  abs:number
 * }[],
 *  nextLine:number,
 *  nextId:number
 * }}
 */
let cache = load(undefined, {
   
    clusters: [],
    nextLine: 1,
    nextId: 1
});
//程序本次执行处理的关键词个数
const taskBatch = 100000;
let batchIndex = taskBatch;
//在人工中断程序时保存缓存到本地
process.on('SIGINT', e => {
   
    save(cache);
    process.exit(0);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值