倒排索引-字符串相似匹配(结巴分词、中文转拼音)

news2024/11/20 15:34:07

工作中,遇到有两个不同的系统,两个系统中有相同的功能,维护一个主播的名称。现在准备将两个系统的主播合并到一起。因为主播名称可能由不同的人维护的,他们也不知道主播的真实姓名,比如一条小团团,可能维护成了亿条小团团,等等。

为了解决主播重复问题,现在想了一个办法,将要导入的一方,做一个列表,将原有系统所有与其相似的主播名称展示出来。大概就像这样。

一条小团团  一条小团团
亿条小团团
一条晓团🍡

通过与大佬们的讨论、启发。现准备使用以下方案。

  • 使用正则表达式,将昵称中的emoji剔除,只提取汉字和英文数字
  • 使用中文分词法,将昵称字符串分成一个个的单词。并将词组个数为一的删去
  • 两个系统的主播昵称进行同样的操作
  • 之后遍历要导入的一方,与原有系统的拼音做对比,有重复的标记下来
  • 最后导出文件,拿给运营同事人工比对

部分示例代码:

核心转换功能

import re
import jieba
import pypinyin

def get_words(name):
    # 提取汉字和英文数字
    name = re.sub('[^\u4e00-\u9fa5a-zA-Z0-9]', '', name)
    seg_list = jieba.cut_for_search(name)  # 搜索引擎模式
    word_list = []
    for j in seg_list:
        print(j, end=',')
        # 去除长度为一的词
        if len(j) != 1:
            # 将词转换成拼音,并连接成字符串
            word_list.append(''.join(pypinyin.lazy_pinyin(j)))
    return word_list
    
get_words("一条小团团")

> 一条,小,团团,
> ['yitiao', 'tuantuan']

原有系统制作哈希字典,方便查找

bigMap = {}
jeecg_data = db.execute_sql('select * from xxx', DB)[1]

for jeecg in jeecg_data:
    words = get_words(jeecg.get('name'))
    for word in words:
        if bigMap.get(word) is None:
            bigMap[word] = {
                'name-id' = []
            }
        bigMap[word]['name-id'].append("%s#%s" % (jeecg.get('name'), jeecg.get('id')))

需导入的主播

result_list = []
jane_data = db.execute_sql("select * from xxx", DB)[1]

for jane in jane_data:
    words = get_words(jane.get('name'))
    res = {
        'id': jane.get('id'),
        'head': jane.get('head'),
        'name': jane.get('name'),
        'name-id': []
    }

    for word in words:
        if bigMap.get(word):
            res['name-id'].extend(bigMap.get(word).get('name-id'))
            # 去重(可能一个昵称存在多个单词相同)
            res['name-id'] = list(set(res['name-id']))
    result_list.append(res)

导出文件

for i in result_list:
    with open("foo.txt", "a+") as f:
        for j in i.get('name-id'):
            f.write(i.get('name'))
            f.write('\t')
            f.write(i.get('id'))
            f.write('\t')
            f.write(j)
            f.write('\t')
            f.write('\n')

用到的库:jieba, pypinyin

倒排索引

之后才知道,原来我代码中构建的bigMap其实是一个倒排索引,马上补习了关于倒排索引的知识。

顾名思义,有倒排就有正排。正排索引-forward index;倒排索引-inverted index。正排索引都知道,就是MySQL的索引,按id给数据排索引。

拓展

这个功能其实也可以用到录入时的重复联想功能里面。这里大概讲一下我能想到的思路。

我们可以用一颗 Trie 树来存储经过分词并转拼音后的主播名称。数据可以直接直接存到缓存中,便于快速读取。

前端在输入新主播名称时有两种做法:

  • 先分词后,再转拼音直接从 Trie 树上查找有没有匹配到主播。这个消耗时间主要分词的效率。
  • 也可以不分词,直接转拼音之后从 Trie 上查找,但是需要循环每个字作为开始。这就依赖匹配的效率了。这里可以将 Tire 魔改成基于字的AC自动机,在构建失配指针的时候要基于一个字,这样可以优化循环;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

香橙派3LTS部署ROS2阿克曼开源平台

1.系统镜像下载 这里我们需要安装ROS2的humble版本,需要ubuntu 22.04版本的系统。 香橙派镜像下载:http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3-LTS.html 点击Ubuntu镜像,选择jamm…

【linux】进程概念详述

进程概念一、冯诺依曼系统二、操作系统2.1 OS层次图2.2 操作系统的意义2.2.1 系统调用与库函数的区别2.3 管理的理解三、进程3.1 进程的概念3.2 描述进程-PCB3.3 进程和程序3.4 PCB内容3.4.1 查看进程3.4.2 标识符3.4.3 状态3.4.4 程序计数器3.4.5 记账信息3.4.6 上下文信息❗️…

1.极限与连续-——“机器学习中的数学”

1.通过集合相等来讲解什么是映射关系 上面问的这个问题(2N N2)说明了什么? ——两个无穷集合,如果能找到一种对应关系(映射关系),那么我们就可以说这两个集合是等价的。 数列的极限就是趋势 …

字符串转二叉树

