В документации есть пример использования пользовательского словаря:
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 ['екатеринбурга']
Если убрать в словаре запись 'город_на_нева', то "город ебург" нормально обрабатывается.
Видимо конфликт возникает с частью составного слова в словаре.
В документации есть пример использования пользовательского словаря:
Попробовал заменить текст:
Убрал слово город:
Если убрать в словаре запись 'город_на_нева', то "город ебург" нормально обрабатывается.
Видимо конфликт возникает с частью составного слова в словаре.