Elasticsearch 学习笔记Day 14

117 阅读9分钟

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 Analysis

image.png

IK Analysis

image.png

Pinyin Analysis

image.png 本节知识点回顾

  • 多语言搜索的挑战
    • 分词 /语言检测 /相关性算分
  • 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" }

相关阅读

一些分词工具,供参考

Space Jam,一次全文搜索的实例

目的

  • 目标:用过一个具体案例,帮助你了解并巩固所学的知识点
    • 写入数据 /设置 Mapping,设置 Analysis
    • 查询并高亮显示结果
    • 分析查询结果,通过修改配置和查询,优化搜索的相关性
  • 分析问题,结合原理,分析思考并加以实践

TMDB 数据库

image.png

  • 创建于 2008 年,电影的 Meta Data 库
    • 46 万本电影/12万本电视剧 /230万张图片/每周 20万次编辑
  • 提供 API。总共有超过20万开发人员和公司在使用

数据导入image.png

  • 数据特征一标题信息较短/概述相对较长
  • 通过 TDMB Search AP
  • 将查询数据保存在本地 CSV 文件中
  • 使用 Python 导入及查询数据
  • 索引的主分片数设置为1,使用默认 Dynamic Mapping

Use Case — 查找 Space Jam

image.png

  • 空中大灌篮(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"] }

    }
}

}

相关阅读


此文章为3月Day6学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》