一. 题目介绍 二. 题目分析 首先 题目让我们以先序遍历的方式用字符串建立一个二叉树 输入是一个字符串 输出是是以中序遍历二叉树打印 我们先来看最简单的输入 这里只要建立一个字符数组 然后等测试用例输入就好了 // 接受输入值char arr[100]{0};scanf("%s",…

网络原理 --- 传输层Ⅳ TCP协议中的延迟应答、捎带应答、面向字节流、TCP中的异常处理

文章目录网络原理传输层TCP协议7.延迟应答8.捎带应答9. 面向字节流10.TCP中的异常处理总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层TCP协议 7.延迟应答 提高传输效率的机制 又是基于流量控制,来引入的提高效率的机制 实…

数据在内存中的存储

目录 数据在内存中的存储:: 整型及其浮点型存储方式: 1.数据类型介绍 2.整形在内存中的存储:原码 反码 补码 3.大小端字节序介绍及判断 4.浮点型在内存中的存储 5.两道经典指针选择题 C语言编程训练(牛客网) 1.喝汽水问题 2.字符串逆序 3.打…

Python编程运算符 ——算数运算符

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.运算符 1.在Python运算符中分为 2.算数运算符 3.比较重要的运算符 4…

网络原理——No.1 传输层_TCP的确认应答机制与超时重传

JavaEE传送门JavaEE JavaEE——网络原理_应用层 网络原理——传输层_UDP 目录传输层TCPTCP 的基本特性确认应答机制超时重传传输层 端到端之间的传输, 重点关注的是起点和终点 核心的协议有两个: UDP: 无连接, 不可靠传输,面向数据报, 全双工 TCP: 有链接, 可靠传输, 面向字…

黑猫带你学UFS协议第11篇:什么是逻辑单元(LU)与逻辑块(Sector)

本文依据UFS3.1 JEDEC协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,已加入原创维权,禁止私自转载。 文章所在专栏:《黑猫带你学:UFS协议详解》 1 LU简介 我们对与UFS、emmc一类存储芯片,最重要的功能是什么?无非就是存数据和取出数据,也…

神经网络的输入稀疏矩阵,神经网络中的矩阵运算

1、BP神经网络模型各个参数的选取问题 样本变量不需要那么多,因为神经网络的信息存储能力有限,过多的样本会造成一些有用的信息被丢弃。如果样本数量过多,应增加隐层节点数或隐层数目,才能增强学习能力。 一、隐层数 一般认为&am…

牛客前端刷题(九)—— 打包篇

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&a…

greenplum 源码解析 FTS辅助进程--ReadMe

简介 在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务),其主要功能是检测所有segment节点的健康信息,如果其检测到segment节点的primary出现异常[硬件故障/宕机],会在第一时间将其对应的mirror提升为新的…

MySql(50)MySQL日志

文章目录MySQL支持的日志日志类型日志的弊端慢查询日志(slow query log)通用查询日志查看当前状态启动日志永久启动临时启动查看日志删除\刷新日志错误日志(error log)删除\刷新日志二进制日志(bin log)查看默认情况日志参数设置查看日志使用日志恢复数据删除二进制日志PURGE M…

vue3 响应式对象的 api ,你全用过了吗?

文章目录Ⅰ. ref、reactive ( 递归监听 )Ⅱ. isRef、isReactive ( 判断 )Ⅲ. toRef 和 toRefs ( 解构 )Ⅳ. toRaw 、 markRaw ( 解除代理)Ⅴ. unref ( 拷贝 )Ⅵ. shallowRef 、shallowReactive( 非递归监听 )Ⅶ. triggerRef (强制更新&#x…

红黑树原理及旋转

红黑树,本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢?这就引出了红黑…

相似度_对抗学习:SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE: Simple Contrastive Learning of Sentence Embeddings 这篇论文,我觉得有意思。在创造对抗学习的正负例时,正例直接使用它本身。将同一个句子传递给预先训练好的编码器两次:通过应用两次dropout,我们可以得到两个不同的嵌…

云计算基础:云计算越来越广泛,我们应该如何去学习云计算

随着时代的发展,云计算越来越普及,越大众化,使用的人越来越多,我们应该如何去学习这门技术呢?这篇文章我们就来介绍如何学习我们的云计算。 学前介绍: 学前介绍 学习资料:HedEX Lite、产品文档、笔记、P…

非科班程序员被裁员后反而涨薪了200%,这两个月他都经历了哪些?

今年年初开始,裁员潮一浪接着一浪翻滚而来,让互联网人胆颤心惊,时刻担心下一波裁员是否就要降临到自己身上。 小帅(化名)是一个原本月薪8k,在小外包公司做政府项目的一名普通员工,前不久就被裁员…

数据仓库建模(四):维度表的设计

数据仓库建模(四):维度表的设计一、维度表的整体结构1.1 维度表的结构设计1.2 维度代理键1.3 自然键、超久键和超自然键1.4 下钻与上卷1.5 维度退化1.6 非规范化的扁平维度1.7 多层次维度1.8 维度属性的标识与状态信息1.9 维度表中的空值属性…

趣学算法(2)

14天阅读挑战赛 目录前言一 几类时间复杂度二 兔子数列1.问题分析2.方法13.方法24.方法3最后前言 这篇文章是《趣学算法》的读书笔记,也对数据结构与算法的初步介绍,阅读这篇文章,我会带你改进一个算法。 一 几类时间复杂度 常见的算法时间复…