私は、単語をそれぞれの同義語で効率的に置き換える(例えば、 "automobile"のすべての出現を同義語 "car"と置き換える)大きなテキスト本文を持っています。しかし、私はこれを行うための適切な(効率的な方法)を見つけるのに苦労しています。text2vecの単語を効率的に置き換えます
私はtext2vec
ライブラリを使用しています。このタスクにもこのライブラリを使用したいと考えています(依存性を減らすためにtm
を避ける)。
アン(非効率的な)方法は、次のようになります。
# setup data
text <- c("my automobile is quite nice", "I like my car")
syns <- list(
list(term = "happy_emotion", syns = c("nice", "like")),
list(term = "car", syns = c("automobile"))
)
マイブルートフォースソリューションこのような何かを持っていると言葉を探し、それらを
library(stringr)
# works but is probably not the best...
text_res <- text
for (syn in syns) {
regex <- paste(syn$syns, collapse = "|")
text_res <- str_replace_all(text_res, pattern = regex, replacement = syn$term)
}
# which gives me what I want
text_res
# [1] "my car is quite happy_emotion" "I happy_emotion my car"
を置き換えるためにループを使用することです
tm
でこの方法を使用していましたが、by MrFlick(tm::content_transformer
とtm::tm_map
を使用していました)ですが、tm
をより高速に置き換えてプロジェクトの依存関係を減らしたいと思いますtext2vec
。
私は最適な解決方法は何とかtext2vec
s itoken
を使用すると思いますが、わかりません。何か案は?ベースRで
これはとても興味深いコンセプトのようです!私はそれらのいくつかの迅速なベンチマークを行った。小さなシノニムサンプルでは、forループは速く、大きなリストでは 'fastmatch'アプローチが非常に高速です! また、私はまだこのプロジェクトに取り組んでいるので、あなたの2セントはここで非常に貴重です! – David
また、 'text2vec :: word_tokenizer'は' stringr :: str_split(TEXT_HERE、pattern = stringr :: boundary( "word")) 'と比較してかなり遅いことにも注意してください。 'stringr' /' stringi'/'tokenizers'を使用していない唯一の理由は、' text2vec'の数を可能な限り少なくしたいということです。 –