Elasticsearch - IK分词器;文档得分机制

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch - IK分词器;文档得分机制相关的知识,希望对你有一定的参考价值。

阅读本文前可先参考

Elasticsearch - Kibana(四)_MinggeQingchun的博客-CSDN博客

https://blog.csdn.net/MinggeQingchun/article/details/126768243

一、IK分词器

中文分词

ES 的默认分词器无法识别中文中测试、单词这样的词汇,而是简单的将每个字拆完分为一 个词

解决方案: 采用IK分词器

(一)IK分词器下载安装

官网下载地址:

Releases · medcl/elasticsearch-analysis-ik · GitHub

找到对应Elasticsearch对应版本下载即可

将解压后的后的文件夹放入 ES 根目录下的 plugins 目录下,重启 ES 即可使用

(二)IK分词器使用

IK 分词器提供了两个分词算法

ik_smart:最少切分

Ik_max_word:最细粒度划分

1、使用 ik_smart 算法对之前得中文内容进行分词

2、ik_max_word 算法分词

 (三)自定义分词器

1、首先进入 ES 根目录中的 plugins 文件夹下的 ik 文件夹,进入 config 目录,创建 custom.dic 文件,写入"一个学生"

 

2、打开 IKAnalyzer.cfg.xml 文件,将新建的 custom.dic 配置其中, 重启 ES 服务器

重启服务器,测试效果

二、文档得分机制

Lucene 和 ES 的得分机制是一个基于词频和逆文档词频的公式,简称为 TF-IDF(term frequency–inverse document frequency 公式

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索数据挖掘的常用加权技术。TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)

TF (词频)

Term Frequency : 搜索文本中的各个词条(term)在查询文本中出现了多少次,出现次数越多,就越相关,得分会比较高

IDF(逆文档频率)

Inverse Document Frequency : 搜索文本中的各个词条(term)在整个索引的所有文档中出现了多少次,出现的次数越多,说明越不重要,也就越不相关,得分就比较低

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.

词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率

这个数字是对词数(term count)的归一化,以防止它偏向长的文

(一)打分机制

1、基础数据

# 创建索引
PUT /myindex
# 增加文档数据
# 此时索引中只有这一条数据

PUT /myindex/_doc/1

 "text":"hello"

2、查询匹配条件的文档数据 

GET /myindex/_search

 "query": 
 "match": 
 "text": "hello"
 
  

 这里文档的得分为:0.2876821

3、分析文档数据打分过程

# 增加分析参数
GET /myindex/_search?explain=true 

 "query": 
    "match": 
        "text": "hello"
    
 

返回输出


  "took" : 2,
  "timed_out" : false,
  "_shards" : 
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  ,
  "hits" : 
    "total" : 
      "value" : 1,
      "relation" : "eq"
    ,
    "max_score" : 0.2876821,
    "hits" : [
      
        "_shard" : "[myindex][0]",
        "_node" : "cbR5pVsVS1q0NR3kt24wzg",
        "_index" : "myindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : 
          "text" : "hello"
        ,
        "_explanation" : 
          "value" : 0.2876821,
          "description" : "weight(text:hello in 0) [PerFieldSimilarity], result of:",
          "details" : [
            
              "value" : 0.2876821,
              "description" : "score(freq=1.0), computed as boost * idf * tf from:",
              "details" : [
                
                  "value" : 2.2,
                  "description" : "boost",
                  "details" : [ ]
                ,
                
                  "value" : 0.2876821,
                  "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details" : [
                    
                      "value" : 1,
                      "description" : "n, number of documents containing term",
                      "details" : [ ]
                    ,
                    
                      "value" : 1,
                      "description" : "N, total number of documents with field",
                      "details" : [ ]
                    
                  ]
                ,
                
                  "value" : 0.45454544,
                  "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details" : [
                    
                      "value" : 1.0,
                      "description" : "freq, occurrences of term within document",
                      "details" : [ ]
                    ,
                    
                      "value" : 1.2,
                      "description" : "k1, term saturation parameter",
                      "details" : [ ]
                    ,
                    
                      "value" : 0.75,
                      "description" : "b, length normalization parameter",
                      "details" : [ ]
                    ,
                    
                      "value" : 1.0,
                      "description" : "dl, length of field",
                      "details" : [ ]
                    ,
                    
                      "value" : 1.0,
                      "description" : "avgdl, average length of field",
                      "details" : [ ]
                    
                  ]
                
              ]
            
          ]
        
      
    ]
  

打分机制中有 2 个重要阶段:计算 TF 值和 IDF

最后的分数

4、计算TF值

 5、计算IDF值

6、计算文档得分

7、增加新的文档,测试得分

(1)增加一个毫无关系的文档

# 增加文档
PUT /myindex/_doc/2

 "text" : "spark"


# 因为新文档无词条相关信息,所以匹配的文档数据得分就应该较高:
# 0.6931741
GET /myindex/_search

 "query": 
 "match": 
 "text": "hello"
 
  

(2)增加一个完全一样的文档

# 增加文档
PUT /myindex/_doc/2

 "text" : "hello"


# 因为新文档含词条相关信息,且多个文件含有词条,所以显得不是很重要,得分会变低
# 0.18232156
GET /myindex/_search

 "query": 
 "match": 
 "text": "hello"
 
  

(3)增加一个含有词条,但是内容较多的文档

# 增加文档
PUT /myindex/_doc/2

 "text" : "hello elasticsearch" 

# 因为新文档含词条相关信息,但只是其中一部分,所以查询文档的分数会变得更低一些。
# 0.14874382
GET /myindex/_search

 "query": 
 "match": 
 "text": "hello"
 
  

8、测试

查询文档标题中含有“Hadoop”,“Elasticsearch”,“Spark”的内容;优先选择“Spark”的内容

(1)准备数据

# 准备数据
PUT /testscore/_doc/1001

 "title" : "Hadoop is a Framework",
 "content" : "Hadoop 是一个大数据基础框架" 


PUT /testscore/_doc/1002

 "title" : "Hive is a SQL Tools",
 "content" : "Hive 是一个 SQL 工具" 


PUT /testscore/_doc/1003

 "title" : "Spark is a Framework",
 "content" : "Spark 是一个分布式计算引擎" 

(2)查询数据,Spark 的结果并不会放置在最前面

以上是关于Elasticsearch - IK分词器;文档得分机制的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch连续剧之分词器

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

《自然语言处理实战入门》 文本检索 ---- 文本查询实例:ElasticSearch 配置ik 分词器及使用

elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词

ElasticSearch-ik分词器

Elasticsearch 分布式搜索引擎 -- 安装IK分词器ik分词器-拓展词库 / 停用词库