在自然语言处理中,处理多语言和特殊字符的表示始终是一项挑战。本文将分析一种创新的词表构建策略,该策略通过数学优化和双token机制,在保持词表紧凑的同时实现了对Unicode字符的全面覆盖。

词表构建的核心逻辑

该策略包含四个关键步骤:

  1. 收集有意义的Unicode字符
    • 遍历Unicode基本多语言平面(BMP, 0-0xFFFF)
    • 过滤控制字符(Cc/Cf/Cs/Cn类别)
    • 保留实际可用的书写字符
def is_meaningful(char):"""识别具有实际意义的Unicode字符"""try:name = unicodedata.name(char)cat = unicodedata.category(char)return not (cat.startswith('C') and cat != 'Co')except:return False
  1. 优化字符表示方案
    • 为S个字符寻找最优的二维矩阵布局
    • 求解满足m×n=Sm×n=Sm×n=S时使m+nm+nm+n最小的整数对
    • 使用O(S)O(\sqrt{S})O(S)的因子搜索算法
def find_min_sum_integer(S):"""寻找最优二维布局方案"""min_sum = S + 1sqrt_S = int(math.isqrt(S))for m in range(1, sqrt_S + 1):if S % m == 0:n = S // mcurrent_sum = m + nif current_sum < min_sum:min_sum = current_sumbest_pair = (m, n)return best_pair
  1. 构建层次化词表

    # 1. 行列基础token
    for i in range(m):s = f"s_{i}"for j in range(n):e = f"e_{j}"# 每个字符由(s_i, e_j)对表示voc_single_all_str[(s, e)] = chars.pop()# 2. 添加多字符词汇
    voc += [phrase for phrase in common_phrases if len(phrase)>1][:5000]# 3. 添加特殊功能token
    voc = ["<|pad|>", "<|im_start|>", ...] + voc
    
  2. 创建混合映射机制

    # 字符到ID的映射(单个字符映射到双token序列)
    mapping = {'字': [id("s_42"), id("e_17")],'A': [id("s_12"), id("e_93")],...
    }
    

技术优势分析

  1. 高效的空间复杂度

    • 传统方法:为每个Unicode字符分配独立token → O(S)O(S)O(S)空间
    • 本方法:行列分离表示 → O(S)O(\sqrt{S})O(S)空间
    字符数(S)行列方案空间节省
    10,00020050×
    50,000448111×
    100,000632158×
  2. 全面的字符覆盖

    • 支持99%以上的常用字符(BMP平面)
    • 包括中文、韩文、藏文等复杂文字系统
    • 覆盖数学符号、货币符号等特殊字符
  3. 混合层次化设计

    词表结构
    核心功能Token
    单字符表示层
    多词汇短语层
    行标识s_i
    列标识e_j
    高频短语
    专业术语
  4. 随机化增强

    • 行列标识随机混排消除位置偏差
    • 多字符短语随机排序避免语言偏好

实际应用价值

  1. 多语言模型优化

    • 解决稀有字符OOV(Out-of-Vocabulary)问题
    • 支持小语种文本的高效处理
  2. 紧凑模型部署

    • 减少Embedding层参数90%以上
    • 在保持覆盖度的同时控制词表在10K内
  3. 特殊领域扩展

    • 通过添加领域短语支持专业术语
    • 数学公式、化学符号的特殊支持

潜在改进方向

  1. 扩展字符范围

    # 扩展至Unicode完整范围(0-0x10FFFF)
    for plane in range(0, 17):start = plane * 0x10000end = start + 0x10000# 处理每个平面的字符
    
  2. 动态词汇注入

    def inject_domain_terms(voc, domain_terms):"""按需添加领域词汇"""new_terms = [term for term in domain_terms if term not in voc]return voc + new_terms[:vacancy]
    
  3. 压缩表示优化

    # 对高频字符提供单token别名
    char_aliases = {'的': '<|char_de|>',',': '<|char_comma|>',...
    }
    

