N-граммы с номером частоты с использованием elasticsearch

Я использовал токенизатор n-грамм для создания n-грамм в elasticsearch, но я не могу получить частоту каждого грамма ни биграммы, ни триграммы. Как мне это сделать?


person Ahmed Alashrafy    schedule 15.09.2015    source источник


Ответы (2)


Из вашего вопроса не было ясно, что именно вы пытались сделать. Как правило, хорошей идеей будет опубликовать код, который вы пробовали, и как можно более точное описание вашей проблемы.

Во всяком случае, я думаю, что этот код будет близок к тому, что вы хотите:

http://sense.qbox.io/gist/f357f15360719299ac556e8082afe26e4e0647d1

Я начал с кода в этого ответа, а затем усовершенствовал некоторые с помощью информация в документах для фильтров токенов shangle. Вот какое отображение у меня получилось:

PUT /test_index
{
   "settings": {
      "analysis": {
         "analyzer": {
            "evolutionAnalyzer": {
               "tokenizer": "standard",
               "filter": [
                  "standard",
                  "lowercase",
                  "custom_shingle"
               ]
            }
         },
         "filter": {
            "custom_shingle": {
               "type": "shingle",
               "min_shingle_size": "2",
               "max_shingle_size": "3",
               "filler_token": "",
               "output_unigrams": true
            }
         }
      }
   },
   "mappings": {
      "doc": {
         "properties": {
            "content": {
               "type": "string",
               "index_analyzer": "evolutionAnalyzer",
               "search_analyzer": "standard",
               "term_vector": "yes"
            }
         }
      }
   }
}

Опять же, будьте осторожны, используя векторы терминов в рабочей среде.

person Sloan Ahrens    schedule 15.09.2015

Вы можете использовать векторы терминов.

Вот код, в котором я использовал векторы терминов в другом ответе SO:

http://sense.qbox.io/gist/3092992993e0328f7c4ee80e768dd508a0bc053f

В качестве быстрого примера, если я настрою индекс, предназначенный для автозаполнения, следующим образом:

PUT /test_index
{
   "settings": {
      "analysis": {
         "analyzer": {
            "autocomplete": {
               "type": "custom",
               "tokenizer": "standard",
               "filter": [
                  "standard",
                  "stop",
                  "kstem",
                  "edgengram_filter"
               ]
            }
         },
         "filter": {
            "edgengram_filter": {
               "type": "edgeNGram",
               "min_gram": 2,
               "max_gram": 15
            }
         }
      }
   },
   "mappings": {
      "doc": {
         "properties": {
            "content": {
               "type": "string",
               "index_analyzer": "autocomplete",
               "search_analyzer": "standard",
               "term_vector": "yes"
            }
         }
      }
   }
}

Затем добавьте пару простых документов:

POST test_index/doc/_bulk
{"index":{"_id":1}}
{"content":"hello world"}
{"index":{"_id":2}}
{"content":"goodbye world"}

Я могу посмотреть на частоту термина для одного документа следующим образом:

GET /test_index/doc/1/_termvector

который возвращает:

{
   "_index": "test_index",
   "_type": "doc",
   "_id": "1",
   "_version": 1,
   "found": true,
   "took": 1,
   "term_vectors": {
      "content": {
         "field_statistics": {
            "sum_doc_freq": 8,
            "doc_count": 1,
            "sum_ttf": 8
         },
         "terms": {
            "he": {
               "term_freq": 1
            },
            "hel": {
               "term_freq": 1
            },
            "hell": {
               "term_freq": 1
            },
            "hello": {
               "term_freq": 1
            },
            "wo": {
               "term_freq": 1
            },
            "wor": {
               "term_freq": 1
            },
            "worl": {
               "term_freq": 1
            },
            "world": {
               "term_freq": 1
            }
         }
      }
   }
}

Будьте осторожны с использованием векторов терминов в рабочей среде, так как они добавляют некоторые накладные расходы. Зато очень полезно для тестирования.

РЕДАКТИРОВАНИЕ: если вы ищете частотность терминов по всему индексу, просто используйте объединение терминов.

person Sloan Ahrens    schedule 15.09.2015
comment
спасибо, Слоан, но мне нужны n-граммы для слов, а не символов. вот так: привет мир Sloan я получаю 1. привет частота: 1 2. мировая частота: 1 3. мировая частота: 1 4. привет мир частота: 1 5. мир привет частота: 1 6. привет мир частота Слоана: 1 - person Ahmed Alashrafy; 15.09.2015