向量数据库 高级功能:分词优化增强文本解析能力

jieba 是一个广泛应用于自然语言处理(NLP)领域的流行中文分词库。腾讯云向量数据库的稀疏向量工具集成 jieba 分词库,能够将文本快速拆分为独立的词汇单元。并且,使用稀疏向量工具,支持用户根据实际业务选择合适的分词模式,支持使用自定义分词词表和自定义停用词,便于用户针对特定领域的词表精细化处理分词,进一步完善分词效果,增强文本解析的准确性。

相关产品
向量数据库 产品页,含版本规格、价格与购买入口。
功能明细 说明 具体使用示例
选择分词模式 精确模式:将文本精确地切分,确保分词结果的准确性,适用于需要高精度分词的场景,如文本分析和语义理解。 精确模式
 全模式:将文本中所有可能的词语都扫描出来,速度非常快,但可能产生一些冗余数据,适用于需要快速提取所有可能词语的场景。例如,搜索引擎的索引处理和关键词提取。 全模式
使用自定义分词词表 自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。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("什么是腾讯云向量数据库。"))}[腾讯 云 向量 数据库]

赞 (0)
上一篇 4天前
下一篇 4天前