ts-content-based-recommender
Version:
A TypeScript-based content-based recommender with multilingual support (Japanese & English). Forked from content-based-recommender.
90 lines • 3.19 kB
JavaScript
import kuromoji from 'kuromoji';
import striptags from 'striptags';
/**
* 日本語テキスト用のトークナイザークラス
* kuromojiを使用した形態素解析でトークン化を行います
*/
export class JapaneseTokenizer {
/**
* 日本語テキストをトークン化する
* @param text 対象テキスト
* @returns トークン配列のPromise
*/
async tokenize(text) {
if (!this.kuromojiTokenizer) {
await this._initializeKuromojiTokenizer();
}
if (!this.kuromojiTokenizer) {
throw new Error('Failed to initialize kuromoji tokenizer');
}
// HTMLタグの除去
const cleanText = striptags(text, [], ' ').trim();
// 空文字列の場合は空配列を返す
if (!cleanText) {
return [];
}
// 形態素解析を実行
const tokens = this.kuromojiTokenizer.tokenize(cleanText);
// トークン情報を文字列として返す
return tokens.map(token => {
// 基本形が'*'の場合は表層形を使用
const baseForm = token.basic_form;
return (baseForm && baseForm !== '*') ? baseForm : token.surface_form;
});
}
/**
* kuromoji形態素解析器を初期化する
* @returns Promise<void>
*/
async _initializeKuromojiTokenizer() {
if (this.kuromojiTokenizer) {
return; // 既に初期化済みの場合は何もしない
}
return new Promise((resolve, reject) => {
kuromoji.builder({ dicPath: 'node_modules/kuromoji/dict' }).build((err, tokenizer) => {
if (err) {
reject(err);
}
else {
this.kuromojiTokenizer = tokenizer;
resolve();
}
});
});
}
/**
* 形態素解析結果の詳細情報を取得する
* @param text 対象テキスト
* @returns 形態素解析結果のPromise
*/
async getDetailedTokens(text) {
if (!this.kuromojiTokenizer) {
await this._initializeKuromojiTokenizer();
}
if (!this.kuromojiTokenizer) {
throw new Error('Failed to initialize kuromoji tokenizer');
}
// HTMLタグの除去
const cleanText = striptags(text, [], ' ').trim();
// 空文字列の場合は空配列を返す
if (!cleanText) {
return [];
}
// 形態素解析を実行
return this.kuromojiTokenizer.tokenize(cleanText);
}
/**
* 詳細な形態素解析結果を取得する(DetailedJapaneseToken形式)
* @param text 解析対象のテキスト
* @returns DetailedJapaneseToken形式の解析結果のPromise
*/
async getDetailedJapaneseTokens(text) {
const kuromojiTokens = await this.getDetailedTokens(text);
return kuromojiTokens.map((token) => ({
pos: token.pos,
surface_form: token.surface_form,
basic_form: token.basic_form,
}));
}
}
//# sourceMappingURL=JapaneseTokenizer.js.map