Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于自训tokenizer的问题 #109

Closed
Harris-Xie opened this issue Jan 8, 2025 · 5 comments
Closed

关于自训tokenizer的问题 #109

Harris-Xie opened this issue Jan 8, 2025 · 5 comments

Comments

@Harris-Xie
Copy link

想问下tokenizer_train的jsonl文件里为什么不用中文呢,这样不会导致中文编码效率过低的问题嘛?

@jingyaogong
Copy link
Owner

你可能指的是Unicode字符吧

import json

def is_chinese(char):
    return any([
        '\u4e00' <= char <= '\u9fff',
        '\u3400' <= char <= '\u4dbf',
        '\u20000' <= char <= '\u2a6df',
        '\u2a700' <= char <= '\u2b73f',
        '\u2b740' <= char <= '\u2b81f',
        '\u2b820' <= char <= '\u2ceaf',
        '\uF900' <= char <= '\uFAFF',
        '\u2F800' <= char <= '\u2fa1f'
    ])

def calculate_chinese_ratio(file_path):
    total_chars = 0
    chinese_chars = 0

    with open(file_path, 'r', encoding='utf-8') as f:
        for line_num, line in enumerate(f, 1):
            try:
                data = json.loads(line)
                text = data.get("text", "")
                for char in text:
                    total_chars += 1
                    if is_chinese(char):
                        chinese_chars += 1
            except json.JSONDecodeError as e:
                print(f"第 {line_num} 行解析错误: {e}")
                continue

    if total_chars == 0:
        print("文本中没有任何字符。")
        return

    ratio = chinese_chars / total_chars
    percentage = ratio * 100
    print(f"总字符数: {total_chars}")
    print(f"中文字符数: {chinese_chars}")
    print(f"中文字符占比: {percentage:.2f}%")

if __name__ == "__main__":
    file_path = 'dataset/tokenizer_train.jsonl'
    calculate_chinese_ratio(file_path)

可以看到

总字符数: 529542413
中文字符数: 88237440
中文字符占比: 16.66%

@jingyaogong
Copy link
Owner

more
这个issue:#111 的回答可能可以补充你的疑问

@Harris-Xie
Copy link
Author

Harris-Xie commented Jan 9, 2025 via email

@David-19940718
Copy link

@jingyaogong 作者你好,请问下这里训练分词器的数据处理成 Unicode 字符的用意是什么?另外常规来说,分词器训练数据集是不是和预训练数据集用的是同一份?

@jingyaogong
Copy link
Owner

@jingyaogong 作者你好,请问下这里训练分词器的数据处理成 Unicode 字符的用意是什么?另外常规来说,分词器训练数据集是不是和预训练数据集用的是同一份?

你好,第一个问题比较通用,我直接贴一下GPT4的回复:


背景:

Unicode 是一种通用字符编码标准,涵盖了世界上几乎所有的语言和符号。每个字符在 Unicode 中都有唯一的编号(称为码点,Code Point)。例如:

  • 英文字母 A 的 Unicode 码点是 U+0041
  • 汉字 的 Unicode 码点是 U+4E00

用意:

将文本处理成 Unicode 字符的主要原因包括以下几点:

  1. 统一表示:
    不同语言的文字系统(如拉丁字母、汉字、日文假名等)都可以通过 Unicode 表示。这样可以避免因编码方式不同而导致的兼容性问题。例如,ASCII 编码只能表示英文字符,而 Unicode 可以表示全球范围内的字符。

  2. 支持多语言:
    大型语言模型通常需要支持多种语言。使用 Unicode 字符作为基础单元,可以方便地处理跨语言的任务。例如,一个分词器可以同时处理英文、中文、法语等多种语言的文本。

  3. 字符级粒度:
    在某些分词器(如 BPE 或 SentencePiece)中,字符是最小的分割单位。Unicode 提供了统一的字符表示方法,使得分词器可以基于字符进行分割和合并操作。例如,BPE(Byte Pair Encoding)算法会从字符级别开始逐步学习子词(subword)单元。

  4. 处理特殊字符:
    Unicode 包含了许多特殊字符(如表情符号、标点符号等),这些字符在现代文本中非常常见。通过直接使用 Unicode,分词器可以更好地处理这些特殊字符,而不会遗漏或错误解析。

  5. 与预训练模型的兼容性:
    许多现代语言模型(如 GPT、BERT)的分词器都基于 Unicode 字符设计。这种设计确保了分词器能够生成与模型输入格式一致的 token 序列。

实际应用:

例如,SentencePiece 分词器会将文本先转换为 Unicode 字符序列,然后基于这些字符进行子词分割。这种方式特别适合处理没有明确单词边界的语言(如中文、日文)。


2. 分词器训练数据集是否和预训练数据集是同一份?

用的是sft的数据,用什么其实不是很重要

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants