文档中心>向量数据库>核心概念>稀疏向量>稀疏向量工具>高级功能:分词优化增强文本解析能力

高级功能:分词优化增强文本解析能力

最近更新时间:2025-08-05 17:23:31

我的收藏
jieba 是一个广泛应用于自然语言处理(NLP)领域的流行中文分词库。腾讯云向量数据库的稀疏向量工具集成 jieba 分词库,能够将文本快速拆分为独立的词汇单元。并且,使用稀疏向量工具,支持用户根据实际业务选择合适的分词模式,支持使用自定义分词词表和自定义停用词,便于用户针对特定领域的词表精细化处理分词,进一步完善分词效果,增强文本解析的准确性。
功能明细
说明
具体使用示例
选择分词模式
精确模式:将文本精确地切分,确保分词结果的准确性,适用于需要高精度分词的场景,如文本分析和语义理解。
全模式:将文本中所有可能的词语都扫描出来,速度非常快,但可能产生一些冗余数据,适用于需要快速提取所有可能词语的场景。例如,搜索引擎的索引处理和关键词提取。
全模式
使用自定义分词词表
自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。jieba 在分词时,会优先识别这个文本中的词语,避免将其拆分为更小的单元。例如,在 userdict_example.txt 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为'腾讯', '云',而保留为'腾讯云'
使用停用词
停用词(Stopwords) 指在文本中频繁出现但通常对文本的语义贡献较小的词汇。稀疏向量工具支持灵活指定需过滤掉而不参与分词的词汇,以提高文本处理的效率和准确性。

选择分词模式

当前稀疏向量工具支持两种分词模式,精确模式与全模式。默认为精确模式。

精确模式

稀疏向量工具默认使用精确模式分词,应用示例如下所示。
Python
Java
Go
from tcvdb_text.encoder import BM25Encoder

def 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 即可启用全模式分词。
说明:
全模式分词能够召回更多的词汇组合,通常在需要全面覆盖文本信息时效果更佳,但可能会增加存储空间的占用,并对性能产生一定影响。因此,是否采用全模式分词需要根据具体的应用场景和需求来决定。
Python
Java
Go
from tcvdb_text.encoder import BM25Encoder

def 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 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为'腾讯', '云',而保留为'腾讯云',如下所示。
腾讯云
数据库
Python
Java
Go
from tcvdb_text.encoder import BM25Encoder

def 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 文件内容如下所示。
什么
Python
Java
Go
def 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("什么是腾讯云向量数据库。"))
}
[腾讯 云 向量 数据库]