【问题标题】:How can I determing the ratio of Cyrillic words to Latin words with R?如何用 R 确定西里尔字母与拉丁词的比例?
【发布时间】:2016-12-07 01:45:55
【问题描述】:

我的文本同时包含西里尔文和拉丁文字符,我正在尝试确定西里尔文与拉丁文单词的比例。我尝试使用 Unicode 包,但在那里找不到任何计算不同类型单词的东西。有没有办法获得字数或与 R 类似的东西来区分一个文本中的西里尔文和拉丁文单词?文本为 UTF-8。

【问题讨论】:

  • 可能不是最有效的,但您可以使用 grep() 搜索所有拉丁文和西里尔文字符。

标签: r cyrillic latin


【解决方案1】:

这是一个可重现的示例,因为没有提供:

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."

我搜索“Cyrillic text sample”,并从第一个搜索结果中复制了 Lorem ipsum。我认为它可能是西里尔字符中 Lorem ipsum 的一部分。随意提供更准确的可重现示例。


您可以搜索并计算“单词”或相应类型的连续字符块,以获得粗略的答案。这是一个粗略的答案,因为我没有完全处理连字符、缩略词和其他此类边缘情况,尽管请参阅下面标有“边缘情况”的示例。我不确定西里尔文字需要涵盖哪些类型的边缘情况,所以我把它留给读者:

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}&amp;&amp;\p{script=cyrillic}] 逻辑与或交集 - 匹配 所有西里尔字母的集合。

虽然您可以使用不太具体的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}&amp;&amp;\\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

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2017-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2012-06-09
    相关资源
    最近更新 更多