当前位置:   article > 正文

ChatGLM警情识别实战(二)_# load model directly from transformers import aut

# load model directly from transformers import autotokenizer, automodelforca

脱敏方案——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
  • 1

然后输入以下代码

# Load model directly
from transformers import AutoTokenizer, AutoModelForMaskedLM

tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese")
  • 1
  • 2
  • 3
  • 4
  • 5

模型默认会下载到本地路径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)
  • 1
  • 2
  • 3

下载好之后就可以使用了

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]标记通常用于填充短序列的末尾,以与其他序列对齐。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在这里插入图片描述
结果所示,同时经过比对其他方案,该方案最合适数据脱敏任务,因此脱敏方案选定,需要注意的是每个模型的词表是不一样的,都有模型自身对应的词表,也可以自己训练自己的词表,以下提供其中一个方法

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/743712
推荐阅读
相关标签
  

闽ICP备14008679号