Пример #1
0
    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])
Пример #2
0
    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