【发布时间】:2021-09-04 13:10:34
【问题描述】:
我正在使用以下结构化文本。
阿姆斯壮先生(英文):嗨,很高兴认识你。弗林教授(英语):今天我想谈谈全球变暖。阿姆斯特朗先生(英语):我同意。现在是谈论这个的最佳时机。克鲁兹夫人(英语):好主意。全球变暖是一个令人担忧的问题。 MS PAMELA(英语):当然。阿姆斯特朗先生(英语):完全同意。我们应该花更多时间讨论潜在的解决方案。 MS HENDERSON(英文):首先,国际社会应该采取行动。
我想使用正则表达式提取各个参与者的演讲。假设让我们在这里关注 MR ARMSTRONG。
我想要的输出如下:
阿姆斯特朗先生(英文):您好,很高兴 遇见你。阿姆斯特朗先生(英语):我同意。没有更好的 是时候谈谈这个了。阿姆斯特朗先生(英语):完全同意。 我们应该花更多时间讨论潜在的解决方案。
我能想到的是:我知道对话中所有参与者的姓名。因此,我可以使用正则表达式来参考标题和“(英文)”。
代码如下:
Armstrong <- str_extract_all(sample_text,
'MR ARMSTRONG \\(in\\s\\w+\\)\\:.*?(?=MRS\\s\\w+\\s\\(in\\s\\w+\\):)| MR ARMSTRONG \\(in\\s\\w+\\)\\:.*?(?=PROF\\s\\w+\\s\\(in\\s\\w+\\):)| MR ARMSTRONG \\(in\\s\\w+\\)\\:.*?(?=MS\\s\\w+\\s\\(in\\s\\w+\\):)')
但是OR逻辑运算符''|''似乎存在一些问题。如果我将 MRS 放在 PROF 和 MS 之前(如上面的模式),那么输出将包括 PROF FLYNN 所说的内容。
输出:“阿姆斯特朗先生(英文):嗨,很高兴认识你。弗林教授 (英语):今天我想谈谈全球变暖。先生 阿姆斯特朗(英语):我同意。没有比这更好的谈话时间了 对这个。 "
我能想到的另一种方法是在“(英语)”之前捕获大写字母的常规模式。
Armstrong_anothermethod <- str_extract_all(sample_text,'MR ARMSTRONG \\(in\\s\\w+\\)\\:.*?(?=[A-Z]\\s\\(in\\s\\w+\\):)')
输出如下:
[[1]] [1] “阿姆斯特朗先生(英文):嗨,很高兴见到你。弗林教授” [2]“阿姆斯特朗先生(英文):我同意。没有比这更好的时机了 谈谈这个。 MRS CRU" [3] "MR ARMSTRONG (英文): 绝对 同意。我们应该花更多时间讨论潜在的解决方案。小姐 亨德索”
问题是我不知道如何预测并因此摆脱在 MR ARMSTRONG 之后的下一位演讲者的名字。这样做可能很困难,因为名称的长度不规则。而文本只占我要处理的整个文本的一小部分。尽管大写并遵循相同的模式,但还有更多名称难以被正则表达式捕获,例如 [A-Z]{1,10)。
有人可以就我应该使用的逻辑运算符提出建议,或者有什么方法可以匹配所有大写字母的单词(例如 PROF FLYNN),以便我的第二种方法可以更好地工作?
非常感谢
【问题讨论】: