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

Ruby如何将无换行通话转录字符串解析为指定结构的哈希数组

通话转录文本转哈希数组解决方案

核心思路

利用正则的捕获分组和正向预查特性,直接匹配每一组「发言者+发言内容」的组合,不需要手动拆分后再两两组合,逻辑更直观,兼容性也更好。

优化后实现代码(Ruby)

def parse_transcript(raw_transcript)
  # 正则匹配每一组发言者和对应内容
  raw_transcript.scan(/([A-Z][\w\s]*):\s*(.*?)(?=\s*[A-Z][\w\s]*:|$)/).map do |speaker, content|
    { speaker: speaker.strip, content: content.strip }
  end
end

正则规则说明

  • 第一个捕获组([A-Z][\w\s]*):匹配发言者名称,默认大写字母开头,支持带空格的多字名称,适配中文名拼音、带中间名的英文名等场景
  • :\s*:匹配发言者名称后的冒号以及冒号后的空白字符
  • 第二个捕获组(.*?):非贪婪匹配发言内容,避免把下一位发言者的名称包含进来
  • 正向预查(?=\s*[A-Z][\w\s]*:|$):设定内容匹配的终止边界,匹配到下一位发言者的开头(大写开头+冒号)或者整个字符串末尾就停止当前内容的匹配

测试效果

输入示例字符串:

"Operator: Hi, please welcome Bob Smith to the call. Bob Smith: Hello there, thank you for inviting me...Now I will turn the call over to Stacy. Stacy White: Thanks Bob. As he was saying...."

调用方法后返回结果:

[
  {:speaker=>"Operator", :content=>"Hi, please welcome Bob Smith to the call."},
  {:speaker=>"Bob Smith", :content=>"Hello there, thank you for inviting me...Now I will turn the call over to Stacy."},
  {:speaker=>"Stacy White", :content=>"Thanks Bob. As he was saying...."}
]

原实现可优化点

你分享的基于split的实现逻辑是可行的,但是原正则\W*([A-Z]\w*\W*\w+):\W*仅支持最多2个单词的发言者名称,遇到3字及以上的名称(比如Mary Ann Jones)、带特殊字符的名称(比如Anne-Marie O'Conner)会匹配失败,使用scan+正向预查的方案可以覆盖更多场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:36:03