支持什么语言
语言无关,不受特定语言规则限制,因此理论上支持所有语言的文本处理
需要输入什么文件
主要使用txt文件输入,虽然支持多文件输入,但是推荐转成单文件
在实际nlp任务中如何利用SentencePiece
一般来说是直接使用训练好的sp(SentencePiece),而不需要用sp去生成词典再分词,因为复现sp的预处理规则十分复杂
能否并行
比较麻烦,需要自己实现
小demo代码示例
这里使用了BPE但是推荐使用更先进的Unigram,修改model_type即可,词汇表最大大小可能有变动
import sentencepiece as spm
import numpy as np
# 1. 准备训练数据
corpus = """
在自然语言处理中,子词切分是一种重要的技术。
它能够有效地处理未登录词和稀有词汇。
中文分词任务也可以使用子词切分算法。
SentencePiece是一个开源的子词切分工具。
这个程序演示了如何将中文文本转换为子词索引。
机器学习模型的输入通常需要数值化表示。
文本分类、情感分析等任务都需要进行这种转换。
深度学习框架如PyTorch和TensorFlow都支持整数输入。
"""
# 将文本保存到文件
corpus_file = "corpus.txt"
with open(corpus_file, "w", encoding="utf-8") as f:
f.write(corpus.strip())
# 2. 训练SentencePiece模型
train_params = (
f"--input={corpus_file} "
"--model_prefix=spm_model " # 输出模型名前缀
"--vocab_size=400 " # 词汇表大小
"--character_coverage=1.0 " # 覆盖全部字符
"--model_type=bpe " # 使用BPE算法
"--pad_id=0 " # 填充符号ID=0
"--unk_id=1 " # 未知词ID=1
"--bos_id=2 " # 开始符号ID=2
"--eos_id=3 " # 结束符号ID=3
"--max_sentence_length=1024 " # 最大句长
"--user_defined_symbols=,。?、;:" # 保留中文标点符号
)
spm.SentencePieceTrainer.train(train_params)
# 3. 加载训练好的模型
sp = spm.SentencePieceProcessor()
sp.load("spm_model.model")
# 打印词汇表信息
print(f"词汇表大小: {sp.get_piece_size()}")
print(f"未知词标记: {sp.id_to_piece(sp.unk_id())}")
print(f"填充标记: {sp.id_to_piece(sp.pad_id())}")
# 4. 文本转换示例
texts = [
"自然语言处理很有挑战性,",
"SentencePiece能够很好地处理中英文混合",
"这是一个子词转换索引的演示程序",
"机器学习模型需要数值化输入"
]
# 5. 创建批量转换函数
def texts_to_indices(text_list, max_length=None, add_special_tokens=True):
"""
将文本列表转换为索引矩阵
参数:
text_list: 文本列表
max_length: 最大长度 (None表示自动长度)
add_special_tokens: 是否添加特殊标记
返回:
numpy数组 (batch_size, seq_length)
"""
indices_list = []
for text in text_list:
# 编码为索引
ids = sp.encode_as_ids(text)
# 可选添加开始/结束标记
if add_special_tokens:
ids = [sp.bos_id()] + ids + [sp.eos_id()]
indices_list.append(ids)
# 确定实际最大长度
if max_length is None:
max_length = max(len(seq) for seq in indices_list)
# 创建填充矩阵
batch_size = len(text_list)
pad_id = sp.pad_id()
indices_matrix = np.full((batch_size, max_length), pad_id, dtype=np.int32)
# 填充数据
for i, seq in enumerate(indices_list):
length = min(len(seq), max_length)
indices_matrix[i, :length] = seq[:length]
return indices_matrix
# 转换为索引矩阵
batch_indices = texts_to_indices(texts, max_length=15, add_special_tokens=True)
print("\n索引矩阵:")
print(batch_indices)
print(f"矩阵形状: {batch_indices.shape}")
5942

被折叠的 条评论
为什么被折叠?



