【问题标题】:Regex in R for capturing words spoken by a particular speaker from conversational textR 中的正则表达式,用于从会话文本中捕获特定说话者所说的单词
【发布时间】: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),以便我的第二种方法可以更好地工作?

非常感谢

【问题讨论】:

    标签: r regex text


    【解决方案1】:

    regmatches 用于基本R 解决方案,我们可以尝试匹配来自MR ARMSTRONG 的所有文本,直到下一个两个单词名称标题或字符串末尾(Armstrong 应该是最后一个条目)。

    regmatches(txt, gregexpr("\\bMR ARMSTRONG[\\s\\S]*?(?=[A-Z]+ [A-Z]+|$)", txt, perl=TRUE))[[1]]
    
    [1] "MR ARMSTRONG (in English): Hi Nice to meet you. "                                                          
    [2] "MR ARMSTRONG (in English): I concur. There is no better time to talk about this. "                         
    [3] "MR ARMSTRONG (in English): Absolutely agree. We should spend more time on discussing potential solutions. "
    

    数据:

    txt <- "MR ARMSTRONG (in English): Hi Nice to meet you. PROF FLYNN (in English): I would like to talk about global warming today. MR ARMSTRONG (in English): I concur. There is no better time to talk about this. MRS CRUZ (in English): Good idea. Global warming is an alarming issue. MS PAMELA (in English): Absolutely. MR ARMSTRONG (in English): Absolutely agree. We should spend more time on discussing potential solutions. MS HENDERSON (in English): First of all, the international community should take action."
    

    【讨论】:

    • 非常感谢。您介意解释一下模式的这一部分发生了什么吗 (?=[A-Z]+ [A-Z]+|$)?抱歉,我对正则匹配不太熟悉。
    • @newabnormal 您上面提到的正则表达式的部分表示 向前看 并断言接下来是 两个 所有大写单词(即下一个名称)是输入的结尾。
    • 感谢您的回复。非常感激。正如我在问题中所说,上面示例文本之外的一些名称长度不同。而不是 FLYNN 教授(英文),它可能是像 SECRETARY OF STATE(英文)和 MR FOSU-MENSAH 这样的名字。我正在努力寻找与全名完全匹配的正则表达式。否则,捕获的文本可能包含下一位发言者的部分姓名。
    • Otherwise the captured text might include part of the name of the next speaker ... 不,捕获的不会包含下一位发言者的姓名,因为(?= ...)匹配 ,而只是 asserts (阅读:检查)名称后面。只要你所有的名字都至少有两个全大写的组成部分,我的回答在这里应该是可靠的。
    【解决方案2】:

    如果您想要提取所有相关参与者的演讲,您可以使用这个:

    strsplit(sample_text, " (?=\\w+ \\w+ \\(in English\\):)", perl=T)
    
    [[1]]
    [1] "MR ARMSTRONG (in English): Hi Nice to meet you."
    [2] "PROF FLYNN (in English): I would like to talk about global warming today."
    [3] "MR ARMSTRONG (in English): I concur. There is no better time to talk about this."
    [4] "MRS CRUZ (in English): Good idea. Global warming is an alarming issue."
    [5] "MS PAMELA (in English): Absolutely."
    [6] "MR ARMSTRONG (in English): Absolutely agree. We should spend more time on discussing potential solutions."
    [7] "MS HENDERSON (in English): First of all, the international community should take action."
    

    它由一个空格分隔,后跟一个或多个单词字符 (\\w+)、一个空格 ((?=…))、一个空格、一个或多个单词字符和“(英文):”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多