【问题标题】:Information Retrieval - How can i process search query with single word break'ed into multiple tokens信息检索 - 我如何处理将单个单词分解为多个标记的搜索查询
【发布时间】:2020-02-28 20:50:29
【问题描述】:

我只是信息检索的初学者。

我正在寻求解决一个问题,即用户在输入单词时错误地在字符之间添加空格或将两个单词合并为一个,由于简单的倒排索引查找,目前无法处理。

假设我对以下文档进行了倒排索引:

  1. 杰克和吉尔是好朋友。
  2. 杰克去了阿拉斯加。
  3. Jill 住在纽约。

现在拥有倒排索引意味着像将 newyork 索引为单独的标记(假设仅作为示例并且没有使用 NLP 将纽约标记为位置)

token    count    location
jack      2          1,2
jill      2          1,2
new       1           3
york      1           3
alaska    1           4

现在查询 jack,我会得到位置 1,2,这很好。

但是对于查询 newyork(假设查询没有空格),我如何从位置为 3(组合)的索引中获取 newyork。 p>

对于查询 ala ska(带空格),我如何分别检索令牌 alaska(索引中没有空格)。

我遗漏的任何建议或任何特定算法。

我只是信息检索的初学者。

感谢您的帮助。

我正在考虑将每个查询标记分解为字符-语法组合,最后将它们合并以找出最常见的标记。

例如查询newyork

找到直到限制 n 的所有标记,从 n... 开始,然后 ne.... 然后 new.... 然后 newy.. 等等,类似于 ne.. ew...wy..哟..or..rk...,

在合并数组后最终会得到 newyork 某处..

与查询 ala ska 类似(用空格分隔单词)

【问题讨论】:

    标签: elasticsearch search lucene information-retrieval


    【解决方案1】:

    也许这样的东西对你有用:

    使用自定义分析器(ngram 标记器)创建索引 Read about NGram Tokenizer

    PUT /index
    {
      "mappings": {
        "doc": {
          "properties": {
            "token": {
              "type": "text",
              "analyzer": "myanalyzer"
            },
            "location":{
              "type": "text"
            }
          }
        }
      },
      "settings": {
        "analysis": {
          "analyzer": {
            "myanalyzer": {
              "tokenizer": "my_tokenizer",
              "filter": []
            }
          },
          "tokenizer": {
            "my_tokenizer": {
              "token_chars": [
                "letter",
                "digit",
                "symbol",
                "punctuation"
              ],
              "min_gram": "3",
              "type": "ngram",
              "max_gram": "4"
            }
          }
        }
      }
    }
    

    让我们发布新文档

    POST index/doc
    {
      "token": "alaska",
      "location":[4]
    }
    
    POST index/doc
    {
      "token": "york",
      "location":[3]
    }
    
    POST index/doc
    {
      "token": "new",
      "location":[3]
    }
    
    POST index/doc
    {
      "token": "jack",
      "location":[1,2]
    }
    
     POST index/doc
     {
       "token": "jill",
       "location":[1,2]
     }
    

    搜索:

    GET index/_search
    {
      "query": {
        "match": {
          "token": "ala ska"
        }
      }
    }
    

    结果:

    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1.9346048,
        "hits": [
          {
            "_index": "index",
            "_type": "doc",
            "_id": "z7hBMG4BXy8wPzqAcq-C",
            "_score": 1.9346048,
            "_source": {
              "token": "alaska",
              "location": [
                4
              ]
            }
          }
        ]
      }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2019-04-07
    • 2015-11-02
    • 2020-12-29
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多