UNPKG

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
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