ts-content-based-recommender
Version:
A TypeScript-based content-based recommender with multilingual support (Japanese & English). Forked from content-based-recommender.
87 lines • 4.37 kB
JavaScript
import { expect } from 'chai';
import { EnglishTokenizer } from '../../src/lib/tokenizers/EnglishTokenizer.js';
describe('EnglishTokenizer', () => {
let tokenizer;
beforeEach(() => {
tokenizer = new EnglishTokenizer();
});
describe('tokenize()', () => {
it('HTMLタグが正しく除去されること', async () => {
const text = '<p>This is a <strong>test</strong> document</p>';
const tokens = await tokenizer.tokenize(text);
// HTMLタグが含まれていないことを確認
const joinedTokens = tokens.join(' ');
expect(joinedTokens).to.not.include('<p>');
expect(joinedTokens).to.not.include('<strong>');
expect(joinedTokens).to.not.include('</strong>');
expect(joinedTokens).to.not.include('</p>');
});
it('小文字化が正しく行われること', async () => {
const text = 'Programming JavaScript Node.js';
const tokens = await tokenizer.tokenize(text);
// すべてのトークンが小文字になっていることを確認
tokens.forEach((token) => {
if (token.includes('_')) {
// N-gramの場合、分割して確認
const parts = token.split('_');
parts.forEach((part) => {
expect(part).to.equal(part.toLowerCase());
});
}
else {
expect(token).to.equal(token.toLowerCase());
}
});
});
it('ユニグラム、バイグラム、トライグラムが生成されること', async () => {
const text = 'machine learning algorithm';
const tokens = await tokenizer.tokenize(text);
// ユニグラムの確認
expect(tokens).to.include('machin'); // stemmed version of "machine"
expect(tokens).to.include('learn'); // stemmed version of "learning"
expect(tokens).to.include('algorithm');
// バイグラムの確認(N-gramは_で結合される)
const bigrams = tokens.filter((token) => token.includes('_') && token.split('_').length === 2);
expect(bigrams.length).to.be.greaterThan(0);
// トライグラムの確認
const trigrams = tokens.filter((token) => token.includes('_') && token.split('_').length === 3);
expect(trigrams.length).to.be.greaterThan(0);
});
it('空文字列に対して空配列を返すこと', async () => {
const tokens = await tokenizer.tokenize('');
expect(tokens).to.be.an('array');
expect(tokens).to.have.length(0);
});
it('スペースのみの文字列に対して空配列を返すこと', async () => {
const tokens = await tokenizer.tokenize(' ');
expect(tokens).to.be.an('array');
expect(tokens).to.have.length(0);
});
it('ステミング処理が正しく行われること', async () => {
const text = 'running runner runs';
const tokens = await tokenizer.tokenize(text);
// 語幹が統一されることを確認
expect(tokens).to.include('run'); // 'running', 'runner', 'runs' の語幹
});
it('単一単語でも処理できること', async () => {
const text = 'programming';
const tokens = await tokenizer.tokenize(text);
expect(tokens).to.be.an('array');
expect(tokens.length).to.be.greaterThan(0);
expect(tokens).to.include('program'); // stemmed version
});
it('特殊文字が含まれたテキストも処理できること', async () => {
const text = 'Hello, world! How are you?';
const tokens = await tokenizer.tokenize(text);
expect(tokens).to.be.an('array');
expect(tokens.length).to.be.greaterThan(0);
// 句読点は除去されることを確認
tokens.forEach((token) => {
expect(token).to.not.include(',');
expect(token).to.not.include('!');
expect(token).to.not.include('?');
});
});
});
});
//# sourceMappingURL=EnglishTokenizer.js.map