| 功能明细 | 说明 | 具体使用示例 |
| 选择分词模式 | 精确模式:将文本精确地切分,确保分词结果的准确性,适用于需要高精度分词的场景,如文本分析和语义理解。 | 精确模式 |
| | 全模式:将文本中所有可能的词语都扫描出来,速度非常快,但可能产生一些冗余数据,适用于需要快速提取所有可能词语的场景。例如,搜索引擎的索引处理和关键词提取。 | 全模式 |
| 使用自定义分词词表 | 自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。jieba 在分词时,会优先识别这个文本中的词语,避免将其拆分为更小的单元。例如,在 userdict_example.txt 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为'腾讯', '云',而保留为'腾讯云'。 | 自定义词表 |
| 使用停用词 | 停用词(Stopwords) 指在文本中频繁出现但通常对文本的语义贡献较小的词汇。稀疏向量工具支持灵活指定需过滤掉而不参与分词的词汇,以提高文本处理的效率和准确性。 | 使用停用词 |
一、选择分词模式
当前稀疏向量工具支持两种分词模式,精确模式与全模式。默认为精确模式。
二、精确模式
稀疏向量工具默认使用精确模式分词,应用示例如下所示。
PythonJavaGofrom tcvdb_text.encoder import BM25Encoderdef use_cut_all(): bm25 = BM25Encoder.default('zh') print("\\nJieba分词模式:精确模式,试图将句子最精确地切开") print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库'))if __name__ == '__main__': use_cut_all()分词结果,如下所示。Jieba分词模式:精确模式,试图将句子最精确地切开['什么', '是', '腾讯', '云', '向量', '数据库']package com.tencent.tcvdbtext;import com.tencent.tcvdbtext.encoder.SparseVectorBm25Encoder;import com.tencent.tcvdbtext.tokenizer.JiebaTokenizer;public class example { public static void main(String[] args) { SparseVectorBm25Encoder encoder = SparseVectorBm25Encoder.getBm25Encoder("zh"); System.out.println("Jieba分词模式:精确模式,试图将句子最精确地切开"); System.out.println(encoder.getTokenizer().tokenize("什么是腾讯云向量数据库")); }}分词结果,如下所示:Jieba分词模式:精确模式,试图将句子最精确地切开[什么, 是, 腾讯, 云, 向量, 数据库]func main() { bm25, _:= NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库"))}分词结果,如下所示。 [什么 是 腾讯 云 向量 数据库]
三、全模式
参数 cut_all 用来控制是否采用全模式,bm25.tokenizer.cut_all = True 即可启用全模式分词。
注意:说明:
注意:全模式分词能够召回更多的词汇组合,通常在需要全面覆盖文本信息时效果更佳,但可能会增加存储空间的占用,并对性能产生一定影响。因此,是否采用全模式分词需要根据具体的应用场景和需求来决定。
PythonJavaGofrom tcvdb_text.encoder import BM25Encoderdef use_cut_all(): bm25 = BM25Encoder.default('zh') print("\\nJieba分词模式:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义") bm25.tokenizer.cut_all = True print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库')) if __name__ == '__main__': use_cut_all()Jieba分词模式:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义['什么', '是', '腾讯', '云', '向量', '数据', '数据库', '据库']package com.tencent.tcvdbtext;import com.tencent.tcvdbtext.encoder.SparseVectorBm25Encoder;import com.tencent.tcvdbtext.tokenizer.JiebaTokenizer;public class example { public static void main(String[] args) { SparseVectorBm25Encoder encoder = SparseVectorBm25Encoder.getBm25Encoder("zh"); encoder.setCutAll(true); System.out.println("Jieba分词模式:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义"); System.out.println(encoder.getTokenizer().tokenize("什么是腾讯云向量数据库")); }}分词结果,如下所示:Jieba分词模式:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义[什么, 是, 腾讯, 云, 向量, 数据, 据库, 数据库]func main() { bm25, _ := NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) cutAll := true jbtParams := tokenizer.TokenizerParams{ CutAll: &cutAll, } _ := bm25.GetTokenizer().UpdateParameters(jbtParams) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库"))}分词结果,如下所示。[什么 是 腾讯 云 向量 数据库]
四、自定义分词词表
自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。jieba 在分词时,会优先识别这个文本中的词语,避免将其拆分为更小的单元。
例如,在 userdict_example.txt 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为'腾讯', '云',而保留为'腾讯云',如下所示。
腾讯云数据库
PythonJavaGofrom tcvdb_text.encoder import BM25Encoderdef set_dict_example(): bm25 = BM25Encoder.default('zh') print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库。')) bm25.set_dict('../userdict_example.txt') print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库。'))if __name__ == '__main__': set_dict_example()分词结果对比,如下所示。['什么', '是', '腾讯', '云', '向量', '数据库']['什么', '是', '腾讯云', '向量', '数据库']package com.tencent.tcvdbtext;import com.tencent.tcvdbtext.encoder.SparseVectorBm25Encoder;import com.tencent.tcvdbtext.tokenizer.JiebaTokenizer;public class example { public static void main(String[] args) { SparseVectorBm25Encoder encoder = SparseVectorBm25Encoder.getBm25Encoder("zh"); // 默认分词词表 System.out.println(tokenizer.tokenize("什么是腾讯云向量数据库。")); // 自定义用户词表,所在路径,需要根据实际替换 String path = "user_dict/userdict_example.txt"; tokenizer.loadDict(path); System.out.println(tokenizer.tokenize("什么是腾讯云向量数据库。")); }}分词结果,如下所示。[什么, 是, 腾讯, 云, 向量, 数据库, 。]user dict /data/home/emilyjzhang/project/vectordb-sdk-java/tcvdb_text/src/main/resources/data/user_dict/userdict_example.txt load finished, tot words:5, time elapsed:2ms[什么, 是, 腾讯云, 向量, 数据库, 。]func main() { bm25, _ := NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库。")) _ := bm25.SetDict("../data/userdict_example.txt") fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库。")) }分词结果,如下所示。[什么 是 腾讯 云 向量 数据库][什么 是 腾讯云 向量 数据库]
五、使用停用词
默认开启停用词,使用 默认停用词列表 进行分词,支持关闭停用词,支持指定停用词词表。停用词词表文件内容必须是一行一个词汇,例如,user_stopwords.txt 文件内容如下所示。
什么是
PythonJavaGodef set_stopwords(): bm25 = BM25Encoder.default('zh') print("\\n使用默认stopwords:") print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库。')) print("\\n不使用stopwords:") bm25.tokenizer.set_stopwords(False) print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库。')) print("\\n自定义stopwords,从文件加载:") ## 如下示例,在./user_stopwords.txt 文件中,逐行列出了需要过滤的停用词:什么 是。 bm25.tokenizer.set_stopwords('./user_stopwords.txt') print(bm25.tokenizer.tokenize('什么是腾讯云向量数据库。'))分词结果,如下所示。使用默认stopwords:['什么', '是', '腾讯', '云', '向量', '数据库']不使用stopwords:['什么', '是', '腾讯', '云', '向量', '数据库', '。']自定义stopwords,从文件加载:['腾讯', '云', '向量', '数据库', '。']package com.tencent.tcvdbtext;import com.tencent.tcvdbtext.encoder.SparseVectorBm25Encoder;import com.tencent.tcvdbtext.tokenizer.JiebaTokenizer;public class example { public static void main(String[] args) { SparseVectorBm25Encoder encoder = SparseVectorBm25Encoder.getBm25Encoder("zh"); // 使用默认的停用词 System.out.println(encoder.getTokenizer().tokenize("什么是腾讯云向量数据库。")); //关闭停用词,查看分词效果 encoder.setEnableStopWords(false); System.out.println(encoder.getTokenizer().tokenize("什么是腾讯云向量数据库。")); // 使用自定义停用词词表,指定停用词词表的所在路径,需要根据实际放置路径替换 String path = "/data/user_stopwords.txt"; encoder.setStopWords(path); // 再次开启停用词,使用停用词词表分词。本示例中,在./user_stopwords.txt文件中,逐行列出了需要过滤的停用词:什么 是。 encoder.setEnableStopWords(true); System.out.println(encoder.getTokenizer().tokenize("什么是腾讯云向量数据库。")); }}分词结果,如下所示。[什么, 是, 腾讯, 云, 向量, 数据库][什么, 是, 腾讯, 云, 向量, 数据库, 。][腾讯, 云, 向量, 数据库, 。]分词处理时,自动过滤默认的停用词。func main() { bm25, _ := NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) // 默认开启停用词,StopWords 控制是否使用使用停用词。StopWords 为true,使用停用词;StopWords 为false,则不使用停用词。 jbtParams := tokenizer.TokenizerParams{ StopWords: true, } _ := bm25.GetTokenizer().UpdateParameters(jbtParams) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库。"))}[什么 是 腾讯 云 向量 数据库]不使用停用词,StopWords: false,不识别停用词。func main() { bm25, _ := NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) jbtParams := tokenizer.TokenizerParams{ StopWords: false, } _ := bm25.GetTokenizer().UpdateParameters(jbtParams) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库。"))} [什么 是 腾讯 云 向量 数据库 。]使用用户自定义的停用词,将停用词写入在user_define_stopwords.txt中,分词处理时,自动过滤该文档指定的停用词。如下示例,该文档写入词汇'什么'与'是',分词效果如下所示。func main() { bm25, _ := NewBM25Encoder(&BM25EncoderParams{Bm25Language: "zh"}) // 使用用户自定义的停用词,需要加载停用词词表文本所在路径 // 本示例中,在./user_stopwords.txt文件中,逐行列出了需要过滤的停用词:什么 是。 jbtParams := tokenizer.TokenizerParams{ StopWords: "../data/user_stopwords.txt", } _ := bm25.GetTokenizer().UpdateParameters(jbtParams) fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库。"))}[腾讯 云 向量 数据库]