首页 > 解决方案 > 如何用大写字母模式分割文本/字符串?

问题描述

我正在寻找根据每个对话者拆分文本。

原文有这种形式:

这是一个语音文本。第一人称:大家好,谢谢您的光临。第二人:谢谢你邀请我们。TERCER PERSONA QUE SE LLAMA PEDRO:酱油。CUARTA PERSONA(约翰):嗨。你好吗

我正在寻找这样的最终结果:

第一栏:第一人称 |第二人称 | TERCER PERSONA QUE SE LLAMA PEDRO | CUARTA PERSONA(约翰)

第二栏:大家好,谢谢光临 | 感谢您邀请我们 | 黄豆酱| 高分辨率照片| CLIPARTO 你好。你好吗

最终结果也可以是其他格式或重塑。

要拆分的模式是一个或多个大写单词和一个“:”,但一个困难是大写字母的模式可以有可选字符,如:():,;

事实上,我正在寻找拆分的原文是这个: https ://lopezobrador.org.mx/2021/01/14/version-estenografica-de-la-conferencia-de-prensa-matutina-del-presidente -andres-manuel-lopez-obrador-458/

我使用 stringr rebus 和 qdap 尝试了不同的东西。首先尝试这种模式:

pattern_mayusc <- UPPER %R% one_or_more(UPPER) %R% optional(") ") %R% ":"

接下来我尝试使用每个对话者的名称提取一个向量,以将它们用作接下来的模式:

mayuscula<-sapply(str_extract_all(text, ".([A-Z]+:)"), paste, collapse= ' ')

我接近获得我想要的东西,但无法实现它。有人帮我吗?非常感谢提前

标签: rregexstringsplittext-mining

解决方案


您可以使用strsplit匹配:前面带有任何大写字母\p{Lu}、空格 ( \s) 和括号(如果需要,还可以添加更多)的单词序列或 ( |) 空格,后跟相同序列的模式。我们想要el结果列表中的第一个元素并用trimws. 结果是说话者和文本的交替模式,我们可以轻松地将其转换为逐行的两列matrix

pat <- r"{(?>\p{Lu}+?\s?)+\(?\p{Lu}+\)?\K(:)|(?<!\w)(\s)(?=\p{Lu}{2,})}"
# pat <- "(?>\\p{Lu}+?\\s?)+\\(?\\p{Lu}+\\)?\\K(:)|(?<!\\w)(\\s)(?=\\p{Lu}{2,})"  ## for R < 4.0.0

tmp <- trimws(el(strsplit(x, pat, perl=TRUE)))[-1]
res <- matrix(tmp, ncol=2, byrow=TRUE)
res
#      [,1]                                 [,2]                           
# [1,] "FIRST PERSON"                       "hi all, thank you for coming."
# [2,] "SECOND PERSON"                      "thank you for inviting us."   
# [3,] "TERCER PERSONA QUE SE LLAMA ANDRÉS" "soy de acuerdo."              
# [4,] "CUARTA PERSONA (JOHN)"              "Hi. How are you?"             
# [5,] "ANDRÉS"                             "Hola buenos días!"   

查看正则表达式演示


数据:

x <- "this is a speech text. FIRST PERSON: hi all, thank you for coming. SECOND PERSON: thank you for inviting us. TERCER PERSONA QUE SE LLAMA ANDRÉS: soy de: acuerdo. CUARTA PERSONA (JOHN): Hi. How are you? ANDRÉS: Hola buenos días!"

推荐阅读