↓ 跳过正文

Search

倒排索引求交算法相关资料调研

·667 字·2 分钟
1. IR-book 经典教材中的思路 # Faster postings list intersection via skip pointers 通过跳指针,实现更快的 posting list 求交 https://nlp.stanford.edu/IR-book/html/htmledition/faster-postings-list-intersection-via-skip-pointers-1.html

基于 ElasticSearch 开发垂直搜索系统

·3979 字·8 分钟
一,背景介绍 # ElasticSearch 是由 Lucene 包装上分布式复制一致性算法等附加功能,构成的开源搜索引擎系统。 近两年在业界热度大增,主要有 3 种应用场景: 全文搜索引擎 NOSQL 数据库 日志分析数据库 ELK 很多垂直领域搜索需求,都可以基于 ElasticSearch 来设计架构。 ElasticSearch 能大幅度提升相关业务的迭代开发速度,实现类似 sql 数据库增删改查一样的快速开发。 并在相对高 qps 的在线业务中,保证毫秒级的延迟,提供极高的可用性和稳定性。 经过持续的研读官方文档,调研业界经验,并在实践中应用反思后,总结出一套架构方案。供参考,欢迎意见建议。

Python 自动翻译成 C++ ,彻底保证离线在线特征一致

·2418 字·5 分钟
一,问题背景 # 随着深度学习的广泛应用,在搜索引擎/推荐系统/机器视觉等业务系统中,越来越多的深度学习模型部署到线上服务。 机器学习模型在离线训练时,一般要将输入的数据做特征工程预处理,再输入模型在 TensorFlow PyTorch 等框架上做训练。 1.常见的特征工程逻辑 # 常见的特征工程逻辑有: 分箱/分桶 离散化 log/exp 对数/幂等 math numpy 常见数学运算 特征缩放/归一化/截断 交叉特征生成 分词匹配程度计算 字符串分隔匹配判断tong 缺省值填充等 数据平滑 onehot 编码,hash 编码等 这些特征工程代码,当然一般使用深度学习最主要的语言 python 实现。 二,业务痛点 # 离线训练完成,模型上线部署后,同样要用 C++ 重新实现 这些 python 的特征工程逻辑代码。 我们发现,“用 C++ 重新实现” 这个步骤,给实际业务带来了大量的问题: 繁琐,费时费力,极容易出现 python 和 C++ 代码不一致 不一致会直接影响模型在线上的效果,导致大盘业务指标不如预期,产生各种 bad case 不一致难以发现,无法测试,无法监控,经常要靠用户投诉反馈,甚至大盘数据异常才能发现

用 DAT 重实现 CppJieba 中文分词算法,降低 99% 内存消耗

·995 字·2 分钟
一,问题背景 # 中文分词应用比较广泛的开源算法,是 jieba 结巴分词,结巴分词较高性能的实现是 C++ 版本的 CppJieba : https://github.com/yanyiwu/cppjieba 在实际使用 CppJieba 的过程中,我们发现 CppJieba 的内存占用比较高。 比如对一个 76W 词 大小 11MB 的词典 ,加载 2份 (比如为了支持平滑改动用户词典)就需要耗费 505MB内存。 这对一些多进程的后台服务,浪费大量内存,难以接受,因此这里希望削减内存耗费。 经过初步调查,确定改进方法,然后动手改造,最终把 505MB 缩减到了 4.7MB ,实现了 99% 内存降低。 此处也有 issue 讨论 https://github.com/yanyiwu/cppjieba/issues/3 代码在 https://github.com/byronhe/cppjieba 。

GB 规模语料上的高性能新词发现算法

·398 字·1 分钟
分词是中文搜索的重要环节,目前分词算法已经比较成熟,分词错误的主要是由于未登录词。 因此发现业务领域语料库中的新词,减少未登录词,对改善搜索引擎的用户体验有重要意义。 新词发现的一种常用算法,是 matrix67 大神 2012 年提出的 《互联网时代的社会语言学:基于SNS的文本数据挖掘》 https://www.matrix67.com/blog/archives/5044 其主要思路,是统计语料中出现的所有 ngram 子字符串的凝固度,自由度,信息熵。 算法中需要统计所有 ngram 子字符串的 左熵右熵,实现该算法时,一般以子字符串为 key,用哈希表来存。 但随着语料库变大时,内存消耗变大, 比如之前的 python 版本实现,对 200MB 的语料,就需要约 30G 内存来存哈希表, 导致单机内存不足无法运行,而且对这样规模的语料库,算法需要跑一两天才能出结果。 这里我应用一些工程实现方面的技巧, 把用哈希表统计左熵右熵的计算,拆分成多个子哈希表,分批计算,并利用多核并行,大幅度优化了算法的性能。