结语

这种词表构建策略通过数学优化和层次化设计,在字符覆盖率和空间效率间取得了巧妙平衡。它不仅解决了Unicode表示的根本挑战,还为构建紧凑高效的多语言模型提供了坚实基础。在全球化AI应用日益普及的今天,这类高效表示方法的价值将愈发凸显。

import pandas as pd
import unicodedataimport numpy as npdef is_meaningful(char):"""严格定义:已分配 + 非控制字符"""try:name = unicodedata.name(char)cat = unicodedata.category(char)return not (cat.startswith('C') and cat != 'Co')  # 排除Cc/Cf/Cs/Cnexcept:return Falsedef return_meaningful_chars():# 遍历基本平面 (0-FFFF),跳过明显无效区meaningful_chars = []for code in range(0x10000):  # 仅BMP(已覆盖99%常用字符)char = chr(code)if is_meaningful(char):meaningful_chars.append(char)print(f"✅ 发现 {len(meaningful_chars)} 个有意义字符")print("示例:", ''.join(meaningful_chars[:100]))  # 输出前100个return meaningful_charsimport mathdef find_min_sum_integer(S):"""求解当 m*n = S 且 m,n,S 均为正整数时,m+n 的最小值参数:S (int): 正整数乘积值返回:tuple: (m, n, min_sum) 使 m*n=S 且 m+n 最小的 m, n 值及最小和"""if not isinstance(S, int) or S <= 0:raise ValueError("S 必须是正整数")# 初始化最小和为 S+1(最大可能和是 1+S)min_sum = S + 1best_pair = (1, S)# 遍历到 sqrt(S) 即可,因为因子成对出现sqrt_S = int(math.isqrt(S))for m in range(1, sqrt_S + 1):if S % m == 0:n = S // mcurrent_sum = m + nif current_sum < min_sum:min_sum = current_sumbest_pair = (m, n)return (best_pair[0], best_pair[1], min_sum)
def gen_voc():str_list = list(return_meaningful_chars())[:-1]S = len(return_meaningful_chars()) - 1m, n, min_sum = find_min_sum_integer(S)sqrt_S = math.sqrt(S)# 判断是否为完全平方数is_perfect_square = math.isclose(sqrt_S, int(sqrt_S))remark = "完全平方数" if is_perfect_square else f"最接近√S({sqrt_S:.2f})"print(f"{S:<5} | {m:<5} | {n:<5} | {min_sum:<5} | {m * n:<5} | {sqrt_S:<8.2f} | {remark}")voc = []voc_single_all_str = dict()for i in range(m):s = "s_{}".format(i)for j in range(n):e = "e_{}".format(j)voc_single_all_str[(s, e)] = str_list.pop()if s not in voc:voc.append(s)if e not in voc:voc.append(e)np.random.shuffle(voc)# 使用双token 表示所有 单个字符# 多个字符使用 单个token 表示 且最大的voc_data = pd.read_pickle("voc.pkl")voc_data = sorted(voc_data, key=lambda x: voc_data[x], reverse=False)voc += [i for i in voc_data if len(i) > 1][:5000]np.random.shuffle(voc)voc = ["<|pad|>", "<|im_start|>", "<|im_end|>", "<|think|>", "<|end_think|>", "<|user|>", "<|agent|>", "<|system|>","<|func|>", "<|args|>"] + voc# voc_single_all_str_new={ v:k for k,v in voc_single_all_str.items()}# mini_voc = {v: i for i, v in enumerate(voc)}voc_x2id = {v: i for i, v in enumerate(voc)}voc_single_all_str_new = {v: [voc_x2id.get(j, 0) for j in k] for k, v in voc_single_all_str.items()}voc_x2id.update(voc_single_all_str_new)voc_id2x = {tuple(v) if isinstance(v, list) else v : k for k, v in voc_x2id.items() }pd.to_pickle(voc_id2x, "voc_id2x.pkl")pd.to_pickle(voc_x2id, "voc_x2id.pkl")# 测试示例
if __name__ == "__main__":gen_voc()将上述代码分析 这样建立词表的优势并 写成博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93328.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93328.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93328.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python与物联网基础知识

