diff --git a/README.md b/README.md index 839b496..73faa37 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ English | [简体中文](docs/README-zh-CN.md) | [繁體中文](docs/README-zh-T ## 📝 Description -This Rust implementation of the classic `tc` (token count) command-line tool allows you to count lines, words, and characters in text files or from standard input. It's fast, reliable, and supports Unicode! 🌍✨ +This Rust implementation of the classic `wc` (word count) command-line tool allows you to count lines, words, characters, and even tokens in text files or from standard input. It's fast, reliable, and supports Unicode! 🌍✨ ## 🎯 Features - Count lines 📏 - Count words 🔤 - Count characters (including multi-byte Unicode characters) 🔡 -- Count tokens (not ready yet) 🔤 +- Count tokens using various tokenizer models 🔢 - Process multiple files 📚 - Read from standard input 🖥️ - Supports various languages (English, Korean, Japanese, and more!) 🌐 @@ -42,8 +42,17 @@ This Rust implementation of the classic `tc` (token count) command-line tool all - `-l, --lines`: Show line count 📏 - `-w, --words`: Show word count 🔤 - `-c, --chars`: Show character count 🔡 +- `-t, --tokens`: Show token count 🔢 +- `--model `: Choose tokenizer model (default: gpt3) -If no options are specified, all counts (lines, words, and characters) will be shown. +Available models: +- `gpt3`: r50k_base +- `edit`: p50k_edit +- `code`: p50k_base +- `chatgpt`: cl100k_base +- `gpt4o`: o200k_base + +If no options are specified, all counts (lines, words, characters, and tokens) will be shown. ### Examples: @@ -59,10 +68,15 @@ If no options are specified, all counts (lines, words, and characters) will be s 3. Count lines and characters from standard input: ``` - echo "Hello, World!" | ./tc -l -c + echo "Hello, World!" | ./tc -lc + ``` + +4. Count tokens using the ChatGPT tokenizer: + ``` + ./tc -t --model chatgpt example.txt ``` -4. Count everything in files with different languages: +5. Count everything in files with different languages: ``` ./tc english.txt korean.txt japanese.txt ``` diff --git a/docs/README-ja-JP.md b/docs/README-ja-JP.md index e4a32f1..0851c92 100644 --- a/docs/README-ja-JP.md +++ b/docs/README-ja-JP.md @@ -42,8 +42,17 @@ Rustで書かれたシンプルで効率的なトークンカウントプログ - `-l, --lines`:行数を表示 📏 - `-w, --words`:単語数を表示 🔤 - `-c, --chars`:文字数を表示 🔡 +- `-t, --tokens`:トークン数を表示 🔢 +- `--model `:トークナイザーモデルを選択(デフォルト:gpt3) -オプションが指定されていない場合、すべてのカウント(行数、単語数、文字数)が表示されます。 +利用可能なモデル: +- `gpt3`: r50k_base +- `edit`: p50k_edit +- `code`: p50k_base +- `chatgpt`: cl100k_base +- `gpt4o`: o200k_base + +オプションが指定されていない場合、すべてのカウント(行数、単語数、文字数、トークン数)が表示されます。 ### 例: @@ -62,7 +71,12 @@ Rustで書かれたシンプルで効率的なトークンカウントプログ echo "こんにちは、世界!" | ./tc -l -c ``` -4. 異なる言語のファイルですべてをカウント: +4. ChatGPTトークナイザーを使用してトークン数をカウント: + ``` + ./tc -t --model chatgpt example.txt + ``` + +5. 異なる言語のファイルですべてをカウント: ``` ./tc english.txt korean.txt japanese.txt ``` diff --git a/docs/README-ko-KR.md b/docs/README-ko-KR.md index 5f1d490..bd7e6af 100644 --- a/docs/README-ko-KR.md +++ b/docs/README-ko-KR.md @@ -3,16 +3,17 @@ Rust로 작성된 간단하고 효율적인 토큰 카운트 프로그램입니다! 🚀 [English](../README.md) | [简体中文](README-zh-CN.md) | [繁體中文](README-zh-TW.md) | [日本語](README-ja-JP.md) | 한국어 | [Deutsch](README-de-DE.md) + ## 📝 설명 -이 Rust로 구현된 고전적인 `tc` (토큰 카운트) 명령줄 도구는 텍스트 파일이나 표준 입력에서 줄 수, 단어 수, 문자 수를 세는 기능을 제공합니다. 빠르고 안정적이며 유니코드를 지원합니다! 🌍✨ +이 Rust로 구현된 고전적인 `wc` (단어 수 세기) 명령줄 도구는 텍스트 파일이나 표준 입력에서 줄 수, 단어 수, 문자 수, 심지어 토큰 수까지 세는 기능을 제공합니다. 빠르고 안정적이며 유니코드를 지원합니다! 🌍✨ ## 🎯 기능 - 줄 수 세기 📏 - 단어 수 세기 🔤 - 문자 수 세기 (다중 바이트 유니코드 문자 포함) 🔡 -- 토큰 수 세기 (아직 준비되지 않음) 🔤 +- 다양한 토크나이저 모델을 사용한 토큰 수 세기 🔢 - 여러 파일 처리 📚 - 표준 입력에서 읽기 🖥️ - 다양한 언어 지원 (영어, 한국어, 일본어 등!) 🌐 @@ -41,8 +42,17 @@ Rust로 작성된 간단하고 효율적인 토큰 카운트 프로그램입니 - `-l, --lines`: 줄 수 표시 📏 - `-w, --words`: 단어 수 표시 🔤 - `-c, --chars`: 문자 수 표시 🔡 +- `-t, --tokens`: 토큰 수 표시 🔢 +- `--model `: 토크나이저 모델 선택 (기본값: gpt3) + +사용 가능한 모델: +- `gpt3`: r50k_base +- `edit`: p50k_edit +- `code`: p50k_base +- `chatgpt`: cl100k_base +- `gpt4o`: o200k_base -옵션을 지정하지 않으면 모든 수 (줄 수, 단어 수, 문자 수)가 표시됩니다. +옵션을 지정하지 않으면 모든 수 (줄 수, 단어 수, 문자 수, 토큰 수)가 표시됩니다. ### 예시: @@ -61,7 +71,12 @@ Rust로 작성된 간단하고 효율적인 토큰 카운트 프로그램입니 echo "안녕하세요, 세상!" | ./tc -l -c ``` -4. 다양한 언어로 된 파일의 모든 수 세기: +4. ChatGPT 토크나이저를 사용하여 토큰 수 세기: + ``` + ./tc -t --model chatgpt example.txt + ``` + +5. 다양한 언어로 된 파일의 모든 수 세기: ``` ./tc english.txt korean.txt japanese.txt ``` diff --git a/docs/README-zh-CN.md b/docs/README-zh-CN.md index 2f6aae0..dfcaee6 100644 --- a/docs/README-zh-CN.md +++ b/docs/README-zh-CN.md @@ -5,14 +5,14 @@ [English](../README.md) | 简体中文 | [繁體中文](README-zh-TW.md) | [日本語](README-ja-JP.md) | [한국어](README-ko-KR.md) | [Deutsch](README-de-DE.md) ## 📝 描述 -这个 Rust 实现的经典 `tc`(标记计数)命令行工具可以统计文本文件或标准输入中的行数、单词数和字符数。它快速、可靠,并且支持 Unicode!🌍✨ +这个 Rust 实现的经典 `wc`(字数统计)命令行工具可以统计文本文件或标准输入中的行数、单词数、字符数,甚至是标记数。它快速、可靠,并且支持 Unicode!🌍✨ ## 🎯 特性 - 统计行数 📏 - 统计单词数 🔤 - 统计字符数(包括多字节 Unicode 字符)🔡 -- 统计标记数(尚未准备就绪)🔤 +- 使用各种分词器模型统计标记数 🔢 - 处理多个文件 📚 - 从标准输入读取 🖥️ - 支持多种语言(英语、韩语、日语等)🌐 @@ -41,8 +41,17 @@ - `-l, --lines`:显示行数 📏 - `-w, --words`:显示单词数 🔤 - `-c, --chars`:显示字符数 🔡 +- `-t, --tokens`:显示标记数 🔢 +- `--model `:选择分词器模型(默认:gpt3) -如果未指定选项,将显示所有计数(行数、单词数和字符数)。 +可用模型: +- `gpt3`: r50k_base +- `edit`: p50k_edit +- `code`: p50k_base +- `chatgpt`: cl100k_base +- `gpt4o`: o200k_base + +如果未指定选项,将显示所有计数(行数、单词数、字符数和标记数)。 ### 示例: @@ -58,10 +67,15 @@ 3. 从标准输入统计行数和字符数: ``` - echo "你好,世界!" | ./tc -l -c + echo "你好,世界!" | ./tc -lc + ``` + +4. 使用 ChatGPT 分词器统计标记数: + ``` + ./tc -t --model chatgpt example.txt ``` -4. 统计不同语言文件中的所有内容: +5. 统计不同语言文件中的所有内容: ``` ./tc english.txt korean.txt japanese.txt ``` diff --git a/docs/README-zh-TW.md b/docs/README-zh-TW.md index 9ac6081..69a3677 100644 --- a/docs/README-zh-TW.md +++ b/docs/README-zh-TW.md @@ -6,14 +6,14 @@ ## 📝 描述 -這個 Rust 實現的經典 `tc`(標記計數)命令列工具可以統計文字檔案或標準輸入中的行數、單字數和字元數。它快速、可靠,並且支援 Unicode!🌍✨ +這個 Rust 實現的經典 `wc`(字數統計)命令列工具可以統計文字檔案或標準輸入中的行數、單字數、字元數,甚至是標記數。它快速、可靠,並且支援 Unicode!🌍✨ ## 🎯 特性 - 統計行數 📏 - 統計單字數 🔤 - 統計字元數(包括多位元組 Unicode 字元)🔡 -- 統計標記數(尚未準備就緒)🔤 +- 使用各種分詞器模型統計標記數 🔢 - 處理多個檔案 📚 - 從標準輸入讀取 🖥️ - 支援多種語言(英語、韓語、日語等)🌐 @@ -42,8 +42,17 @@ - `-l, --lines`:顯示行數 📏 - `-w, --words`:顯示單字數 🔤 - `-c, --chars`:顯示字元數 🔡 +- `-t, --tokens`:顯示標記數 🔢 +- `--model `:選擇分詞器模型(預設:gpt3) -如果未指定選項,將顯示所有計數(行數、單字數和字元數)。 +可用模型: +- `gpt3`: r50k_base +- `edit`: p50k_edit +- `code`: p50k_base +- `chatgpt`: cl100k_base +- `gpt4o`: o200k_base + +如果未指定選項,將顯示所有計數(行數、單字數、字元數和標記數)。 ### 範例: @@ -59,10 +68,15 @@ 3. 從標準輸入統計行數和字元數: ``` - echo "你好,世界!" | ./tc -l -c + echo "你好,世界!" | ./tc -lc + ``` + +4. 使用 ChatGPT 分詞器統計標記數: + ``` + ./tc -t --model chatgpt example.txt ``` -4. 統計不同語言檔案中的所有內容: +5. 統計不同語言檔案中的所有內容: ``` ./tc english.txt korean.txt japanese.txt ``` diff --git a/src/input_processor.rs b/src/input_processor.rs index 6c37279..11479e5 100644 --- a/src/input_processor.rs +++ b/src/input_processor.rs @@ -1,6 +1,6 @@ -use std::io::{self, Read, Write}; -use tiktoken_rs::{cl100k_base, p50k_base, p50k_edit, r50k_base, o200k_base}; use crate::cmd::TokenizerModel; +use std::io::{self, Read, Write}; +use tiktoken_rs::{cl100k_base, o200k_base, p50k_base, p50k_edit, r50k_base}; pub struct CountOptions { pub show_lines: bool, @@ -52,13 +52,14 @@ where output.push_str(&format!("{:8}", char_count)); } if options.show_tokens { - let token_count = match options.tokenizer_model { - TokenizerModel::GPT3 => r50k_base().unwrap().encode_ordinary(&buffer_string).len(), - TokenizerModel::Edit => p50k_edit().unwrap().encode_ordinary(&buffer_string).len(), - TokenizerModel::Code => p50k_base().unwrap().encode_ordinary(&buffer_string).len(), - TokenizerModel::ChatGPT => cl100k_base().unwrap().encode_ordinary(&buffer_string).len(), - TokenizerModel::GPT4O => o200k_base().unwrap().encode_ordinary(&buffer_string).len(), + let tokenizer = match options.tokenizer_model { + TokenizerModel::GPT3 => r50k_base().unwrap(), + TokenizerModel::Edit => p50k_edit().unwrap(), + TokenizerModel::Code => p50k_base().unwrap(), + TokenizerModel::ChatGPT => cl100k_base().unwrap(), + TokenizerModel::GPT4O => o200k_base().unwrap(), }; + let token_count = tokenizer.encode_ordinary(&buffer_string).len(); output.push_str(&format!("{:8}", token_count)); }