1

我正在使用语音转文本应用程序,它提供转录文件作为输出。转录的文本包含一些标签,如(s)(用于句子开头).. (/s)(用于句子结尾).. (VOCAL_NOISE)(用于无法识别的单词).. 但是文本还包含不需要的标签,如(VOCAL_N), (VOCAL_NOISED), (VOCAL_SOUND), (UNKNOWN).. 我正在使用 SED 处理文本.. 但无法编写适当的正则表达式来替换除(s),(/s)(VOCAL_NOISE), 之外的所有其他标签~NS.. 如果有人可以帮助我,我将不胜感激它..

示例文本:

(s) Hi Stacey , this is Stanley (/s) (s) I would (VOCAL_N) appreciate if you could call (UNKNOWN) and let him know I want an appointment (VOCAL_NOISE) with him (/s)

输出应该是:

(s) Hi Stacey , this is Stanley (/s) (s) I would ~NS appreciate if you could call ~NS and let him know I want an appointment (VOCAL_NOISE) with him (/s)
4

5 回答 5

1

这是一个远非最佳的肮脏技巧,但它应该对您有用:

sed ' 
    s|(\(/\?\)s)|[\1AAA]|g; 
    s|(VOCAL_NOISE)|[BBB]|g; 

    s/([^)]*)/~NS/g; 

    s|\[\(/\?\)AAA\]|(\1s)|g; 
    s|\[BBB\]|(VOCAL_NOISE)|g'

诀窍是将 (s)、(/s) 和 (VOCAL_NOISE) 替换为输入文本中不存在的模式(在本例中为 [AAA]、[/AAA] 和 [BBB]);然后我们用 ~NS 替换 (.*) 的每个实例;最后,我们将假模式恢复到其原始值。

于 2011-01-17T12:59:18.077 回答
1

这应该照顾它:

sed 's|([^)]*)|\n&\n|g;s@\n\((/\?s)\|(VOCAL_NOISE)\)\n@\1@g;s|\n\(([^)]*)\)\n|~NS|g' inputfile

解释:

  • s|([^)]*)|\n&\n|g- 通过将每个带括号的字符串放在两个换行符之间来划分行
  • s@\n\((/\?s)\|(VOCAL_NOISE)\)\n@\1@g- 删除“(s)”、“(/s)”和
    “(VOCAL_NOISE)”周围的换行符(守门员)
  • s|\n\(([^)]*)\)\n|~NS|g- 用“~NS”替换括号内的换行符之间的任何其他内容

这是有效的,因为换行符保证不会出现在新阅读的文本行中。

编辑:使用交替缩短命令\(foo\|bar\)

以前的版本:

    sed 's|([^)]*)|\n&\n|g;s|\n\((/\?s)\)\n|\1|g; s|\n\((VOCAL_NOISE)\)\n|\1|g;s|\n\(([^)]*)\)\n|~NS|g' inputfile

于 2011-01-17T16:01:24.317 回答
0

就这个?

sed -E 's/\((VOCAL_N|UNKNOWN)\)/~NS/'

在这种情况下,您将拥有一个黑名单(您知道要过滤掉什么)。或者你绝对需要一个白名单(你知道什么不能过滤掉)?

于 2011-01-17T12:22:33.847 回答
0
awk -vRS=")" -vFS="(" '$2!~/s|\\s|VOCAL_NOISE/{$2="~NS"}RT' ORS=")"  file |sed 's/~NS)/~NS/g'
于 2011-01-17T12:47:16.483 回答
0

我可以建议使用 vim:

:%s/\((\w\+)\)\&\(\((s)\|(VOCAL_NOISE)\)\@!\)/\~NS/g

使用 shell (bash),您可以执行以下操作:

vim file -c '%s/\((\w\+)\)\&\(\((s)\|(VOCAL_NOISE)\)\@!\)/\~NS/g' -c "wq"

请先备份,如有错误,我概不负责。

于 2011-01-17T12:16:36.160 回答