jieba 是一个广泛应用于自然语言处理(NLP)领域的流行中文分词库。腾讯云向量数据库的稀疏向量工具集成 jieba 分词库,能够将文本快速拆分为独立的词汇单元。并且,使用稀疏向量工具,支持用户根据实际业务选择合适的分词模式,支持使用自定义分词词表和自定义停用词,便于用户针对特定领域的词表精细化处理分词,进一步完善分词效果,增强文本解析的准确性。
功能明细 | 说明 | 具体使用示例 |
选择分词模式 | 精确模式:将文本精确地切分,确保分词结果的准确性,适用于需要高精度分词的场景,如文本分析和语义理解。 | |
| 全模式:将文本中所有可能的词语都扫描出来,速度非常快,但可能产生一些冗余数据,适用于需要快速提取所有可能词语的场景。例如,搜索引擎的索引处理和关键词提取。 | |
使用自定义分词词表 | 自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。jieba 在分词时,会优先识别这个文本中的词语,避免将其拆分为更小的单元。例如,在 userdict_example.txt 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为 '腾讯', '云' ,而保留为'腾讯云' 。 | |
使用停用词 | 停用词(Stopwords) 指在文本中频繁出现但通常对文本的语义贡献较小的词汇。稀疏向量工具支持灵活指定需过滤掉而不参与分词的词汇,以提高文本处理的效率和准确性。 |
选择分词模式
当前稀疏向量工具支持两种分词模式,精确模式与全模式。默认为精确模式。
精确模式
稀疏向量工具默认使用精确模式分词,应用示例如下所示。
from 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 即可启用全模式分词。
说明:
全模式分词能够召回更多的词汇组合,通常在需要全面覆盖文本信息时效果更佳,但可能会增加存储空间的占用,并对性能产生一定影响。因此,是否采用全模式分词需要根据具体的应用场景和需求来决定。
from tcvdb_text.encoder import BM25Encoderdef use_cut_all():bm25 = BM25Encoder.default('zh')print("\\nJieba分词模式:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义")bm25.tokenizer.cut_all = Trueprint(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 := truejbtParams := tokenizer.TokenizerParams{CutAll: &cutAll,}_ := bm25.GetTokenizer().UpdateParameters(jbtParams)fmt.Println(bm25.GetTokenizer().Tokenize("什么是腾讯云向量数据库"))}
分词结果,如下所示。
[什么 是 腾讯 云 向量 数据库]
自定义分词词表
自定义词表,将需要保留、无需拆分的词语整理在一个文本中,每行一个词汇。jieba 在分词时,会优先识别这个文本中的词语,避免将其拆分为更小的单元。
例如,在 userdict_example.txt 中,写入一个词汇“腾讯云”。在分词处理时,将不会被处理为
'腾讯', '云'
,而保留为'腾讯云'
,如下所示。腾讯云数据库
from 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("什么是腾讯云向量数据库。"))}
分词结果,如下所示。
[什么 是 腾讯 云 向量 数据库][什么 是 腾讯云 向量 数据库]
使用停用词
什么是
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("什么是腾讯云向量数据库。"))}
[腾讯 云 向量 数据库]