ChatGLM警情识别实战(二)

脱敏方案——tokenizer测试

上期讲到确定了数据脱敏方案,但是还未测试可行性,本期在hugging face上用bert-base-chinese模型测试数据脱敏

bert-base-chinese作用

一图就懂
在这里插入图片描述
注意:下载模型前,要看好自己是要下载哪个模型,基本的模型有:bert-base-chinese(不包含词的训练的),chinese-bert-wwm(包含词的训练)。另外还有robert、electra等模型,所以使用之前需要先明白自己要使用哪个模型。这个版本(bert-base-chinese)是专为中文训练的,更适合中国宝宝体质。

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)

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值