

























@@ -9,19 +9,35 @@ describe("extractKeywords", () => {
991010it("extracts keywords from Chinese conversational query", () => {
1111const keywords = extractKeywords("之前讨论的那个方案");
12-expect(keywords).toContain("讨论");
13-expect(keywords).toContain("方案");
14-// Should not include stop words
15-expect(keywords).not.toContain("之前");
16-expect(keywords).not.toContain("的");
17-expect(keywords).not.toContain("那个");
12+expect(keywords).toStrictEqual([
13+"之",
14+"讨",
15+"论",
16+"个",
17+"方",
18+"案",
19+"前讨",
20+"讨论",
21+"论的",
22+"的那",
23+"个方",
24+"方案",
25+]);
1826});
19272028it("extracts keywords from mixed language query", () => {
2129const keywords = extractKeywords("昨天讨论的 API design");
22-expect(keywords).toContain("讨论");
23-expect(keywords).toContain("api");
24-expect(keywords).toContain("design");
30+expect(keywords).toStrictEqual([
31+"昨",
32+"天",
33+"讨",
34+"论",
35+"天讨",
36+"讨论",
37+"论的",
38+"api",
39+"design",
40+]);
2541});
26422743it("returns specific technical terms", () => {
@@ -41,24 +57,17 @@ describe("extractKeywords", () => {
41574258it("filters Korean stop words including inflected forms", () => {
4359const keywords = extractKeywords("나는 그리고 그래서");
44-expect(keywords).not.toContain("나");
45-expect(keywords).not.toContain("나는");
46-expect(keywords).not.toContain("그리고");
47-expect(keywords).not.toContain("그래서");
60+expect(keywords).toStrictEqual([]);
4861});
49625063it("filters inflected Korean stop words not explicitly listed", () => {
5164const keywords = extractKeywords("그녀는 우리는");
52-expect(keywords).not.toContain("그녀는");
53-expect(keywords).not.toContain("우리는");
54-expect(keywords).not.toContain("그녀");
55-expect(keywords).not.toContain("우리");
65+expect(keywords).toStrictEqual([]);
5666});
57675868it("does not produce bogus single-char stems from particle stripping", () => {
5969const keywords = extractKeywords("논의");
60-expect(keywords).toContain("논의");
61-expect(keywords).not.toContain("논");
70+expect(keywords).toStrictEqual(["논의"]);
6271});
63726473it("strips longest Korean trailing particles first", () => {
@@ -73,31 +82,22 @@ describe("extractKeywords", () => {
73827483it("handles mixed Korean and English query", () => {
7584const keywords = extractKeywords("API 배포에 대한 논의");
76-expect(keywords).toContain("api");
77-expect(keywords).toContain("배포");
78-expect(keywords).toContain("논의");
85+expect(keywords).toStrictEqual(["api", "배포에", "배포", "대한", "논의"]);
7986});
80878188it("extracts keywords from Japanese conversational query", () => {
8289const keywords = extractKeywords("昨日話したデプロイ戦略");
83-expect(keywords).toContain("デプロイ");
84-expect(keywords).toContain("戦略");
85-expect(keywords).not.toContain("昨日");
90+expect(keywords).toStrictEqual(["昨日話", "日話", "デプロイ", "戦略"]);
8691});
87928893it("handles mixed Japanese and English query", () => {
8994const keywords = extractKeywords("昨日話したAPIのバグ");
90-expect(keywords).toContain("api");
91-expect(keywords).toContain("バグ");
92-expect(keywords).not.toContain("した");
95+expect(keywords).toStrictEqual(["昨日話", "日話", "api", "バグ"]);
9396});
94979598it("filters Japanese stop words", () => {
9699const keywords = extractKeywords("これ それ そして どう");
97-expect(keywords).not.toContain("これ");
98-expect(keywords).not.toContain("それ");
99-expect(keywords).not.toContain("そして");
100-expect(keywords).not.toContain("どう");
100+expect(keywords).toStrictEqual([]);
101101});
102102103103it("extracts keywords from Spanish conversational query", () => {
@@ -112,12 +112,7 @@ describe("extractKeywords", () => {
112112113113it("filters Spanish and Portuguese question stop words", () => {
114114const keywords = extractKeywords("cómo cuando donde porquê quando onde");
115-expect(keywords).not.toContain("cómo");
116-expect(keywords).not.toContain("cuando");
117-expect(keywords).not.toContain("donde");
118-expect(keywords).not.toContain("porquê");
119-expect(keywords).not.toContain("quando");
120-expect(keywords).not.toContain("onde");
115+expect(keywords).toStrictEqual([]);
121116});
122117123118it("extracts keywords from Arabic conversational query", () => {
@@ -127,10 +122,7 @@ describe("extractKeywords", () => {
127122128123it("filters Arabic question stop words", () => {
129124const keywords = extractKeywords("كيف متى أين ماذا");
130-expect(keywords).not.toContain("كيف");
131-expect(keywords).not.toContain("متى");
132-expect(keywords).not.toContain("أين");
133-expect(keywords).not.toContain("ماذا");
125+expect(keywords).toStrictEqual([]);
134126});
135127136128it("handles empty query", () => {
@@ -154,42 +146,38 @@ describe("extractKeywords", () => {
154146it("emits whole CJK block instead of unigrams in trigram mode", () => {
155147const defaultKeywords = extractKeywords("之前讨论的那个方案");
156148const trigramKeywords = extractKeywords("之前讨论的那个方案", trigramOpts);
157-// Default mode produces bigrams
158-expect(defaultKeywords).toContain("讨论");
159-expect(defaultKeywords).toContain("方案");
160-// Trigram mode emits the whole contiguous CJK block (FTS5 trigram
161-// requires >= 3 chars per term; individual characters return no results)
162-expect(trigramKeywords).toContain("之前讨论的那个方案");
163-expect(trigramKeywords).not.toContain("讨论");
164-expect(trigramKeywords).not.toContain("方案");
149+expect(defaultKeywords).toStrictEqual([
150+"之",
151+"讨",
152+"论",
153+"个",
154+"方",
155+"案",
156+"前讨",
157+"讨论",
158+"论的",
159+"的那",
160+"个方",
161+"方案",
162+]);
163+expect(trigramKeywords).toStrictEqual(["之前讨论的那个方案"]);
165164});
166165167166it("skips Japanese kanji bigrams in trigram mode", () => {
168167const defaultKeywords = extractKeywords("経済政策について");
169168const trigramKeywords = extractKeywords("経済政策について", trigramOpts);
170-// Default mode adds kanji bigrams: 経済, 済政, 政策
171-expect(defaultKeywords).toContain("経済");
172-expect(defaultKeywords).toContain("済政");
173-expect(defaultKeywords).toContain("政策");
174-// Trigram mode keeps the full kanji block but skips bigram splitting
175-expect(trigramKeywords).toContain("経済政策");
176-expect(trigramKeywords).not.toContain("済政");
169+expect(defaultKeywords).toStrictEqual(["経済政策", "経済", "済政", "政策", "について"]);
170+expect(trigramKeywords).toStrictEqual(["経済政策", "について"]);
177171});
178172179173it("still filters stop words in trigram mode", () => {
180174const keywords = extractKeywords("これ それ そして どう", trigramOpts);
181-expect(keywords).not.toContain("これ");
182-expect(keywords).not.toContain("それ");
183-expect(keywords).not.toContain("そして");
184-expect(keywords).not.toContain("どう");
175+expect(keywords).toStrictEqual([]);
185176});
186177187178it("does not affect English keyword extraction", () => {
188179const keywords = extractKeywords("that thing we discussed about the API", trigramOpts);
189-expect(keywords).toContain("discussed");
190-expect(keywords).toContain("api");
191-expect(keywords).not.toContain("that");
192-expect(keywords).not.toContain("the");
180+expect(keywords).toStrictEqual(["discussed", "api"]);
193181});
194182});
195183});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。