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
相关产品推荐
相关产品推荐

