Как повысить рейтинг NGrams по длине - PullRequest
0 голосов
/ 03 июня 2019

Я справляюсь с Elasticsearch и имею небольшой набор данных с несколькими терминами с общими Ngrams.

Например, в настоящее время Elasticsearch оценивает

United Kingdom > Agriculture > Grains > Feed Wheat > Ex-Farm

как лучшее соответствие для "Мясо", чем

United Kingdom > Agriculture > Livestock & Meat > Lamb > Deadweight

Я считаю, что если я смогу заставить ES учесть длину совпадающего Ngram в своем счете, то эта проблема в основном решится сама собой.

Я потратил много времени на поиск любых подсказок, но ничего не сделалПодойди пока.

Я определил свой фильтр Ngram, используя python'sasticsearch-dsl

ngram_filter = token_filter(
    'ngram_filter',
    type='ngram',
    min_gram=3,
    max_gram=10,
)

ngram_analyzer = analyzer(
    'ngram_analyzer',
    type='custom',
    tokenizer='whitespace',
    filter=[
        'lowercase',
        ngram_filter
    ]
)

1 Ответ

1 голос
/ 03 июня 2019

Пройдя немного и подумав об этом, я решил разбить анализаторы NGram на разные поля, разделенные по длине. Таким образом, я мог вручную увеличить более длинные матчи NGram. Я думаю, что пытался сделать слишком много с одним полем.

Я не создаю их программно, используя django -asticsearch-dsl, вот так.

ngram_analyzers = {
    f'{i}ngram': fields.TextField(
        analyzer=analyzer(
            f'{i}ngram_analyzer',
            type='custom',
            tokenizer='whitespace',
            filter=[
                'lowercase',
                token_filter(
                    f'{i}ngram_filter',
                    type='ngram',
                    min_gram=i,
                    max_gram=i
                )
            ]
        )
    ) for i in range(3, 11)
}

ngram_analyzers.update({
            'stemmed': fields.TextField(
                analyzer='english',
            )
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...