如何使用大写字母模式拆分文本/字符串?
How to split a text / string with pattern of upper case letters?
我想根据每个对话者拆分文本。
原文是这样的形式:
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
PEDRO: soy de acuerdo. CUARTA PERSONA (JOHN): Hi. How are you
我正在搜索这样的最终结果:
第一列:第一人称|第二人称| TERCER PERSONA QUE SE LLAMA PEDRO | CUARTA PERSONA(约翰)
第二栏:大家好,感谢大家的到来 |感谢你邀请我们
|大豆 |你好。你好吗
最后的结果也可以是其他格式或整形。
要拆分的Pattern是一个或多个Upper Word和一个“:”,但一个难点是大写字母的Pattern可以有可选字符,如:():,;
我使用 stringr rebus 和 qdap 尝试过不同的方法。
第一次尝试这种模式:
pattern_mayusc <- UPPER %R% one_or_more(UPPER) %R% optional(") ") %R% ":"
接下来我尝试提取一个向量,其中包含每个对话者的名字,以便将它们用作下一个模式:
mayuscula<-sapply(str_extract_all(text, ".([A-Z]+:)"), paste, collapse= ' ')
我很接近得到我想要的但无法实现。有人帮我吗?
非常感谢
您可以在匹配 :
的模式上使用 strsplit
15=]) 和圆括号(如果需要的话,还有更多),或 (|
) space,后跟相同的序列。我们想要结果列表中的第一个 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!"
我想根据每个对话者拆分文本。
原文是这样的形式:
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 PEDRO: soy de acuerdo. CUARTA PERSONA (JOHN): Hi. How are you
我正在搜索这样的最终结果:
第一列:第一人称|第二人称| TERCER PERSONA QUE SE LLAMA PEDRO | CUARTA PERSONA(约翰)
第二栏:大家好,感谢大家的到来 |感谢你邀请我们 |大豆 |你好。你好吗
最后的结果也可以是其他格式或整形。
要拆分的Pattern是一个或多个Upper Word和一个“:”,但一个难点是大写字母的Pattern可以有可选字符,如:():,;
我使用 stringr rebus 和 qdap 尝试过不同的方法。 第一次尝试这种模式:
pattern_mayusc <- UPPER %R% one_or_more(UPPER) %R% optional(") ") %R% ":"
接下来我尝试提取一个向量,其中包含每个对话者的名字,以便将它们用作下一个模式:
mayuscula<-sapply(str_extract_all(text, ".([A-Z]+:)"), paste, collapse= ' ')
我很接近得到我想要的但无法实现。有人帮我吗? 非常感谢
您可以在匹配 :
的模式上使用 strsplit
15=]) 和圆括号(如果需要的话,还有更多),或 (|
) space,后跟相同的序列。我们想要结果列表中的第一个 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!"