看一下 是不是你想要的
long = grep("\\s", names(v))
short = setdiff(1:length(v), long)
for (i in long)
{
words = strsplit(names(v[i]), "\\s")[[1]]
for (j in 1:length(words))
v[short][names(v[short]) == words[j]] =
v[short][names(v[short]) == words[j]] - v[i]
}
第二個迴圈可以用match做,並且省略short這個變數,這個你可以自己嘗試
code可以這樣改
long = grep("\\s", names(v))
for (i in long)
{
words = strsplit(names(v[i]), "\\s")[[1]]
loc = na.omit(match(words, names(v)))
v[loc] = v[loc] - v[i]
}
不用迴圈的作法:
twoWords = do.call(rbind, strsplit(names(v[long]), "\\s"))
s = tapply(rep(v[long],2), twoWords, sum)
loc = match(names(s), names(v))
v[loc] = v[loc] - s
你可以自己查看 s 跟 v[loc] 總數是有出入的
所以麻煩你確認一下你的雙詞跟單詞次數是否有誤
我後來想到你這個問題是
你雙詞會擷取前後,所以會有兩倍的單詞在雙詞中計入
你可能要自己去考慮這問題的解決方式
※ 引述《john5601 (HTC ONE年不變)》之銘言:
: 目前在作英文的文字探勘,已經可以分別算出單詞和雙詞的結果
: 舉例 :
: "Information management" 在文章中出現3次
: "Information"在文章中出現5次
: "management"在文章中出現6次
: 但因為想要長詞優先,所以"management"和"Information"的次數要分別減3次
: http://imgur.com/jAjrZxK
: 以上為跑出的結果 不知道該如何達成這樣的作法
: 懇請前輩大大指導
: [程式範例]:
: http://pastebin.com/27rXYuQp 程式碼