13

私は大量のデータを扱っていますが、ほとんどが英語以外の文字の名前です。私の目標は、これらの名前を米国で収集された情報と照合することです。

つまり、名前 'Sølvsten' (いくつかの名前のリストから) を 'Soelvsten' (アメリカのデータベースに保存されている名前) に一致させたいと思うかもしれません。これを行うために私が書いた関数を次に示します。明らかにぎこちなく、やや恣意的ですが、これらの外国語の文字を最も近い英語の隣人に変換する単純な R 関数があるかどうか疑問に思います。この変換を行う標準的な方法がない可能性があることは理解していますが、R 関数を使用してその変換を行うことができるかどうかに興味があります。

# a function to replace foreign characters
replaceforeignchars <- function(x)
{
    require(gsubfn);
    x <- gsub("š","s",x)
    x <- gsub("œ","oe",x)
    x <- gsub("ž","z",x)
    x <- gsub("ß","ss",x)
    x <- gsub("þ","y",x)
    x <- gsub("à","a",x)
    x <- gsub("á","a",x)
    x <- gsub("â","a",x)
    x <- gsub("ã","a",x)
    x <- gsub("ä","a",x)
    x <- gsub("å","a",x)
    x <- gsub("æ","ae",x)
    x <- gsub("ç","c",x)
    x <- gsub("è","e",x)
    x <- gsub("é","e",x)
    x <- gsub("ê","e",x)
    x <- gsub("ë","e",x)
    x <- gsub("ì","i",x)
    x <- gsub("í","i",x)
    x <- gsub("î","i",x)
    x <- gsub("ï","i",x)
    x <- gsub("ð","d",x)
    x <- gsub("ñ","n",x)
    x <- gsub("ò","o",x)
    x <- gsub("ó","o",x)
    x <- gsub("ô","o",x)
    x <- gsub("õ","o",x)
    x <- gsub("ö","o",x)
    x <- gsub("ø","oe",x)
    x <- gsub("ù","u",x)
    x <- gsub("ú","u",x)
    x <- gsub("û","u",x)
    x <- gsub("ü","u",x)
    x <- gsub("ý","y",x)
    x <- gsub("ÿ","y",x)
    x <- gsub("ğ","g",x)

    return(x)
}

注: Jaro Winkler Distance Matching などの名前一致アルゴリズムが存在することは知っていますが、正確な一致を行いたいと思います。

4

5 に答える 5

21

1 文字の置換に R 関数を使用してみてくださいchartr(これは非常に高速です)。次に、1 文字から 2 文字の置換のそれぞれに対する一連のgsub呼び出しでクリーンアップします (これはおそらく遅くなりますが、多くはありません)。彼ら)。

to.plain <- function(s) {

   # 1 character substitutions
   old1 <- "šžþàáâãäåçèéêëìíîïðñòóôõöùúûüý"
   new1 <- "szyaaaaaaceeeeiiiidnooooouuuuy"
   s1 <- chartr(old1, new1, s)

   # 2 character substitutions
   old2 <- c("œ", "ß", "æ", "ø")
   new2 <- c("oe", "ss", "ae", "oe")
   s2 <- s1
   for(i in seq_along(old2)) s2 <- gsub(old2[i], new2[i], s2, fixed = TRUE)

   s2
}

old1new1old2に必要に応じて追加しnew2ます。

ここにテストがあります:

> s <- "æxš"
> to.plain(s)
[1] "aexs"

更新: の変数名を修正しましたchartr

于 2013-07-07T23:18:43.010 に答える
12

潜在的により良い結果を得るために編集...

これはすべてのケースでうまくいくとは限りませんiconvが、調査する価値はあります。から?iconv:

説明:

 This uses system facilities to convert a character vector between
 encodings: the ‘i’ stands for ‘internationalization’.

例:

test <- c("Sølvsten", "Günther")
iconv(test, "latin1", "ASCII//TRANSLIT")
#[1] "Solvsten" "Gunther" 

これはそれほど単純化されたものではありませんが、コードからデータを分離するために何か言いたいことがあると思います。これは、次の質問と非常によく似ています。

R: gsub を使用して文字を置き換えます。関数の作成方法は?

from と to を定義します。

fromto <- read.table(text="
from to
š s
œ oe
ž z
ß ss
þ y
à a
á a
â a
ã a
ä a
å a
æ ae
ç c
è e
é e
ê e
ë e
ì i
í i
î i
ï i
ð d
ñ n
ò o
ó o
ô o
õ o
ö o
ø oe
ù u
ú u
û u
ü u
ý y
ÿ y
ğ g",header=TRUE)

次に、関数:

replaceforeignchars <- function(dat,fromto) {
  for(i in 1:nrow(fromto) ) {
    dat <- gsub(fromto$from[i],fromto$to[i],dat)
  }
  dat
}

test <- c("Sølvsten", "Günther")
replaceforeignchars(test,fromto)
#[1] "Soelvsten" "Gunther"
于 2013-07-08T00:19:39.450 に答える
8

C プログラムをインストールしuni2asciiて、R から呼び出すことができます。

uni2ascii <- function(string) {
    cmd <- sprintf("echo %s | uni2ascii -B", string)
    system(cmd, intern = TRUE, ignore.stderr = TRUE)
}

uni2ascii <- Vectorize(uni2ascii, USE.NAMES = FALSE)

uni2ascii(c("Sølvsten", "ğ", "œ"))
## [1] "Solvsten" "g"        "oe"
于 2013-07-07T23:37:43.930 に答える