赞
踩
上期讲到确定了数据脱敏方案,但是还未测试可行性,本期在hugging face上用bert-base-chinese模型测试数据脱敏
一图就懂
注意:下载模型前,要看好自己是要下载哪个模型,基本的模型有:bert-base-chinese(不包含词的训练的),chinese-bert-wwm(包含词的训练)。另外还有robert、electra等模型,所以使用之前需要先明白自己要使用哪个模型。这个版本(bert-base-chinese)是专为中文训练的,更适合中国宝宝体质。
首先确定环境已经安装了transformer,否则需要安装
pip install transformers
然后输入以下代码
# Load model directly
from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese")
模型默认会下载到本地路径C:\Users\.cache\huggingface\hub\models--bert-base-chinese
下,也可以通过dir
指定下载路径。注意:如果指定下载路径,调用的时候也需要指定路径
from transformers import AutoTokenizer
model_path = '/app/nlp_env/bert/model_cache/chatglm2-6b-int4/'
tokenizer = AutoTokenizer.from_pretrained(model_path,trust_remote_code=True)
下载好之后就可以使用了
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") sen = "弱小的我也有大梦想450104" encode = tokenizer.encode(sen) print(encode) decode = tokenizer.decode(encode) print(decode) batch_sentences = ["弱小的我也有大梦想450104", "今天天气很好", "出去走走吗"] encoded_inputs = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt") # text: 需要被编码的文本,可以是一维或二维list # padding: 是否需要padding,可选如下几个值 # True or 'longest',padding到一个batch中最长序列的长度 # 'max_length', padding到由max_length参数指定的长度,如果没有指定max_length则padding到模型所能接受的最大长度 # False or 'do_not_pad', 不进行padding # truncation: 是否要进行截断 # True or 'longest_first',保留由max_length指定的长度,或者当max_length没有指定时,截取保留模型最大能接受的长度,对于sentence pair,截取长度最大的句子 # False or 'do_not_truncate (default) 不截取 # only_first,截取到max_length, 但是只截取sentence pair中的第一个句子 # 'only_second',同理,只截取pair中第二个句子 # max_length,句子最大长度,和padding及truncation相关 # is_split_into_words 输入的句子是否已经分词好了,比如已经用空格分隔开 # return_tensors 返回类型,默认是list类型,可选pt返回torch 的 tensor,tf返回tensorflow的tensor, npnumpy类型 # return_length,是否返回编码的序列长度,default=False print(encoded_inputs) print(tokenizer.batch_decode(encoded_inputs["input_ids"])) # [CLS]:[CLS]标记表示"Classification",通常用于表示一个文本序列的开始。在许多模型中,[CLS]标记作为句子或文本的起始标记,用于对整个序列进行分类或表示整个句子的特征。 # [SEP]:[SEP]标记表示"Separator",用于分隔不同的句子或文本段落。在处理多个句子的任务(如句子对分类、文本生成等)时,[SEP]标记可以用来明确分隔不同句子之间的边界。 # [PAD]:[PAD]标记表示"Padding",用于填充序列以使其具有相同的长度。在许多深度学习模型中,要求输入序列具有相同的长度,因此较短的序列需要进行填充。[PAD]标记通常用于填充短序列的末尾,以与其他序列对齐。
结果所示,同时经过比对其他方案,该方案最合适数据脱敏任务,因此脱敏方案选定,需要注意的是每个模型的词表是不一样的,都有模型自身对应的词表,也可以自己训练自己的词表,以下提供其中一个方法
import jieba def build_vocab(texts): vocab = {} for text in texts: words = process_text(text) for word in words: if word not in vocab: vocab[word] = len(vocab) return vocab def convert_text_to_sequence(text, vocab): words = process_text(text) sequence = [] for word in words: if word in vocab: sequence.append(vocab[word]) return sequence def convert_sequence_to_text(sequence, vocab): words = [word for word, index in vocab.items() if index in sequence] text = "".join(words) return text def process_text(text): processed_words = [] for char in text: if char.isdigit(): processed_words.extend(list(char)) # 拆分数字为单个字符 else: processed_words.append(char) words = jieba.lcut("".join(processed_words)) return words # 示例文本数据 texts = [ "这是一段示例文本。", "This is an example text.", "这个函数用来构建词表和将文本转换为数值序列123。", ] # 构建词表 vocab = build_vocab(texts) # 将文本转换为数值序列 sequences = [convert_text_to_sequence(text, vocab) for text in texts] # 打印词表和转换后的数值序列 print("词表:") for word, index in vocab.items(): print(f"{word}: {index}") print("\n转换后的数值序列:") for text, sequence in zip(texts, sequences): print(f"{text}\n{sequence}") print("\n转换回句子形式:") for sequence in sequences: text = convert_sequence_to_text(sequence, vocab) print(text)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。