> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 按令牌分割 - 文本分割器集成指南

语言模型有令牌限制。您不应超出令牌限制。因此，当您[将文本分割](/oss/python/integrations/splitters/)成块时，计算令牌数量是一个好主意。有许多分词器。当您计算文本中的令牌时，应使用与语言模型中相同的分词器。

## tiktoken

<Note>
  **[tiktoken](https://github.com/openai/tiktoken) 是由 `OpenAI` 创建的快速 `BPE` 分词器。**
</Note>

我们可以使用 `tiktoken` 来估算使用的令牌数。对于 OpenAI 模型，它可能更准确。

1. 文本如何分割：按传入的字符分割。
2. 块大小如何衡量：由 `tiktoken` 分词器衡量。

[CharacterTextSplitter](https://reference.langchain.com/python/langchain-text-splitters/character/CharacterTextSplitter)、[RecursiveCharacterTextSplitter](https://reference.langchain.com/python/langchain-text-splitters/character/RecursiveCharacterTextSplitter) 和 [TokenTextSplitter](https://reference.langchain.com/python/langchain-text-splitters/base/TokenTextSplitter) 可以直接与 `tiktoken` 一起使用。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
pip install --upgrade --quiet langchain-text-splitters tiktoken
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import CharacterTextSplitter

# 这是一个我们可以分割的长文档。
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()
```

要使用 [CharacterTextSplitter](https://reference.langchain.com/python/langchain-text-splitters/character/CharacterTextSplitter) 进行分割，然后使用 `tiktoken` 合并块，请使用其 `.from_tiktoken_encoder()` 方法。请注意，此方法产生的分割可能大于 `tiktoken` 分词器衡量的块大小。

`.from_tiktoken_encoder()` 方法接受 `encoding_name` 作为参数（例如 `cl100k_base`），或 `model_name`（例如 `gpt-4`）。所有其他参数如 `chunk_size`、`chunk_overlap` 和 `separators` 用于实例化 `CharacterTextSplitter`：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
议长女士、副总统女士、我们的第一夫人和第二先生。国会议员和内阁成员。最高法院大法官。我的美国同胞们。

去年，COVID-19 让我们分离。今年，我们终于再次相聚。

今晚，我们作为民主党人、共和党人和独立人士相聚。但最重要的是，作为美国人。

我们彼此之间、对美国人民、对宪法负有责任。
```

为了对块大小实施硬性约束，我们可以使用 `RecursiveCharacterTextSplitter.from_tiktoken_encoder`，如果分割的大小较大，它将递归地进行分割：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    model_name="gpt-4",
    chunk_size=100,
    chunk_overlap=0,
)
```

我们也可以加载 `TokenTextSplitter` 分割器，它直接与 `tiktoken` 一起工作，并确保每个分割都小于块大小。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import TokenTextSplitter

text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)

texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
议长女士、副总统女士、我们的
```

一些书面语言（例如中文和日文）的字符会编码为两个或更多令牌。直接使用 `TokenTextSplitter` 可能会将一个字符的令牌分割到两个块中，导致 Unicode 字符格式错误。请使用 `RecursiveCharacterTextSplitter.from_tiktoken_encoder` 或 `CharacterTextSplitter.from_tiktoken_encoder` 以确保块包含有效的 Unicode 字符串。

## spaCy

<Note>
  [spaCy](https://spacy.io/) 是一个用于高级自然语言处理的开源软件库，使用 Python 和 Cython 编程语言编写。
</Note>

LangChain 实现了基于 [spaCy 分词器](https://spacy.io/api/tokenizer) 的分割器。

1. 文本如何分割：由 `spaCy` 分词器分割。
2. 块大小如何衡量：按字符数衡量。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
pip install --upgrade --quiet  spacy
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 这是一个我们可以分割的长文档。
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import SpacyTextSplitter

text_splitter = SpacyTextSplitter(chunk_size=1000)

texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
议长女士、副总统女士、我们的第一夫人和第二先生。

国会议员和内阁成员。

最高法院大法官。

我的美国同胞们。



去年，COVID-19 让我们分离。

今年，我们终于再次相聚。



今晚，我们作为民主党人、共和党人和独立人士相聚。

但最重要的是，作为美国人。



我们彼此之间、对美国人民、对宪法负有责任。



并且我们坚定不移地决心，自由将永远战胜暴政。



六天前，俄罗斯的弗拉基米尔·普京试图动摇自由世界的根基，认为他可以使其屈服于他险恶的方式。

但他严重误判了。



他认为他可以入侵乌克兰，世界会屈服。

相反，他遇到了一堵他从未想象过的力量之墙。



他遇到了乌克兰人民。



从泽连斯基总统到每一位乌克兰人，他们的无畏、他们的勇气、他们的决心，激励着世界。
```

## SentenceTransformers

[`SentenceTransformersTokenTextSplitter`](https://reference.langchain.com/python/langchain-text-splitters/sentence_transformers/SentenceTransformersTokenTextSplitter) 是一个专门用于 sentence-transformer 模型的文本分割器。默认行为是将文本分割成适合您想使用的 sentence transformer 模型令牌窗口的块。

要根据 sentence-transformers 分词器分割文本并约束令牌数量，请实例化 `SentenceTransformersTokenTextSplitter`。您可以选择指定：

* `chunk_overlap`：令牌重叠的整数计数；
* `model_name`：sentence-transformer 模型名称，默认为 `"sentence-transformers/all-mpnet-base-v2"`；
* `tokens_per_chunk`：每个块的期望令牌数。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import SentenceTransformersTokenTextSplitter

splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=0)
text = "Lorem "

count_start_and_stop_tokens = 2
text_token_count = splitter.count_tokens(text=text) - count_start_and_stop_tokens
print(text_token_count)
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
2
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
token_multiplier = splitter.maximum_tokens_per_chunk // text_token_count + 1

# `text_to_split` 不适合放在单个块中
text_to_split = text * token_multiplier

print(f"tokens in text to split: {splitter.count_tokens(text=text_to_split)}")
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
tokens in text to split: 514
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
text_chunks = splitter.split_text(text=text_to_split)

print(text_chunks[1])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
lorem
```

## NLTK

<Note>
  **[自然语言工具包](https://en.wikipedia.org/wiki/Natural_Language_Toolkit)，或更常见的 [NLTK](https://www.nltk.org/)，是一套用于英语符号和统计自然语言处理（NLP）的库和程序，使用 Python 编程语言编写。**
</Note>

我们可以使用 `NLTK` 基于 [NLTK 分词器](https://www.nltk.org/api/nltk.tokenize.html) 进行分割，而不仅仅是按 "\n\n" 分割。

1. 文本如何分割：由 `NLTK` 分词器分割。
2. 块大小如何衡量：按字符数衡量。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# pip install nltk
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 这是一个我们可以分割的长文档。
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import NLTKTextSplitter

text_splitter = NLTKTextSplitter(chunk_size=1000)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
议长女士、副总统女士、我们的第一夫人和第二先生。

国会议员和内阁成员。

最高法院大法官。

我的美国同胞们。

去年，COVID-19 让我们分离。

今年，我们终于再次相聚。

今晚，我们作为民主党人、共和党人和独立人士相聚。

但最重要的是，作为美国人。

我们彼此之间、对美国人民、对宪法负有责任。

并且我们坚定不移地决心，自由将永远战胜暴政。

六天前，俄罗斯的弗拉基米尔·普京试图动摇自由世界的根基，认为他可以使其屈服于他险恶的方式。

但他严重误判了。

他认为他可以入侵乌克兰，世界会屈服。

相反，他遇到了一堵他从未想象过的力量之墙。

他遇到了乌克兰人民。

从泽连斯基总统到每一位乌克兰人，他们的无畏、他们的勇气、他们的决心，激励着世界。

市民们用身体阻挡坦克。
```

## KoNLPY

<Note>
  [KoNLPy：Python 中的韩语 NLP](https://konlpy.org/en/latest/) 是一个用于韩语自然语言处理（NLP）的 Python 包。
</Note>

令牌分割涉及将文本分割成称为令牌的更小、更易于管理的单元。这些令牌通常是单词、短语、符号或其他对进一步处理和分析至关重要的有意义元素。在英语等语言中，令牌分割通常涉及按空格和标点符号分隔单词。令牌分割的有效性在很大程度上取决于分词器对语言结构的理解，以确保生成有意义的令牌。由于为英语设计的分词器不具备理解其他语言（如韩语）独特语义结构的能力，因此它们不能有效地用于韩语处理。

### 使用 KoNLPy 的 kkma 分析器进行韩语令牌分割

对于韩语文本，KoNLPY 包含一个名为 `Kkma`（韩语知识语素分析器）的形态分析器。`Kkma` 提供韩语文本的详细形态分析。它将句子分解为单词，将单词分解为各自的语素，并为每个令牌识别词性。它可以将一段文本分割成单个句子，这对于处理长文本特别有用。

### 使用注意事项

虽然 `Kkma` 以其详细分析而闻名，但需要注意的是，这种精确性可能会影响处理速度。因此，`Kkma` 最适合分析深度优先于快速文本处理的应用程序。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# pip install konlpy
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 这是一个我们想要分割成组成句子的长韩语文档。
with open("./your_korean_doc.txt") as f:
    korean_document = f.read()
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import KonlpyTextSplitter

text_splitter = KonlpyTextSplitter()
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
texts = text_splitter.split_text(korean_document)
# 句子用 "\n\n" 字符分割。
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
春香传 从前在南原有一个叫李道令的官吏的儿子。

他的外貌像明亮的月亮一样英俊，他的学识和技艺超群。

另一方面，这个村子里住着一位绝世佳人，名叫春香。

春香的美貌如花，深受村民们的喜爱。

某个春日，李道令和朋友们出去玩，遇到了春香，一见钟情。

两人相爱了，很快交换了秘密的爱情誓言。

但好景不长。

李道令的父亲被调任到其他地方，李道令也必须离开。

在离别的痛苦中，两人约定重逢，彼此信任并等待。

然而，新上任的官府使道贪图春香的美貌，开始强迫她。

春香为了守护对李道令的爱，坚决拒绝了使道的要求。

愤怒的使道将春香关进监狱，并施以严酷的刑罚。

故事以李道令升任高官后，救出春香结束。

两人历经漫长考验后重逢，他们的爱情传遍世界，流传后世。

- 春香传 (The Tale of Chunhyang)
```

## Hugging Face 分词器

[Hugging Face](https://huggingface.co/docs/tokenizers/index) 有许多分词器。

我们使用 Hugging Face 分词器 [GPT2TokenizerFast](https://huggingface.co/Ransaka/gpt2-tokenizer-fast) 来计算文本长度（以令牌为单位）。

1. 文本如何分割：按传入的字符分割。
2. 块大小如何衡量：由 `Hugging Face` 分词器计算的令牌数衡量。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from transformers import GPT2TokenizerFast

tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 这是一个我们可以分割的长文档。
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()
from langchain_text_splitters import CharacterTextSplitter
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
    tokenizer, chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(texts[0])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
议长女士、副总统女士、我们的第一夫人和第二先生。国会议员和内阁成员。最高法院大法官。我的美国同胞们。

去年，COVID-19 让我们分离。今年，我们终于再次相聚。

今晚，我们作为民主党人、共和党人和独立人士相聚。但最重要的是，作为美国人。

我们彼此之间、对美国人民、对宪法负有责任。
```

***

<div className="source-links">
  <Callout icon="terminal-2">
    [将这些文档连接](/use-these-docs)到 Claude、VSCode 等，通过 MCP 获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在 GitHub 上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/oss/integrations/splitters/split_by_token.mdx) 或 [提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
