2016-06-30 5 views
1

R(tm)を使用して、テキストマイニングの演習で次のMWEを検討してください。 トヨタは米国で複数のSUVモデルを用意しています。 models<-c("highlander","land cruiser","rav4","sequoia","4runner")。一般的なメディアは、 "toyota rav4"(コーパスはすでに小文字に変換されている)ではなく "rav4"と呼ばれています。 DocumentTermMatrixでトヨタsuvsの単一の列を取得するには、私はこれらのすべてのブランドを1つの一般的な "toyota_suv"に変換する必要があります。私が今やっていることは、長さ(モデル)のためにmycorpus<-tm_map(mycorpus, gsub, pattern="rav4", replacement="toyota_suv")を繰り返すことです。ハックはmodel_names<-rep("toyota_suv",length(models))を設定し、人生を乗り切ることでしょう。どのように多対1のマッピングで辞書を設定すれば、すべてmodelsが1つの式で 'toyota_suv'に置き換えられますか?どうもありがとう。R辞書:多対1マッピングを作成

答えて

4

ベクトル化置換関数を使用できます。 stringiパッケージは、stri_replace_allファミリーの機能を備えたそのような機能を提供します。ここでは、stri_replace_all_fixedを使用していますが、必要に応じて大文字と小文字の区別やその他のオプションを調整します。

library(tm) 
library(stringi) 

toyota_suvs <- c("highlander","land cruiser","rav4","sequoia","4runner") 

tm_map(toyCorp, stri_replace_all_fixed, 
    pattern = toyota_suvs, replacement = "toyota_suv", 
    vectorize_all = FALSE) 

データ:

toyExample <- c("you don't know about the rav4, John Snow", 
    "the highlander is a great car", 
    "I want a land cruiser") 

toyCorp <- Corpus(VectorSource(toyExample)) 
+0

感謝。別の質問を開くことなく、これは時間の点で辞書のマッピングとどのように比較されますか? – Pradeep

+0

@Pradeep私は分かりません。私は、ドキュメントセットの例と、まさにどのような出力を得ようとしているのかを少し詳しく説明する必要があると思います。入力文書自体を変更する場合(コーパス作成前)​​、 'stringi'を直接使って打ち込むのは難しいでしょう:' stri_replace_all_fixed(toyExample、pattern = toyota_suvs、replacement = "toyota_suv"、vectorize_all = FALSE) '。 'tm_map'にそれを与えることは、物事をかなり減速さ​​せることになります。 – Jota

+0

時間が重要な考慮事項であれば、私は 'tm'パッケージから離れるでしょう。辞書のメソッドを持つ 'quanteda'を試してみることもできますが、" land cruiser "のようなマルチ単語で直接動作させることはできませんでした。したがって、追加の処理が必要になります。 – Jota

関連する問題