No.22889 【R】文字列ベクトルの突き合わせの高速化  【明石】 2020/04/11(Sat) 13:44

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。

青木先生にご教示いただきたいことが出てきました。
何卒どうぞよろしくお願いいたします。

----------------------------------------

2つの文字列ベクトルの突き合わせの高速化について,
ご教示をいただけましたら,大変に助かります。

使うデータは,2種類です。
・文字列ベクトル v
・参照テーブル tbl

・文字列ベクトル v は,
 自然言語処理で,テキストから切り出した単語の集合であり,長大です。
 表記ゆれが多くありますので,統制の必要性があります。

 表記ゆれの例示としては,"りんご","リンゴ","林檎","アップル","apple"など

・参照テーブル tbl は,
 上記の表記ゆれを統制するために,参照する表です。

 tbl は2列からなります。
 1列目は,参照文字列
 2列目は,置換文字列

 tbl の例示としては,
 りんご 林檎
 アップル 林檎
 apple 林檎
 など

やりたいことは,以下です。
・文字列ベクトル v を,for()関数でループを回す。
・v の各要素を,参照テーブル tbl の1列目「参照文字列」と照合する。
 ここで,標題の「文字列ベクトルの突き合わせ」が出てきます。
 == 演算子 を使いました。
・もし,v の要素が,tbl の1列目「参照文字列」にあれば,
 そのv の要素を, tbl の2列目「置換文字列」で置換する。

for()関数の2重ループが原因と思いますが,
気が遠くなるほどの長い処理時間となりますので,
文字列ベクトルの突き合わせの高速化について,
ご教示をいただけましたら,大変に助かります。

お手数をおかけいたします。
//

No.22890 Re: 【R】文字列ベクトルの突き合わせの高速化  【青木繁伸】 2020/04/11(Sat) 21:34

以下のようなプログラムだと,実行時間はいかほどになりますか?

dict = matrix(c(
"りんご", "林檎",
"アップル", "林檎",
"apple", "林檎",
"レモン", "檸檬",
"れもん", "檸檬",
"lemon", "檸檬",
"remon", "檸檬"), byrow=TRUE, nc=2)
v = c("りんご", "アップル", "apple",
"檸檬", "レモン", "れもん", "lemon", "remon",
"イチゴ", "スイカ")
a = unname(sapply(v, function(s) {
i = which(dict[, 1] == s)
ifelse(length(i) == 0, s, dict[i, 2])
}))
実行結果
> a
[1] "林檎" "林檎" "林檎" "檸檬" "檸檬"
[6] "檸檬" "檸檬" "檸檬" "イチゴ" "スイカ"

No.22891 御礼(Re: 【R】文字列ベクトルの突き合わせの高速化)  【明石】 2020/04/12(Sun) 09:53

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
今回も,大変にありがたい,貴重なご教示をいただきました。
ありがとうございました。

劇的な改善をはかることができました。

エラップス時間の比較です。
・青木先生の方法:16秒
・私の従来方法 :25分経過しても,まだ終わりません..........

データ量が多くなれば,この効果は極めてありがたいです。

青木先生からご教示いただきました貴重なノウハウを,勉強しています。

心から,心より,御礼を申し上げます。
//

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る