Я объединял инструмент поиска словаря в Мой недавний проект чтобы помочь другим изучать слова из игр. Ниже приведены мои цели.
Цели
Эти цели определяют пользовательский ввод и желаемый выход.
1. Получить самый длинный возможный ввод пользовательского ввода
Вход: 自己 紹介 (じこしょ うかい) Желаемый выход: 自己 紹介, не 自己 или 自
2. Контекст – не знаю
Вход: 牛 в 牛 丼 を 食べ てる Желаемый выход: 牛 (うし), но не ぎゅう как в ぎゅうどん (牛丼)
3. Разбор конъюгированных глаголов и прилагательных
Ввод 食べ て в 牛丼 を 食べ て. る Желаемый выход: 食べる (たべる)
4. Словарь используется в парсере, независимо от словаря, используемого для въезда, глоссария.
(Подробнее.)
Наш желаемый результат предполагает определенную степень японских грамматических знаний от пользователя. Когда пользователь выбирает 折 из 折 角 Мы предполагаем, что они хотят знать, что 折 означает вместо 折角. Когда они выбирают 外国 人, они хотят посмотреть все соединение существительное вместо его отдельных символов.
Словарь – jmdict.
Мы будем использовать Jmdict , свободно доступная японская в английская библиотека. Вы можете найти японские на другие языковые библиотеки на Йомичан проект Отказ
from pathlib import Path import zipfile import json SCRIPT_DIR = Path(__file__).parent dictionary_map = {} def load_dictionary(dictionary): output_map = {} archive = zipfile.ZipFile(dictionary, 'r') result = list() for file in archive.namelist(): if file.startswith('term'): with archive.open(file) as f: data = f.read() d = json.loads(data.decode("utf-8")) result.extend(d) for entry in result: if (entry[0] in output_map): output_map[entry[0]].append(entry) else: output_map[entry[0]] = [entry] # Using headword as key for finding the dictionary entry return output_map def setup(): global dictionary_map load_dictionary(str(Path(SCRIPT_DIR, 'dictionaries', 'jmdict_english.zip')))
Чтобы загрузить наш словарь, мы распадаем файл и сохраняем его как карту со всеми его записями в качестве клавиш. Мы также проверяем записи с повторяющимися глоссариями и добавьте их в свой список глоссарий.
Парсер – Судачи
pip install sudachipy pip install sudachidict_small
Для экономии места мы будем использовать небольшой словарь Sudachi вместо его ядра (70 МБ).
from sudachipy import tokenizer from sudachipy import dictionary tokenizer_obj = dictionary.Dictionary(dict_type='small').create() mode = tokenizer.Tokenizer.SplitMode.A
В Sudachi есть три режима – A, B и C. Режим анализируемых слов в самой длинной возможной форме, где C его кратчайшие. Для нашего использования мы будем придерживаться режима A, так как мы хотим самого длинного.
Положить его вместе
def look_up(word): word = word.strip() if word not in dictionary_map: m = tokenizer_obj.tokenize(word, mode)[0] word = m.dictionary_form() if word not in dictionary_map: return None result = [{ 'headword': entry[0], 'reading': entry[1], 'tags': entry[2], 'glossary_list': entry[5], 'sequence': entry[6] } for entry in dictionary_map[word]] return result
Сначала мы удалим все ненужные белые пробелы вокруг нашего слова, тогда мы напрямую проверяем, существует ли он в нашем словаре. Таким образом, мы можем получить существительные, как 牛丼 сразу без необходимости их разбирать.
После этого мы разбираем их с режимом Sudachi A и получите dictionary_form () слова и посмотрите это в нашем собственном словаре вместо использования словаря парсера.
Конечный результат переформатирован и возвращен.
(env) $ python >>> setup() >>> print(look_up('牛丼')) [{'headword': '牛丼', 'reading': 'ぎゅうどん', 'tags': 'n', 'glossary_list': ['rice covered with beef and vegetables'], 'sequence': 1845250}] >>> print(look_up('食べて')) [{'headword': '食べる', 'reading': 'たべる', 'tags': 'v1 vt', 'glossary_list': ['to eat'], 'sequence': 1358280}, {'headword': '食べる', 'reading': 'たべ る', 'tags': 'v1 vt', 'glossary_list': ['to live on (e.g. a salary)', 'to live off', 'to subsist on'], 'sequence': 1358280}] >>> print(look_up('自己紹介')) [{'headword': '自己紹介', 'reading': 'じこしょうかい', 'tags': 'n vs', 'glossary_list': ['self-introduction'], 'sequence': 1317650}]
Дайте мне знать, если это было полезно.
Оригинал: “https://dev.to/mathewthe2/making-a-japanese-dictionary-lookup-tool-with-sudachi-in-python-4k9i”