def analyze(self, word): """ Возвращает (lemma, paradigm_id, rule) со всеми вариантами разбора слова. lemma - с какой леммой слово разобрали; paradigm_id - номер парадигмы; rule - подходящее правило в парадигме. Подклассы, использующие специализированные структуры для хранения словарей, могут реализовать этот метод эффективнее. """ rules = self.rules lemmas = self.lemmas # Основная проверка по словарю: разбиваем слово на 2 части, # считаем одну из них леммой, другую окончанием, пробуем найти # лемму в словаре; если нашли, то пробуем найти вариант разбора # с подходящим окончанием. for lemma, suffix in get_split_variants(word): if lemma in lemmas: for paradigm_id in lemmas[lemma]: paradigm = rules[paradigm_id] if suffix in paradigm: for rule in paradigm[suffix]: yield lemma, paradigm_id, (suffix, rule[0], rule[1]) # Вариант с пустой леммой (например, ЧЕЛОВЕК - ЛЮДИ). # У таких слов в словарях основа записана как "#". for paradigm_id in lemmas['#']: paradigm = rules[paradigm_id] if word in paradigm: for rule in paradigm[word]: yield '', paradigm_id, (word, rule[0], rule[1])
def _static_prefix_graminfo(self, word, require_prefix=''): """ Определить грамматическую форму слова, пробуя отбросить фиксированные префиксы. """ gram = [] if not self.check_prefixes: return gram variants = get_split_variants(word) for (prefix, suffix) in variants: # один из фиксированных префиксов? if prefix in self.data.prefixes: # да, получаем рекурсивно грам. информацию про оставшуюся часть # слова (с отключенным предсказателем) base_forms = self._get_graminfo(suffix, require_prefix = require_prefix, predict = False, predict_EE = False) # приписываем префикс обратно к полученным нормальным формам for form in base_forms: form['prefixes'] = [prefix] + form.get('prefixes', []) form['method'] = 'prefix(%s).%s' % (prefix, form['method']) gram.extend(base_forms) # одна из возможных приставок к лемме? (ПО- и НАИ-) if prefix in self.data.possible_rule_prefixes: # добавляем информацию, отбрасывая приставку, т.к. она # добавляется и удаляется в зависимости от грамм. формы. # например, НАИСТАРЕЙШИЙ -> СТАРЫЙ gram.extend(self._get_graminfo(suffix, require_prefix = prefix, predict = False, predict_EE = False)) return gram