1

Тема: Завантаження словників

Є програма для роботи зі словниками, маються на увазі перекладацькі словники (англо-український, наприклад).
Такий словник треба завантажувати в пам'ять для пошуку «на льоту» в ньому.
Розмір такого словника, зазвичай, не більше 100 Мб, якщо не стискати його.
По суті, це форматований текст, хоча іноді додають і картинки.
Також є звукові файли (вимова слів), але вони йдуть окремо від основного.
Як краще це реалізувати, щоб не засмічувати пам'ять і щоб пошук був достатньо швидкий
навіть на старих комп'ютерах? Який алгоритм пошуку краще обрати?
Можливо, хтось може порадити певний формат файлів,
який підійде найкраще для цього?
Мене цікавлять загальні ідеї та поради, а не власне код.

2 Востаннє редагувалося koala (07.02.2023 13:42:28)

Re: Завантаження словників

Для пошуку треба створити індекс - допоміжну структуру, яка дозволяє швидко знаходити потрібну статтю за запитом. Можна довірити це СУБД, але у звичайних СУБД є певні обмеження (утім, СУБД усе одно знадобиться). Існують системи повнотекстового пошуку, такі як lucene чи sphinx. Вам треба продумати, які саме мають бути запити, і заповнити таблицю "запит => список статей", ну тобто індекс.

Тобто логіка пошуку така:
0. Перед пошуком один раз створюєте індекс
1. Отримуєте запит
2. Нормалізуєте запит (наприклад, великими літерами, з відкинутим закінченням і трохи "розсунутими" на випадок помилок критеріями пошуку)
3. Шукаєте в індексі, які статті відповідають запиту
4. Повертаєте ці статті

Подякували: MN, Teg Miles, leofun013

3 Востаннє редагувалося Teg Miles (19.03.2023 21:14:59)

Re: Завантаження словників

Зробив ось таке завантаження словників:

def load_dictionaries(self):
        """Завантаження словників."""
        for path in self.path_to_dic.splitlines():
            if path:
                for file in os.listdir(path):
                    if file.endswith(".txt"):
                        with (open(os.path.join(path, file), 'rb')
                            as file):
                            with mmap.mmap(file.fileno(), 0,
                                access=mmap.ACCESS_READ) as mmap_obj:
                                full_dict_temp = mmap_obj.read().decode()
                                self.full_dict += full_dict_temp
                                self.index_dict = {}
        for match in re.finditer(
                r'\b^[А-ЩЬЮЯҐЄІЇ;:́`’\-\'0-9 ]+\b|\b^[A-Z-:;\'0-9 ]+\b',
                                self.full_dict, re.M):
            word = re.sub(r'[^\w\-;:\']', '', match.group())
            if (match.group() in self.index_dict.keys()):
                self.index_dict[word+'_2'] = (match.span())
            else:
                
                self.index_dict[word] = (match.span())
        for line in self.index_dict.keys():
            self.pref_tree.insert(line)

Це частина класу. Перебираються наявні в налаштуваннях шляхи до словників,
створюється один великий словник(Python-словник) із одного або кількох словників, завантажених із файлів txt,
потім з Python-словника створюється словник із індексами(слово: його положення у великому словнику).
А в кінці йде сортування слів із словника з індексами по префіксному дереву.

Питання: як оптимізувати цей процес, щоб зробити його швидшим?

Помітив, що коли завантажую багато словників програма запускається впродовж декількох секунд.
З іншого боку, Goldendict, що має більше активних словників завантажується майже миттєво,
але його завантаження якось пов'язане з кешем. Бо коли чищу його, Goldendict теж починає вантажитися
впродовж кількох секунд, наново завантажує активні словники.