Рубрики
Без рубрики

Создание японского словаря поиска инструмента с Sudachi в Python

Фон Я объединял инструмент поиска словаря в моем недавнем проекте, чтобы помочь Oth … Теги с Python, учебником.

Я объединял инструмент поиска словаря в Мой недавний проект чтобы помочь другим изучать слова из игр. Ниже приведены мои цели.

Цели

Эти цели определяют пользовательский ввод и желаемый выход.

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”