目前,我正在尝试为我在python3中的机器学习任务准备一些文本。
输入数据是单个长字符串,具有以下格式:
<SPEAKER gender="female" id="1" name="unknown"> sentence_1. sentence_2? ... sentence_n, </SPEAKER><SPEAKER gender="male" id="2" name="unknown"> sentence_1. sentence_2? ... sentence_n </SPEAKER><SPEAKER gender="female" id="1" name="unknown"> sentence_1. sentence_2? ... sentence_n; </SPEAKER> ...
它由多个";文本块";,以标签开始CCD_ 1并以标签结束CCD_。正如您所看到的,有时块中的最后一个句子(sentence_n(缺少句号.
,或者句子以逗号,
或分号;
结尾。
当前的问题是,当我清理提供的字符串并删除标签时,块的最后一句话(sentence_n(和下一个块的第一句话(sentence_1(会合并。我只是想避免这种情况。我希望句子以标点符号结尾,以便能够在稍后的文本预处理步骤中按句子分割整个字符串。
因此,我想检查每个块和的最后一句(sentence_n(的最后一个字符
- 如果缺少句号,则添加句号
- 用句号替换逗号或分号
- 如果一个句号已经存在,就保留它
非常感谢您!
第1版:它不一定是正则表达式解决方案。由于我处理了成千上万个这样的字符串,所以性能仍然很重要。
第2版:指定问题。
您确实可以使用正则表达式:
import re
s = re.sub(r"([;,.])?(s*</SPEAKER>)", r".2", s)
当;
、,
或.
是标签中的最后一个非空白字符时,它会捕获它,或者——如果不可能——在应该出现该点的位置捕获空字符串。在任何一种情况下,它都会用一个点来替换该捕获。
然后应用您的解决方案来移除标签。