Исходный код rupo.util.vocabulary

# -*- coding: utf-8 -*-
# Автор: Гусев Илья
# Описание: Индексы слов для языковой модели.

from typing import Dict, List, Set

from rupo.main.markup import Word


[документация]class Vocabulary(object): """ Индексированный словарь. """ def __init__(self) -> None: self.word_to_index = {} # type: Dict[str, int] self.words = [] # type: List[Word] self.shorts_set = set() # type: Set[str]
[документация] def add_word(self, word: Word) -> bool: """ Добавление слова. :param word: слово. :return: слово новое или нет. """ short = word.get_short() if short not in self.shorts_set: self.words.append(word) self.shorts_set.add(short) self.word_to_index[short] = len(self.words)-1 return True return False
[документация] def get_word_index(self, word: Word) -> int: """ Получить индекс слова. :param word: слово (Word). :return: индекс. """ short = word.get_short() if short in self.word_to_index: return self.word_to_index[short] raise IndexError("Can't find word: " + word.text)
[документация] def get_word(self, index: int) -> Word: """ Получить слово по индексу. :param index: индекс. :return: слово. """ return self.words[index]
[документация] def shrink(self, short_words: List[str]) -> None: """ Обрезать словарь по заданным коротким формам слов. :param short_words: короткие формы слов. """ new_words = [] new_shorts_set = set() short_words = set(short_words) for word in self.words: short = word.get_short() if short in short_words: new_words.append(word) new_shorts_set.add(short) self.word_to_index[short] = len(new_words)-1 self.shorts_set = new_shorts_set self.words = new_words