closewords
Version:
A library for finding the most similar word from a list of words, supporting Japanese (including kanji). / 最も似た単語を単語群から検索する日本語(漢字含む)対応のライブラリ
57 lines (56 loc) • 1.93 kB
JavaScript
const require_isAlphabetOnly = require("./isAlphabetOnly-C3VUVQyc.cjs");
let worker_threads = require("worker_threads");
let kuromoji = require("kuromoji");
kuromoji = require_isAlphabetOnly.__toESM(kuromoji);
let wanakana = require("wanakana");
//#region src/toHepburn.ts
function toHepburn(str) {
return (0, wanakana.toRomaji)((0, wanakana.toHiragana)(str));
}
//#endregion
//#region src/worker.ts
let tokenizer = null;
function initializeTokenizer(dicPath) {
if (tokenizer) return Promise.resolve(tokenizer);
return new Promise((resolve, reject) => {
kuromoji.default.builder({ dicPath }).build((err, builtTokenizer) => {
if (err) return reject(/* @__PURE__ */ new Error("Failed to initialize tokenizer: " + err));
tokenizer = builtTokenizer;
resolve(builtTokenizer);
});
});
}
function toRomajiWord(tok, word) {
const isWordObject = typeof word === "object";
if (isWordObject && word.pronounce) return toHepburn(word.pronounce);
const targetWord = isWordObject ? word.word : word;
if (require_isAlphabetOnly.isAlphabetOnly(targetWord)) return targetWord.toLowerCase();
return (0, wanakana.toRomaji)(tok.tokenize(targetWord).map((token) => token.reading ?? token.surface_form).join(""));
}
if (worker_threads.workerData) {
const { words, dicPath } = worker_threads.workerData;
(async () => {
try {
const tok = await initializeTokenizer(dicPath);
worker_threads.parentPort.postMessage(words.map((w) => toRomajiWord(tok, w)));
} catch (err) {
worker_threads.parentPort.postMessage({ error: String(err) });
}
})();
}
worker_threads.parentPort.on("message", async (msg) => {
try {
const tok = await initializeTokenizer(msg.dicPath);
const results = msg.words.map((w) => toRomajiWord(tok, w));
worker_threads.parentPort.postMessage({
id: msg.id,
results
});
} catch (err) {
worker_threads.parentPort.postMessage({
id: msg.id,
error: String(err)
});
}
});
//#endregion