• elasticsearch minhash 测试应用


    上一章看了代码实现,算是搞明白了各参数的意义,现在开始测试,为方便以ik分词示例(对elasticsearch支持较好,测试操作简单)

    首先建index,自定义 analysis

    ik分词用 ik_smart 添加length filter(分词后,只要词长度3个以上的词,这个后面会说明),添加min_hash(采用默认配置),注意filter顺序.

    PUT http://localhost:9200/mytest

    {
        "settings": {
            "analysis": {
                "filter": {
                    "mymin": { 
                        "type":"min_hash",
                        "bucket_count": 512
                    },
                    "mylength":{
                      "type":"length",
                      "min":3
                    }
                },
                "analyzer": {
                    "minhashtest": {
                        "tokenizer": "ik_smart",
                        "filter": [
                            "mylength","mymin"
                        ]
                    }
                }
            }
        },
        "mappings": {
            "test": {
                "properties": {
                    "desc":        { 
                        "type": "text",
                        "analyzer": "minhashtest"
                    }
                }
            }        
        }
    }

    分析测试 512个"乱码"

    其实看到这里就明白为什么先择持minhash,尚不支持simhash了.minhash原文本索引内容,查询内容,都被构造成minhash值,minhashes的打分匹配,与其他方式完全兼容.但若要支持simhash,simhash计算相对很简单,filter转成一个二进制数据即可,但是查询时,距离,便宜数,打分,这要实现另一套逻辑,工作量相对大很多,若minhash满足需要,并没有支持simhash的紧迫性.

    查看匹配详情

    POST http://localhost:9200/mytest/test/_search?explain

    {
    "query": {
                           "match":{
                                "desc":"腾讯财经 作者 李伟8月25日,海里捞被媒体卧底后厨曝出卫生状况堪忧,当天下午海底捞针此事作出反应,称问题属实、十分愧疚,已经部署全部门店的整改计划。法制晚报卧底两家北京海底捞后厨近4个月,公布了部分图片,称老鼠在后厨地上乱窜、打扫卫生的簸箕和餐具同池混洗、用顾客使用的火锅漏勺掏下水道。涉事的是海底捞劲松店和太阳宫店。下午,海底捞方面表示,卫生问题是他们最关注的,每个月也会处理类似卫生安全事件。本次事件反应了公司管理存在问题,愿意承担经济及法律责任。1994年,创始人张勇的第一家店面开张,店内只能容纳四张餐桌。而如今,海底捞已经成为最具影响力的火锅店、最大亮点是贴心服务,包括为食客免费美甲、不限量水果等,也曾被美国哈佛商学院作为个案研究。在中国60个城市以及海外多个城市共开设了196间分店。公开资料显示,张勇拥有68%四川海底捞餐饮有限公司的股份,63%海底捞控股的股份,以及36%颐海国际控股有限公司的股份。颐海控股是海底捞火锅底料供应商,去年在香港上市。今年4月26日,张勇接受彭博访问时称,今年将可能再开新店80间,预计今年营收可达100亿元人民币,暂无意上巿;颐海国际预计今年会有20%增长。"
                            }
                    }
    }

    结果(实际desc:这样的块,有512条,和bucket_count数量一致,我都删掉了没贴出来)

    {
                    "_shard": "[cdp_test][4]",
                    "_node": "71S4CkW-Qxy_8ftGX5Xc7g",
                    "_index": "cdp_test",
                    "_type": "test",
                    "_id": "AV4Y-Ws2YLxRSBHq7xfS",
                    "_score": 0.6328895,
                    "_source": {
                        "desc": "腾讯财经 作者 李伟8月25日,海里捞被媒体卧底后厨曝出卫生状况堪忧,当天下午海底捞针此事作出反应,称问题属实、十分愧疚,已经部署全部门店的整改计划。法制晚报卧底两家北京海底捞后厨近4个月,公布了部分图片,称老鼠在后厨地上乱窜、打扫卫生的簸箕和餐具同池混洗、用顾客使用的火锅漏勺掏下水道。涉事的是海底捞劲松店和太阳宫店。下午,海底捞方面表示,卫生问题是他们最关注的,每个月也会处理类似卫生安全事件。本次事件反应了公司管理存在问题,愿意承担经济及法律责任。1994年,创始人张勇的第一家店面开张,店内只能容纳四张餐桌。而如今,海底捞已经成为最具影响力的火锅店、最大亮点是贴心服务,包括为食客免费美甲、不限量水果等,也曾被美国哈佛商学院作为个案研究。在中国60个城市以及海外多个城市共开设了196间分店。公开资料显示,张勇拥有68%四川海底捞餐饮有限公司的股份,63%海底捞控股的股份,以及36%颐海国际控股有限公司的股份。颐海控股是海底捞火锅底料供应商,去年在香港上市。今年4月26日,张勇接受彭博访问时称,今年将可能再开新店80间,预计今年营收可达100亿元人民币,暂无意上巿;颐海国际预计今年会有20%增长。"
                    },
                    "_explanation": {
                        "value": 0.63288957,
                        "description": "weight(Synonym(desc:΀翗뒭朅䓰㧾筳熆 desc:΀翗뒭朅䓰㧾筳熆 desc:΀翗뒭朅䓰㧾筳熆 desc:΀翗뒭朅䓰㧾筳熆 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇) in 0) [PerFieldSimilarity], result of:",
                        "details": [
                            {
                                "value": 0.63288957,
                                "description": "score(doc=0,freq=17192.0 = termFreq=17192.0
    ), product of:",
                                "details": [
                                    {
                                        "value": 0.2876821,
                                        "description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
                                        "details": [
                                            {
                                                "value": 1,
                                                "description": "docFreq",
                                                "details": []
                                            },
                                            {
                                                "value": 1,
                                                "description": "docCount",
                                                "details": []
                                            }
                                        ]
                                    },
                                    {
                                        "value": 2.1999617,
                                        "description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:",
                                        "details": [
                                            {
                                                "value": 17192,
                                                "description": "termFreq=17192.0",
                                                "details": []
                                            },
                                            {
                                                "value": 1.2,
                                                "description": "parameter k1",
                                                "details": []
                                            },
                                            {
                                                "value": 0.75,
                                                "description": "parameter b",
                                                "details": []
                                            },
                                            {
                                                "value": 512,
                                                "description": "avgFieldLength",
                                                "details": []
                                            },
                                            {
                                                "value": 1,
                                                "description": "fieldLength",
                                                "details": []
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                }

    几种优化策略

    minhash需要大量的运算

    计算次数=词的个数*hash_count

    内存占用=bucket_count

    1 适当设置bucket_count,hash_count,bucket_count越大越准确,但这需要根据场景测试调整,如果都是短句,像微博内容 bucket_count过大也无意义,一条语句平均10个词(minhash,simhash都对短文本匹配不友好),hash_count过大,提升的效果有限,既浪费内存又浪费cpu.

    2 词的个数也可以调整若是对长文本算模糊匹配,单个字完全可以忽略,之上示例加了length filter 便是为此,只保留length>3的词作minhash,无意义的词最好也都过滤掉

    3 短词合并,保证单词顺序的前提下,几个短的词,合并成一个长的词,也减少了词的数量,英文推荐 shingle-tokenfilter 中文还未测试https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-shingle-tokenfilter.html

    4另外 像 keyword tokenfilter ,unique tokenfilter会丢掉部分信息,可以根据情景是否采用.

    5最后minhash相比simhash缺少了权重的信息,但我们可以从另一个角度来添加权重,例,对所有词统计次数,按次数排序,只对前几条作minhash.

    以上部分只是思路,对不同的场景适用性不同,具体的情况还需进一步测试验证

    部分功能官方filter即支持,这样最好,若官方不支持,则要自已写filter插件了

  • 相关阅读:
    ::作用域运算符
    c++多继承
    关于C++命名空间namespace的理解与使用介绍
    __stdcall、__cdcel和__fastcall三者的区别
    JAVA自定义异常
    JS仿淘宝星星评价
    JAVA代码实现下载单个文件,和下载打包文件
    Oracle求部门员工工资占总工资的比率
    java代码实现打包多个文件下载功能
    Jfinal验证码功能
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/7441076.html
Copyright © 2020-2023  润新知