closewords
Version:
A library for finding the most similar word from a list of words, supporting Japanese (including kanji). / 最も似た単語を単語群から検索する日本語(漢字含む)対応のライブラリ
57 lines (56 loc) • 1.73 kB
JavaScript
import { t as isAlphabetOnly } from "./isAlphabetOnly-BQFCZl-E.mjs";
import { parentPort, workerData } from "worker_threads";
import kuromoji from "kuromoji";
import { toHiragana, toRomaji } from "wanakana";
//#region src/toHepburn.ts
function toHepburn(str) {
return toRomaji(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.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 (isAlphabetOnly(targetWord)) return targetWord.toLowerCase();
return toRomaji(tok.tokenize(targetWord).map((token) => token.reading ?? token.surface_form).join(""));
}
if (workerData) {
const { words, dicPath } = workerData;
(async () => {
try {
const tok = await initializeTokenizer(dicPath);
parentPort.postMessage(words.map((w) => toRomajiWord(tok, w)));
} catch (err) {
parentPort.postMessage({ error: String(err) });
}
})();
}
parentPort.on("message", async (msg) => {
try {
const tok = await initializeTokenizer(msg.dicPath);
const results = msg.words.map((w) => toRomajiWord(tok, w));
parentPort.postMessage({
id: msg.id,
results
});
} catch (err) {
parentPort.postMessage({
id: msg.id,
error: String(err)
});
}
});
//#endregion
export {};