我有一个包含西里尔字母和拉丁字符的文字,我正在尝试确定西里尔字母和拉丁字母的比例。我尝试使用Unicode包,但在那里找不到任何用于计算不同类型的单词的东西。有没有办法获得一个字数或与R类似的东西,区分一个文本中的西里尔字和拉丁字?该文本是UTF-8。
答案 0 :(得分:0)
这是一个可重复的例子,因为没有提供:
texmix <- "Лорем ипсум долор сит амет, ин лаборе глориатур дуо, видиссе аццусамус не мел.
Оцурререт репрехендунт вих ат, вел ин цонвенире волуптатум.
Иллуд дицит нолуиссе при цу, вих ех диам дебет.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
我搜索“西里尔文本样本”并从第一个搜索结果和Lorem ipsum一起复制。我认为它可能是西里尔字符中的Lorem ipsum的一部分。随意提供更准确的可重复示例。
您可以搜索并计算相应类型的“单词”或连续的字符块,以获得粗略的答案。这是一个粗略的答案,因为我没有完全处理带连字符的单词,收缩和其他此类边缘情况,但请参阅下面标有“Edge Cases”的示例。我不确定西里尔文本中需要涵盖哪种边缘情况,所以我将其留给读者:
library(stringi)
## count of cyrillic "words"
stri_count_regex(texmix, "[\\p{Letter}&&\\p{script=cyrillic}]+")
# [1] 30
## count of latin "words"
stri_count_regex(texmix, "[\\p{Letter}&&\\p{script=latin}]+")
# [1] 69
## ratio
stri_count_regex(texmix, "[\\p{Letter}&&\\p{script=cyrillic}]+") /
stri_count_regex(texmix, "[\\p{Letter}&&\\p{script=latin}]+")
# [1] 0.4347826
我从stringi参考手册中获取了模式(在“stringi-search-charclass”下):
[\p{Letter}&&\p{script=cyrillic}]
逻辑AND或交叉匹配 所有西里尔字母的集合。
虽然您可以使用不太具体的stri_count_regex(texmix, "\\p{Cyrillic}+")
和stri_count_regex(texmix, "\\p{Latin}+")
。
您可以开始解决您可能需要解决的任何边缘情况,例如使用这种方法的带连字符的单词或收缩:
stri_count_regex(texmix,
"[\\p{Letter}&&\\p{script=latin}]+[-']?[\\p{Letter}&&\\p{script=latin}]*")
你有一个可选的连字符或撇号([-']?
)后跟0个或更多拉丁字母([\\p{Letter}&&\\p{script=latin}]*
)
如果您不想使用stringi
,基础R中的类似方法可能是:
lengths(gregexpr("\\p{Cyrillic}+", texmix, perl = TRUE))
# [1] 30
lengths(gregexpr("\\p{Latin}+", texmix, perl = TRUE))
# [1] 69
此处提供了有关这些Unicode字符属性的更多潜在有用信息:http://www.regular-expressions.info/unicode.html