You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenRefine如何按word/token数拆分长文本单元格?

太棒的问题了——按固定字符长度拆分确实容易把单词拦腰截断,完全破坏Token的完整性,这对后续MALLET的文档分类肯定会有影响。别担心,我们可以用OpenRefine自带的GREL(General Refine Expression Language)完美解决按单词/Token数量拆分文本的需求,而且不会拆分单个单词。下面是一步步的实现方案:

步骤1:先备份原始数据(可选但强烈推荐)

为了避免误操作破坏原始长文本,先给目标列创建一个副本:

  • 点击长文本列的下拉菜单 → Edit column → Add column based on this column
  • 给新列起个清晰的名字,比如Split Text by 1000 Tokens,暂时不用填表达式,先点确定创建列。
步骤2:用GREL表达式实现按Token拆分

点击新创建的列的下拉菜单 → Edit cells → Transform,在表达式输入框里粘贴以下代码:

join(
  forEach(
    partition(split(value, /\s+/), 1000),
    group -> join(group, " ")
  ),
  "||"
)

表达式逐行解释:

  • split(value, /\s+/):把当前单元格的文本按任意空白字符(空格、换行、制表符等)拆分成独立的单词数组,每个元素就是一个完整的Token,从根源上避免拆分单词。
  • partition(..., 1000):把拆分好的单词数组按每1000个单词为一组,分割成多个子数组。
  • forEach(..., group -> join(group, " ")):遍历每个子数组,把里面的单词重新用空格拼接成完整的文本片段。
  • join(..., "||"):把所有文本片段用||分隔符拼接成一个字符串,方便后续转成多值单元格。
步骤3:转成多值单元格

表达式执行完成后,新列里的内容会是用||分隔的多个文本片段。接下来把它们拆分成独立的单元格:

  • 点击新列的下拉菜单 → Edit cells → Split multi-valued cells
  • 在弹出的窗口里,把分隔符设为||,然后点击确定。

拆分完成后,原来的一行数据会变成多行,每行对应一个不超过1000个Token的文本片段,且所有单词都是完整的。

额外优化方案(按需选择)

如果你的文本里存在标点和单词连在一起的情况(比如hello,或者world!),或者需要更精准的Token拆分逻辑,可以调整拆分的正则表达式:

  • 若想保留标点但拆分Token:继续用/\s+/,它会把hello,当作一个完整的Token,适合大多数文本分类场景。
  • 若想把标点和单词分开(仅适合英文文本):可以把拆分正则改成/\W+/,但这样会去掉标点,需要根据你的语料库需求决定。
验证结果

最后可以随机抽查几个拆分后的片段,用OpenRefine的length(split(value, /\s+/))表达式查看Token数量,确认都在1000左右,且没有被拆分的单词。

内容的提问来源于stack exchange,提问作者DFM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:57:40