处理 R 中带有变音符号的字符数

Handling count of characters with diacritics in R

我正在尝试获取带有变音符号的字符串中的字符数,但我无法获得正确的结果。

> x <- "n̥ala"
> nchar(x)
[1] 5

我想要得到的是 4,因为 应该被视为一个字符(即变音符号不应被单独视为字符,即使有多个变音符号叠加在上面一个基本字符)。

我怎样才能得到这样的结果?

您可以采取变通办法。这是一个:

dia.count <- function(string) {
  y <- unlist(strsplit(string, ''))
  length(grep('[A-Za-z0-9]', y, value=T))
}
dia.count(x)
[1] 4

最好直接处理字符编码的方法。这又是一种解决方法。一般情况下,可能会有包或功能组合来全面解决您的问题。

更新

这是评论提供的另一种解决方法:

nchar(sub('[^A-Za-z]+', '', x))
[1] 4

dia.count 函数在字符串中查找大写和小写字母以及数字。添加的脚本恰恰相反;它消除了所有不是字母、大写或其他形式的字符串标记。信用@akrun

我能在包 stringi 中找到的最好的是 str_enc_toascii,它给出:

stri_enc_toascii(x)
[1] "n2ala"

给定该输出,将除字母以外的所有内容替换掉将提供所需的输出。

nchar(sub('[^A-Za-z]', '', stri_enc_toascii(x)))
[1] 4

在评论中找到一般答案和快速脚本之间的良好平衡:

nchar(iconv("n̥ala", to="ASCII", sub=""))
[1] 4

这使用 base R 函数 iconv,为您转换字符串。信用@Molx

这是我的解决方案。这个想法是拼音字母可以有一个 unicode 表示,然后:

使用Unicode包;它提供的功能 Unicode_alphabetic_tokenizer 是:

Tokenization first replaces the elements of x by their Unicode character sequences. Then, the non- alphabetic characters (i.e., the ones which do not have the Alphabetic property) are replaced by blanks, and the corresponding strings are split according to the blanks.

在此之后我使用了 nchar 但是因为将它拆分为前一个函数的两个子字符串我使用了 sum

sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 4

我相信这个包在这种情况下会非常有用,但我不是专家,我不知道我的解决方案是否适用于所有涉及拼音字母的问题。也许其他示例可能有助于说明我的解决方案的有效性。

效果不错

这是另一个例子:

> x <- "e̯ ʊ̯"
> x
[1] "e̯ ʊ̯"
> nchar(x)
[1] 5
> sum(nchar(Unicode_alphabetic_tokenizer(x)))
[1] 2

p.s。 代码中只有一个 " 但是复制并粘贴它,出现第二个。我不知道为什么会这样。

这是一个使用我维护的 qdap 包的解决方案:

x <- "n?ala"

library(qdap)
character_count(word)
## [1] 4