README__分词相关.md 5.4 KB

工厂搜索 依赖于关键词召回、没有做语义召回和精排,加上语义召回和精排则成本过高,所以对分词效果仍然很依赖。badcase: q=锦鸿 无法召回 锦鸿达

  1. 虽然商品搜索已经不强依赖于分词效果,但是工厂搜索仍然对分词效果有很大依赖,所以进行了优化。
  2. 优化内容: 1) index_ik + 自定义词典(需要配置自定义词典。 不配置自定义词典的时候,index_ik分词结果和query_ik完全一致,配置自定义词典时,index_ik 将 ) 2) ansj自定义词典 补充属性词
Query IK_Smart 分词结果 IK_Max_Word 分词结果
锦鸿达 锦, 鸿达 锦, 鸿达
锦鸿 锦, 鸿 锦, 鸿
14寸 4代 14寸, 4代 14, 寸, 4, 代
q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 14寸, 第, 4代, 眼珠, 实, 身, 冰雪, 公, 仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝 14, 寸, 第, 4, 代, 眼珠, 实, 身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝
金毛犬-狗狗系列积木套 金毛犬, 狗狗, 系列, 积木, 套 金毛犬, 狗狗, 系列, 积木, 套
Query query_ik 分词结果 index_ik 分词结果
锦鸿达 锦, 鸿达 锦, 鸿达, 鸿, 达
锦鸿 锦鸿 锦鸿, 锦, 鸿
q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 14寸, 第, 4代, 眼珠, 实, 身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝 14寸, 寸, 第, 4代, 代, 眼珠, 眼, 珠, 实, 身, 冰雪, 冰, 雪, 公仔, 公, 仔, 带, 手动, 手, 动, 大, 推车, 推, 车, 搪, 胶, 雪, 宝宝, 宝
金毛犬-狗狗系列积木套 金毛犬, 狗狗, 系列, 积木, 套 金毛犬, 金毛, 金, 毛, 犬, 狗狗, 狗, 系列, 系, 列, 积木, 积, 木, 套

ansj 插件自定义词典补充属性词后: | Query | query_ik 分词结果 | index_ik 分词结果 | |---------|------------------------------------------|--------------------------------------------------| | 锦鸿达 | 锦, 鸿达 | 锦, 鸿达, 鸿, 达 | | 锦鸿 | 锦鸿 | 锦鸿, 锦, 鸿 | | q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 | 14寸, 第, 4代, 眼珠, 实身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪胶, 雪, 宝宝 | 14寸, 寸, 第, 4代, 代, 眼珠, 眼, 珠, 实身, 实, 身, 冰雪, 冰, 雪, 公仔, 公, 仔, 带, 手动, 手, 动, 大, 推车, 推, 车, 搪胶, 搪, 胶, 雪, 宝宝, 宝 | | 金毛犬-狗狗系列积木套 | 金毛犬, 狗狗, 系列, 积木, 套 | 金毛犬, 金毛, 金, 毛, 犬, 狗狗, 狗, 系列, 系, 列, 积木, 积, 木, 套 |

ik分词器的问题:

POST spu/_analyze
{
  "analyzer": "ik_smart",
  "text": "14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝"
}

POST spu/_analyze
{
  "analyzer": "ik_max_word",
  "text": "14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝"
}

# ik分词器的问题:
# ik_max_word 结果是:  14  寸  第  4  代
# 期望是能分出多种形式:  14  寸 14寸  第  4  代 4代
# ik_smart
# 结果是: 14寸  第  4代
# 因此 14寸 4代 都无法召回原始文档。

ansj分词器的问题:

1. index_ik不符合预期

index模式(type=index_ik)不符合预期 :type=index_ik type=query_ik 结果永远都是一样的。 https://github.com/NLPchina/elasticsearch-analysis-ansj/issues/235

已解决:需要配置自定义词典

2. 特殊符号分词粘连问题

特殊符号(减号)会跟后面的词粘连到一起,导致搜索减号后面的词,无法匹配:

GET /_cat/ansj?text=狗狗系列-柴犬积木&type=index_ik
{
"name": "-柴",
"nature": "nrf",
"offe": 4,
"realName": "-柴",
"synonyms": null
},

GET /_cat/ansj?text=狗狗系列-哈士奇犬&type=index_ik
{
"name": "-哈士奇",
"nature": "nrf",
"offe": 4,
"realName": "-哈士奇",
"synonyms": null
},

这样的话,如果搜索“柴犬”、“哈士奇”,就不能命中上面的句子。

暂时解决办法是:

        "analyzer": {
          "index_ik": {
            "type": "custom",
            "char_filter": ["hyphen_to_space"],
            "tokenizer": "index_ik"
          },
          "query_ik": {
            "type": "custom",
            "char_filter": ["hyphen_to_space"],
            "tokenizer": "query_ik"
          }
        }