import { TextRankKeyword } from '../src/core/textrank-keyword'; import { safeAnalyze } from './test-helpers'; describe('TextRankKeyword', () => { let textRankKeyword: TextRankKeyword; const sampleText = '北京是中国的首都,也是政治文化中心。上海是中国最大的经济中心城市。'; beforeEach(() => { textRankKeyword = new TextRankKeyword(); }); test('应该能够分析文本并提取关键词', () => { safeAnalyze(textRankKeyword, sampleText, { lower: true, window: 2, }); const keywords = textRankKeyword.getKeywords(5); expect(keywords.length).toBe(5); const first = keywords[0]; expect(first).toBeDefined(); expect(first).toHaveProperty('word'); expect(first).toHaveProperty('weight'); expect(typeof first?.weight).toBe('number'); expect(first?.weight).toBeGreaterThan(0); }); test('关键词应该按权重降序排列', () => { textRankKeyword.analyze(sampleText); const keywords = textRankKeyword.getKeywords(10); for (let i = 1; i < keywords.length; i++) { const prev = keywords[i - 1]; const current = keywords[i]; expect(prev).toBeDefined(); expect(current).toBeDefined(); if (prev && current) { expect(prev.weight).toBeGreaterThanOrEqual(current.weight); } } }); test('应该能够根据最小长度过滤关键词', () => { textRankKeyword.analyze(sampleText); const keywordsMinLen1 = textRankKeyword.getKeywords(10, 1); const keywordsMinLen2 = textRankKeyword.getKeywords(10, 2); expect(keywordsMinLen2.length).toBeLessThanOrEqual(keywordsMinLen1.length); keywordsMinLen2.forEach((keyword) => { expect(keyword.word.length).toBeGreaterThanOrEqual(2); }); }); test('应该能够提取关键短语', () => { const longText = '人工智能技术在自然语言处理领域取得了重大突破。机器学习和深度学习推动了人工智能的快速发展。'; textRankKeyword.analyze(longText); const keyphrases = textRankKeyword.getKeyphrases(20, 1); expect(Array.isArray(keyphrases)).toBe(true); keyphrases.forEach((phrase) => { expect(typeof phrase).toBe('string'); expect(phrase.length).toBeGreaterThan(1); }); }); test('不同窗口大小应该产生不同结果', () => { textRankKeyword.analyze(sampleText, { window: 2 }); const keywords2 = textRankKeyword.getKeywords(5); textRankKeyword.analyze(sampleText, { window: 3 }); const keywords3 = textRankKeyword.getKeywords(5); // 窗口大小不同可能导致权重不同 const weights2 = keywords2.map((k) => k.weight); const weights3 = keywords3.map((k) => k.weight); expect(weights2).not.toEqual(weights3); }); test('不同词源应该产生不同结果', () => { textRankKeyword.analyze(sampleText, { vertexSource: 'no_stop_words', edgeSource: 'no_stop_words', }); const keywordsNoStopWords = textRankKeyword.getKeywords(5); textRankKeyword.analyze(sampleText, { vertexSource: 'all_filters', edgeSource: 'all_filters', }); const keywordsAllFilters = textRankKeyword.getKeywords(5); // 由于轻量级分词器的限制,不同词源可能产生相同结果,这是可接受的 // 至少应该能正常运行并产生结果 expect(keywordsNoStopWords.length).toBeGreaterThan(0); expect(keywordsAllFilters.length).toBeGreaterThan(0); }); test('应该能够访问分割结果', () => { textRankKeyword.analyze(sampleText); expect(Array.isArray(textRankKeyword.sentences)).toBe(true); expect(Array.isArray(textRankKeyword.wordsNoFilter)).toBe(true); expect(Array.isArray(textRankKeyword.wordsNoStopWords)).toBe(true); expect(Array.isArray(textRankKeyword.wordsAllFilters)).toBe(true); expect(textRankKeyword.sentences.length).toBeGreaterThan(0); expect(textRankKeyword.wordsNoFilter.length).toEqual(textRankKeyword.sentences.length); }); test('应该能够处理空文本', () => { textRankKeyword.analyze(''); const keywords = textRankKeyword.getKeywords(5); const keyphrases = textRankKeyword.getKeyphrases(5); expect(keywords).toHaveLength(0); expect(keyphrases).toHaveLength(0); }); test('PageRank配置应该影响结果', () => { textRankKeyword.analyze(sampleText, { pageRankConfig: { alpha: 0.5 }, }); const keywords1 = textRankKeyword.getKeywords(5); textRankKeyword.analyze(sampleText, { pageRankConfig: { alpha: 0.9 }, }); const keywords2 = textRankKeyword.getKeywords(5); // 不同的alpha值应该产生不同的权重 const weights1 = keywords1.map((k) => k.weight); const weights2 = keywords2.map((k) => k.weight); expect(weights1).not.toEqual(weights2); }); });