软件准备&#xff1a;软件&#xff1a;thonny-4.0.1-windows-portable(win10,11系统64位)驱动&#xff1a;CP210x_Windows_Drivers固件&#xff1a;esp8266-1m-20220618-v1.19.1.bin物料准备&#xff1a;面包板、开发板、电源线一、安装与调试&#xff1a;1.在软件文件中找到th…

SVN提交服务器拒绝访问的问题

SVN提交服务器拒绝访问的问题 介绍 分析 1.服务器的SVN没有开启 2.服务器的网络端口除了问题没有开放端口 3.客户端的SVN配置除了问题刷新一下数据 4.客户端的SVN重装 找原因 1.初步以为是**防火墙**的问题 2.网络运营商的问题 总结 介绍 SVN相信大家都用过,今天反馈一个比较…

【Linux】库制作与原理

前言 本篇博客我们来认识下库方面的知识 &#x1f493; 个人主页&#xff1a;zkf ⏩ 文章专栏&#xff1a;Linux 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.什么是库 2.静态库 2.1静态库的生成 2.2静态库的使用 3.动态库 …

Android ADB 常用指令全解析

ADB&#xff08;Android Debug Bridge&#xff09;是 Android 开发和测试不可或缺的调试工具&#xff0c;它建立了电脑与 Android 设备之间的通信桥梁&#xff0c;通过命令行指令可实现对设备的全方位控制。掌握 ADB 指令能大幅提升开发效率&#xff0c;解决各类调试难题。本文…

使用 Rust 创建 32 位 DLL 的完整指南

使用 Rust 创建 32 位 DLL 的完整指南 在 Rust 中创建 32 位 DLL 需要特定的工具链配置和编译选项。以下是详细步骤和最佳实践&#xff1a; 环境准备 1. 安装 Rust 工具链 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 32 位目标 rustu…

算法基础 第3章 数据结构

1.单调栈 1.什么是单调栈 单调栈&#xff0c;即具有单调性的栈。 实现 #include <iostream> #include <stack> using namespace std; const int N 3e6 10; int a[N], n; void test1() {stack<int> st; // 维护⼀个单调递增的栈for(int i 1; i < n; i…

[机器学习]08-基于逻辑回归模型的鸢尾花数据集分类

使用sklearn的LogisticRegression多分类模型程序代码&#xff1a;import numpy as np from sklearn.linear_model import LogisticRegression import matplotlib.pyplot as plt import matplotlib as mpl from sklearn import datasets from sklearn import preprocessing impo…

【STM32入门教程】stm32简介

一、STM32简介二、ARM三、stm32f103c8t6四、命名规则五、系统结构六、引脚定义七、启动配置一般情况下&#xff0c;都是在flash开始程序&#xff0c;而启动程序也可以进行配置在其他地方启动程序&#xff0c;通过配置boot0和boot1来进行配置八、最小系统电路

SAE J2716多协议网关的硬件架构与实时协议转换机制解析

本文解析符合SAE J2716标准的工业级协议转换设备技术架构&#xff0c;通过拆解其四路双向SENT通道与多总线&#xff08;CANFD/Ethernet/USB&#xff09;的实时交互机制、MicroSD独立日志系统设计及模拟量动态映射方案&#xff0c;为汽车电子与工业通信开发者提供可复用的技术参…

VS2022+QT5.15.2+OCCT7.9.1的开发环境搭建流程

以下是VS2022 QT5.15.2 OCCT7.9.1开发环境搭建的完整流程&#xff1a; 一、安装Visual Studio 2022 下载安装程序 访问VS官网下载Community版安装组件 选择"使用C的桌面开发"工作负载勾选&#xff1a; MSVC v143 - VS 2022 C x64/x86生成工具Windows 10 SDK (建议…

