natasha / natasha

Solves basic Russian NLP tasks, API for lower level Natasha projects
MIT License
1.2k stars 110 forks source link

Использование пользовательского словаря #18

Closed Carw closed 7 years ago

Carw commented 7 years ago

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

from yargy.pipeline import CustomGrammemesPipeline

# CustomGrammemesPipeline - базовый класс с реализованными методами для поиска
# подходящих статей и замены граммем в найденных словосочетаниях

class CitiesPipeline(CustomGrammemesPipeline):

    # переопределяем назначаемые грамматические признаки
    # в дальнейшем, их можно использовать внутри грамматик парсера
    Grammemes = {
        'Geox/City'
    }

    # статьи нашего газеттира, обратите внимание на то, что
    # все статьи должны быть в начальной форме - например 'нижний_новгород',
    # но не 'нижнего_новгорода'
    Dictionary = {
        'москва',
        'санкт-петербург',
        'ебург',
        'екатеринбург',
        'екб',
        'город_на_нева',
        'нижний_новгород',
    }

from enum import Enum
from yargy.labels import gram
from natasha import Combinator

class MyGrammars(Enum):

    City = [
        {
            'labels': [
                gram('Geox/City'),
            ],
        }
    ]

combinator = Combinator([MyGrammars], pipelines=[
    CitiesPipeline(),
])

text = 'город екатеринбург - литературное название екб'

for grammar, match in combinator.extract(text):
    print(grammar, [token.value for token in match])

# Выводит:
# MyGrammars.City ['екб']

Попробовал заменить текст:

text = 'город ебург или екб - литературное название екатеринбурга'
# Выводит:
# MyGrammars.City ['екб']
# MyGrammars.City ['екатеринбурга']

Убрал слово город:

text = 'ебург или екб - литературное название екатеринбурга'
# Выводит:
# MyGrammars.City ['ебург']
# MyGrammars.City ['екб']
# MyGrammars.City ['екатеринбурга']

Если убрать в словаре запись 'город_на_нева', то "город ебург" нормально обрабатывается.

Видимо конфликт возникает с частью составного слова в словаре.

Carw commented 7 years ago

Кстати, если написать "нижний ебург", то тоже возникает проблема, но уже с 'нижний_новгород'.

dveselov commented 7 years ago

Должно быть исправлено в новой версии (0.8.0).