Термины с несколькими словами и слово nGrams?

Я стремлюсь создать индекс, который для каждого документа будет разбивать его по словам ngrams (uni, bi и tri), а затем охватывать анализ векторов терминов для всех этих слов ngrams. Это возможно с Elasticsearch?

Например, для поля документа, содержащего "Красный автомобиль едет". Я бы смог получить информацию:

red - 1 instance
car - 1 instance
drives - 1 instance
red car - 1 instance
car drives - 1 instance
red car drives - 1 instance

Заранее спасибо!

1 ответ

Решение

Предполагая, что вы уже знаете об API Term Vectors, вы можете применить фильтр токенов с шипами во время индексации, чтобы добавить эти термины как независимые друг от друга в поток токенов.

настройка min_shingle_size до 1 (вместо значения по умолчанию 2) и max_shingle_size по крайней мере 3 (вместо значения по умолчанию 2)

И исходя из того факта, что вы оставили "the" из возможных терминов, вы должны использовать фильтр стоп-слов перед применением фильтра shingles.

Настройки анализатора будут примерно такими:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "evolutionAnalyzer": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "custom_stop",
            "custom_shingle"
          ]
        }
      },
      "filter": {
        "custom_stop": {
            "type": "stop",
            "stopwords": "_english_",
            "enable_position_increments":"false"
        },
        "custom_shingle": {
            "type": "shingle",
            "min_shingle_size": "1",
            "max_shingle_size": "3"
        }
      }
    }
  }
}

Вы можете проверить анализатор, используя _analyze конечная точка API.

Другие вопросы по тегам