【免费下载链接】finbert
FinBERT 是专为金融文本训练的情感分析模型,可输出 positive / negative / neutral 三类判断。它的"第一站"是 BERT 分词器:本指南带你从零看懂 FinBERT 分词器的 30522 词表结构、WordPiece 子词机制,以及 [CLS]、[SEP]、[UNK]、[PAD]、[MASK] 这 5 个特殊标记各自的工作原理。
📦 FinBERT 分词器由什么组成:3 个关键文件
在模型仓库中,与分词器直接相关的文件只有 3 个:
| 文件 | 作用 |
|---|---|
| vocab.txt | 词表本体,共 30522 行,每行 1 个词元(token) |
| tokenizer_config.json | 分词器行为配置:小写化、512 长度上限等 |
| special_tokens_map.json | 声明 5 个特殊标记的名称 |
模型权重则按框架分别存放:pytorch_model.bin、model.safetensors、tf_model.h5、flax_model.msgpack。无论加载哪种权重,用的都是同一套词表。
打开 tokenizer_config.json 能看到几个决定分词行为的开关:
{ "do_lower_case": true, "model_max_length": 512, "tokenize_chinese_chars": true, "name_or_path": "bert-base-uncased" }两个要点:
- do_lower_case: true—— 分词前把所有输入转为小写,所以词表里只存 "stocks",不存 "Stocks";
- model_max_length: 512—— 单条输入最多 512 个词元,与 config.json 中的
max_position_embeddings: 512一一对应。
🔢 30522 词表详解:从 [PAD] 到子词
config.json 中vocab_size字段精确写着30522,而 vocab.txt 恰好是 30522 行。词表行号(从 1 开始)减 1 就是词元 ID,头部布局如下:
| 词元 ID 范围 | 内容 | 说明 |
|---|---|---|
| 0 | [PAD] | 填充标记,位于第 1 行 |
| 1 – 99 | [unused0] – [unused98] | 预留空位 |
| 100 | [UNK] | 未知词兜底,第 101 行 |
| 101 – 103 | [CLS] / [SEP] / [MASK] | 见下一节,第 102–104 行 |
| 104 起 | 数字、常见单词、子词 | 真正参与编码的词元 |
这种布局直接继承自 BERT base 预训练模型(即name_or_path: bert-base-uncased),FinBERT 只是在这个词表之上继续做了金融领域训练。
真正参与分词的词元分三类:
- 完整单词:如 the(ID 1996)、market(ID 3006)、金融词 financially(ID 13732);
- 子词(subword):共5828 个,统一以
##开头,如 ##ing(ID 2075)、##ed(ID 2098)、##tion(ID 3508); - 数字与标点:如 "0"–"9"(从 第 105 行 开始)、"."(第 1013 行,ID 1012)。
WordPiece 子词机制是理解词表的关键:一个词如果整体在词表中,就直接用一个词元表示,例如 "rallied" 直接对应 ID 24356;如果不在,就切成"词根 + 子词",例如 "gaining" 会切成 gain + ##ing。这保证了任意英文输入都能被编码,不会"查无此词"。
🏷️ 5 个特殊标记的工作原理逐一拆解
special_tokens_map.json 声明了 5 个特殊标记,它们各占词表中的一个固定 ID:
| 特殊标记 | 词元 ID | 工作原理 |
|---|---|---|
| [PAD] | 0 | 批量推理时给短句补空位对齐批次;pad_token_id: 0写死在 config.json |
| [UNK] | 100 | 词表查不到的词统一归到这里,模型永不"崩溃" |
| [CLS] | 101 | 加在句首,它的输出向量代表整句,直接送入分类头输出 positive / negative / neutral |
| [SEP] | 102 | 加在句尾(或两句之间),告知模型"输入到此结束" |
| [MASK] | 103 | 预训练阶段用来"挖空填词";情感分类推理时用不到 |
一句话记忆:[CLS] 管开头、[SEP] 管结尾、[UNK] 管意外、[PAD] 管对齐、[MASK] 管训练。
🧪 分词流程演示:一句金融新闻变成 10 个词元
拿 README.md 里的经典例句 "Stocks rallied and the British pound gained." 走一遍完整流程:
- 第 1 步:转小写→
stocks rallied and the british pound gained. - 第 2 步:按空格切分→ 9 个片段
- 第 3 步:WordPiece 校验→ 本句每个词恰好都在词表中,无需再切
- 第 4 步:首尾加特殊标记→
[CLS] ... [SEP]
最终得到 10 个词元及其 ID:
| 词元 | ID |
|---|---|
| [CLS] | 101 |
| stocks | 15768 |
| rallied | 24356 |
| and | 1998 |
| the | 1996 |
| british | 2329 |
| pound | 9044 |
| gained | 4227 |
| . | 1012 |
| [SEP] | 102 |
模型读取的就是这串 ID,并会把这句话判为 positive,置信度约 0.898。
🚀 快速上手:2 行代码加载 FinBERT 分词器
from transformers import BertTokenizerFast tokenizer = BertTokenizerFast.from_pretrained("ProsusAI/finbert") print(tokenizer.tokenize("Stocks rallied and the British pound gained.")) # ['stocks', 'rallied', 'and', 'the', 'british', 'pound', 'gained', '.']len(tokenizer)会返回 30522,正好等于词表行数;tokenizer(["a", "b"])批量分词时会自动用 [PAD] 把短句补齐到等长。
❓ 新手常见问题
Q1:词表为什么恰好是 30522?因为 FinBERT 沿用 BERT base(uncased)的词表布局:5 个特殊标记(含 [PAD])+ 99 个 unused 空位 + 30418 个真实词元,合计 30522。
Q2:能分词中文吗?tokenize_chinese_chars: true只表示会把中文按字符拆开;词表主体仍是英文(尾部虽有少量中文标点子词,见 vocab.txt 末尾),对中文金融文本效果有限。模型本身也是面向英文训练(见 README.md 的 Model details)。
Q3:推理时 [MASK] 会被用到吗?不会。[MASK] 只服务于预训练阶段的完形填空任务,情感分类推理链路中它不登场。
总结:FinBERT 分词器速记卡
- 词表:vocab.txt,30522 个词元 = 5 个特殊标记 + 99 个 unused + 30418 个真实词元(含 5828 个子词)
- 配置:tokenizer_config.json,小写化 + 512 长度上限
- 特殊标记:[CLS] 开头、[SEP] 结尾、[UNK] 兜底、[PAD] 对齐、[MASK] 训练专用
- 机制:WordPiece 子词切分保证任意英文输入都能编码,rally、revenue 等金融高频词均直接收录
【免费下载链接】finbert
相关推荐
Qwen3分词器与特殊标记系统详解
Qwen3分词器与特殊标记系统详解 本文全面解析了Qwen3 30B A3B模型的核心技术架构,重点探讨了其151936词汇表的多语言支持能力、特殊标记系统的设
大模型深度学习人工智能Llama 3 Tokenizer技术解析:128K词汇表与特殊标记处理机制
Llama 3 Tokenizer技术解析:128K词汇表与特殊标记处理机制 引言:Tokenizer在大语言模型中的核心作用 在大语言模型(LLM)的技术栈中
人工智能大模型基础模型本地部署voxtral.c Tekken 分词器解析:131072 词表与特殊 Token 布局设计
voxtral.c Tekken 分词器解析:131072 词表与特殊 Token 布局设计 voxtral.c 是 Mistral Voxtral Realt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考