数据库访问模式详解

数据库访问模式详解数据库访问模式是软件架构中数据访问层&#xff08;Data Access Layer&#xff09;设计的核心&#xff0c;它定义了应用程序如何与数据库进行交互的策略和方法。选择合适的访问模式对于系统的性能、可维护性、可扩展性、事务一致性和开发效率至关重要。不同的…

BGE向量算法

一、是什么 什么是BGE向量算法&#xff1f;先说说网上的概念吧。本文不讲解太深的算法知识&#xff0c;主要讲解如何用&#xff01; BGE&#xff08;BAAI General Embedding&#xff09;是北京智源研究院开源的“通用语义向量模型”。一句话&#xff1a;把中文或英文句子变成…

AI数据仓库的核心优势解析

内容概要本文旨在全面解析AI数据仓库的核心优势&#xff0c;为读者提供清晰的框架。文章首先从基础定义出发&#xff0c;探讨其如何高效整合多源数据&#xff0c;并支持人工智能与机器学习应用。随后&#xff0c;将详细阐述处理TB级数据的能力&#xff0c;包括兼容结构化和非结…

具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?

8月9日&#xff0c;在世界机器人大会的演讲台上&#xff0c;宇树科技创始人王兴兴谈论到目前机器人运动控制领域存在的RL Scaling Law问题&#xff0c;他认为现在的机器人在学习一项新的技能时&#xff0c;往往都是需要从头开始研究以及教学。而在未来更加希望的是能够在原有的…

【跨越 6G 安全、防御与智能协作:从APT检测到多模态通信再到AI代理语言革命】

跨越 6G 安全、防御与智能协作&#xff1a;从APT检测到多模态通信再到AI代理语言革命引言单篇总结**2. Integrated Multimodal Sensing and Communication: Challenges, Technologies, and Architectures****3. Why do AI agents communicate in human language?**引言 在迈向…

微前端-解决MicroApp微前端内存泄露问题

前言 之前使用京东微前端框架MicroApp集成10个微前端的页面到AngularJs的后台管理系统中&#xff0c;每个微前端做成一个菜单&#xff0c;一共10个&#xff0c;每次打开都是一个新的微前端&#xff0c;但是发现打开的微前端越多&#xff0c;容易造成内存泄露&#xff0c;下面讲…

线性代数 · 向量运算 | 叉乘 / 几何意义 / 推导

注&#xff1a;本文为 “线性代数 向量运算” 相关合辑。 图片清晰度受引文原图所限。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 数学基础 —— 向量运算&#xff08;叉乘&#xff09; keng_s 于 2016-08-05 17:17:57 发布 1_ 向量的叉乘 向量…

方法中只包含查询操作需要添加事务吗?

方法中只包含查询操作需要添加事务吗?绝大部分情况都不需要 是否需要为包含数据库查询操作的方法添加 @Transactional 注解,取决于业务需求和查询操作的特性,不能一概而论。以下是具体分析: 一、不需要添加 @Transactional 的常见场景 如果查询操作满足以下条件,通常不需…

MTK平台Wi-Fi学习--wifi channel 通过国家码进行功率限制和wifi eFEM 基本配置和wifi Tx SEM问题

一. 国家码可以用来限制功率上限,可以针对各国家实现By channel降功率的能力 可以通过country code来设置不同channel的power limit,操作方法如下: 在rlm_txpwr_init.h文件中g_rRlmPowerLimitConfiguration[]下添加需要限制功率的channel, 例如:国家码CN,信道:CH1,po…

MedGemma: 多模态医学文本与图像处理的创新模型

MedGemma: 多模态医学文本与图像处理的创新模型 今天&#xff0c;我有幸参加了在上海举行的Google 2025 I/O大会&#xff0c;这是一场充满创新与突破的技术盛宴。作为全球最具影响力的科技大会之一&#xff0c;Google I/O每年都会吸引来自世界各地的开发者、企业领袖以及科技爱…