3

定義された観測タイプでキー付けされた、最大 100 万個の観測を含む大規模なデータセットがあります。データセット内には、不正な形式の観測タイプを持つ最大 900,000 の観測があり、50 の許容可能な観測タイプの最大 850 (正しくない) バリエーションがあります。

keys <- c("DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING")

entries <- c("Day", "day", "SUNSET/DUSK", "DAYS", "dayy", "EVEN", "Evening", "early dusk", "late day", "nite", "red dawn", "Evening Sunset", "mid-night", "midnight", "midnite","DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING")

gsub を使用することは、ハンド シャベルで地下室を掘るのと似ています。私の場合、r と複雑な正規表現に慣れていないので、ハンドルが壊れたシャベルを使用します。簡単なフォールバック (私にとって) は、受け入れられた観察の種類ごとに 1 つの gsub ステートメントを記述することですが、50 のステートメントが必要なため、不必要に困難に思えます。

問題のあるエントリを最短距離の文字列で使用levenshtein.distanceまたは置き換えたいと思います。(length(x)) の結果を各 y[i] に渡そうとしているため、 stringdist実行は機能しません。z <- for (i in length(y)) { z[i] = levenshtein.distance(y[i], x)}

最小距離で結果を返すにはどうすればよいですか? function(x) x[2]シリーズで2番目の結果を返すのを見てきましたが、どのように最低を取得するのですか?

4

1 に答える 1

4

あなたは試すことができます:

library(stringdist)
m <- stringdistmatrix(entries, keys, method = "lv")
a <- keys[apply(m, 1, which.min)]

別のアルゴリズムを試してみたい場合は、以下をご覧ください。?'stringdist-metrics'


または、コメントで@RHertelが言及したように:

b <- keys[apply(adist(entries, keys), 1, which.min)]

adist()ドキュメントから:

文字ベクトル間の string のおおよその距離を計算します。この距離は、一般化されたレーベンシュタイン (編集) 距離であり、ある文字列を別の文字列に変換するために必要な挿入、削除、および置換の最小可能加重数を示します。

2 つの方法では、同じ結果が得られます。

> identical(a, b)
#[1] TRUE
于 2015-10-22T15:30:01.473 に答える