hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
- 起始标记->深入搜索(13讲):「30 | 单字符串多字段查询:多语言及中文分词与检索」
- 结尾标记->深入搜索(13讲):「31 | 单字符串多字段查询:Space Jam,一次全文搜索的实例」
多语言及中文分词与检索
自然语言与查询Recall
- 当处理人类自然语言时, 有些情况,尽管搜索和原文不完全匹配,但是希望搜到一些内容
- Quick brown fox和fast brown fox / Jumping fox和Jumped foxes
- 一些可采取的优化
- 归—化词元:清除变音符号,如role的时候也会匹配role
- 抽取词根: 清除单复数和时态的差异
- 包含同义词
- 拼写错误: 拼写错误,或者同音异形词
混合多语言的挑战
- 一些具体的多语言场景
- 不同的索引使用不同的语言/同一个索引中,不同的字段使用不同的语言/一个文档的一个字段内混合不同的语言
- 混合语言存在的一些挑战
- 词干提取:以色列文档,包含了希伯来语,阿拉伯语,俄语和英文
- 不正确的文档频率-英文为主的文章中,德文算分高(稀有)
- 需要判断用户搜索时使用的语言,语言识别(Compact Language Detector)
- 例如,根据语言,查询不同的索引
分词的挑战
- 英文分词: You're 分成一个还是多个? Half- -baked
- 中文分词
- 分词标准:哈工大标准中,姓和名分开。HanLP 是在一起的。具体情况需制定不同的标准
- 歧义(组合型歧义, 交集型歧义,真歧义)
- 中华人民共和国 / 美国会通过对台售武法案 / 上海仁和服装厂
中文分词方法的演变 — 字典法
- 查字典一最容易想到的分词方法 (北京航空大学的梁南元教授提出)
- 一个句子从左到右扫描一遍。遇到有的词就标示出来。找到复合词,就找最长的
- 不认识的字串就分割成单字词
- 最小词数的分词理论-哈工大王晓龙博土把查字典的方法理论化
- 一句话应该分成数量最少的词串
- 遇到二义性的分割, 无能为力(例如:“发展中国家”/“上海大学城书店”)
- 用各种文化规则来解决二义性,都并不成功
中文分词方法的演变 — 基于统计法的机器学习算法
- 统计语言模型 -1990年前后,清华大学电子工程系郭进博士
- 解决了二义性问题,将中文分词的错误率降低了一个数量级。概率问题,动态规划 + 利用维特比算法快速找到最佳分词
- 基于统计的机器学习算法
- 这类目前常用的是算法是HMM、CRF、SVM、深度学习等算法。比如 Hanlp 分词工具是基干CRF算法以CRF为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
- 随着深度学习的兴起,也出现了基于神经网络的分词器,有人尝试使用双向LSTM+CRF实现分词器其本质上是序列标注,据报道其分词器字符准确率可高达97.5%
中文分词器现状
- 中文分词器以统计语言模型为基础,经过几十年的发展,今天基本已经可以看作是一个已经解决的问题
- 不同分词器的好坏,主要的差别在于数据的使用和工程使用的精度
- 常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
一些中文分词器
- HanLP一面向生产环境的自然语言处理工具包
- IK 分词器
HanLP Analysis
- HanLP
- ./elasticsearch-p@gin install github.com/KennFalcon/…
IK Analysis
- IK
- ./elasticsearch-plugin install aithub.com/medcl/elast…
- 特性
- 支持词典热更新
Pinyin Analysis
- Pinyin
- ./elasticsearch-plugin install github.com/medcl/elast…
本节知识点回顾
- 多语言搜索的挑战
- 分词 /语言检测 /相关性算分
- Elasticsearch 中,多语言搜索所使用的一些技巧
- 归一化词元 /单词词根抽取 /同义词 /写错误
- 中文分词的演进及一些 ES 中文分词器 & 拼音分词器介绍
CodeDemo
- 来到杨过曾经生活过的地方,小龙女动情地说:“我也想过过过儿过过的生活。”
- 你也想犯范范玮琪犯过的错吗
- 校长说衣服上除了校徽别别别的
- 这几天天天天气不好
- 我背有点驼,麻麻说“你的背得背背背背佳
#stop word
DELETE my_index PUT /my_index/_doc/1 { "title": "I'm happy for this fox" }
PUT /my_index/_doc/2 { "title": "I'm not happy about my fox problem" }
POST my_index/_search { "query": { "match": { "title": "not happy fox" } } }
#虽然通过使用 english (英语)分析器,使得匹配规则更加宽松,我们也因此提高了召回率,但却降低了精准匹配文档的能力。为了获得两方面的优势,我们可以使用multifields(多字段)对 title 字段建立两次索引: 一次使用
english(英语)分析器,另一次使用standard(标准)分析器:DELETE my_index
PUT /my_index { "mappings": { "blog": { "properties": { "title": { "type": "string", "analyzer": "english" } } } } }
PUT /my_index { "mappings": { "blog": { "properties": { "title": { "type": "string", "fields": { "english": { "type": "string", "analyzer": "english" } } } } } } }
PUT /my_index/blog/1 { "title": "I'm happy for this fox" }
PUT /my_index/blog/2 { "title": "I'm not happy about my fox problem" }
GET /_search { "query": { "multi_match": { "type": "most_fields", "query": "not happy foxes", "fields": [ "title", "title.english" ] } } }
#安装插件 ./elasticsearch-plugin install github.com/medcl/elast… #安装插件 bin/elasticsearch install github.com/KennFalcon/…
#ik_max_word #ik_smart #hanlp: hanlp默认分词 #hanlp_standard: 标准分词 #hanlp_index: 索引分词 #hanlp_nlp: NLP分词 #hanlp_n_short: N-最短路分词 #hanlp_dijkstra: 最短路分词 #hanlp_crf: CRF分词(在hanlp 1.6.6已开始废弃) #hanlp_speed: 极速词典分词
POST _analyze { "analyzer": "hanlp_standard", "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
#Pinyin PUT /artists/ { "settings" : { "analysis" : { "analyzer" : { "user_name_analyzer" : { "tokenizer" : "whitespace", "filter" : "pinyin_first_letter_and_full_pinyin_filter" } }, "filter" : { "pinyin_first_letter_and_full_pinyin_filter" : { "type" : "pinyin", "keep_first_letter" : true, "keep_full_pinyin" : false, "keep_none_chinese" : true, "keep_original" : false, "limit_first_letter_length" : 16, "lowercase" : true, "trim_whitespace" : true, "keep_none_chinese_in_first_letter" : true } } } } }
GET /artists/_analyze { "text": ["刘德华 张学友 郭富城 黎明 四大天王"], "analyzer": "user_name_analyzer" }
相关阅读
- Elasticsearch IK分词插件 github.com/medcl/elast…
- Elasticsearch hanlp 分词插件 github.com/KennFalcon/…
- 分词算法综述 zhuanlan.zhihu.com/p/50444885
一些分词工具,供参考
- 中科院计算所NLPIR ictclas.nlpir.org/nlpir/
- ansj分词器 github.com/NLPchina/an…
- 哈工大的LTP github.com/HIT-SCIR/lt…
- 清华大学THULAC github.com/thunlp/THUL…
- 斯坦福分词器 nlp.stanford.edu/software/se…
- Hanlp分词器 github.com/hankcs/HanL…
- 结巴分词 github.com/yanyiwu/cpp…
- KCWS分词器(字嵌入+Bi-LSTM+CRF) github.com/koth/kcws
- ZPar github.com/frcchang/zp…
- IKAnalyzer github.com/wks/ik-anal…
Space Jam,一次全文搜索的实例
目的
- 目标:用过一个具体案例,帮助你了解并巩固所学的知识点
- 写入数据 /设置 Mapping,设置 Analysis
- 查询并高亮显示结果
- 分析查询结果,通过修改配置和查询,优化搜索的相关性
- 分析问题,结合原理,分析思考并加以实践
TMDB 数据库
- 创建于 2008 年,电影的 Meta Data 库
- 46 万本电影/12万本电视剧 /230万张图片/每周 20万次编辑
- 提供 API。总共有超过20万开发人员和公司在使用
数据导入
- 数据特征一标题信息较短/概述相对较长
- 通过 TDMB Search AP
- 将查询数据保存在本地 CSV 文件中
- 使用 Python 导入及查询数据
- 索引的主分片数设置为1,使用默认 Dynamic Mapping
Use Case — 查找 Space Jam
- 空中大灌篮(Space JAM)
- 华纳公司动画明星/篮球巨星乔丹/外星小怪物
- 案例:用户不记得电影名,而希望通过一些关键字,搜索到电影的详细信息
- 搜索关键字:“Basketball with Cartoon Aliens
思考与分析
- “精确值”还是“全文”?
- 搜索是怎么样的?不同的字段需要配置怎么样的分词器
- 测试不同的的选项
- 分词期 / 多字段属性/ 是否要 g-grams / what are some critical synonyms /为字段设置不同的权重
- 测试不同的选项,测试不同的搜索条件
测试相关性 — 理解原理 + 多分析 + 多调整测试
- 技术分为道和术两种
- 道 — 原理和原则
- 术 — 具体的做法,具体的解法
- 关于搜索,为了有一个好的搜索结果。除了真正理解背后的原理,更需要多加实践与分析
- 单纯追求“术”,会一直很辛苦。只有掌握了本质和精髓之“道”,做事才能游刃有余
- 要做好搜索,除了理解原理,也需要坚持去分析一些不好的搜索结果。只有通过一定时间的积累才能真正有所感觉
- 总希望一个模型,一个算法,就能毕其功于一役,是不现实的
监控并且理解用户行为
- 不要过度调试相关度
- 而要监控搜索结果,监控用户点击最顶端结果的频次
- 将搜索结果提高到极高水平,唯一途径就是
- 需要具有度量用户行为的强大能力
- 可以在后台实现统计数据,比如,用户的查询和结果,有多少被点击了
- 哪些搜索,没有返回结果
本节知识回顾
在这节课当中,通过具体的案例帮助了解和巩固了一些所学的知识,通过Python脚本导入了数据。同时支持针对数据设置不同的Mapping关系,最后发现分词器对于搜索的结果起到非常重要的作用,同时也可以去优化查询,相关性的优化永远是工作的最后一步,需要花费大量时间,尝试去监控并理解用户行为,这样才可以让搜索获得非常好的体验。
CodeDemo
环境要求
- Python 2.7.15
- 可以使用pyenv管理多个python版本(可选)
进入 tmdb-search目录
Run pip install -r requirements.txt Run python ./ingest_tmdb_from_file.py
POST tmdb/_search { "_source": ["title","overview"], "query": { "match_all": {} } }
POST tmdb/_search { "_source": ["title","overview"], "query": { "multi_match": { "query": "basketball with cartoon aliens", "fields": ["title","overview"] } }, "highlight" : { "fields" : { "overview" : { "pre_tags" : ["\033[0;32;40m"], "post_tags" : ["\033[0m"] }, "title" : { "pre_tags" : ["\033[0;32;40m"], "post_tags" : ["\033[0m"] }
} }}
相关阅读
- Windows 安装 pyenv github.com/pyenv-win/p…
- Mac 安装pyenv segmentfault.com/a/119000001…
- Linux 安装 pyenv blog.csdn.net/GX_1_11_rea…
- Python.org www.python.org/
此文章为3月Day6学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》