R 軟體 Rwordseg, Jiebar 強制斷詞處理

這幾天在用 Rwordseg 斷詞時,有一些應該是完整出現的商業名詞硬是被斷開成多個詞,調整辭典裡面的詞頻權重也沒用。

我後來就乾脆自己寫個函數來處理這個問題。


原理很簡單,先把自己一定要斷出的詞換成英文亂碼,Rwordseg 會保留完整、沒有空格的英文字。用 segmentCN 斷詞完之後,再把強制要斷開的中文詞換回去。

程式跟範例如下,需安裝 qdap 套件:

mySeg = function(txt,words,jseg)
{
   require(qdap)
   rndidx = replicate(length(words),
              paste0(sample(letters,6,replace=T),
              collapse=""))
   txt2 = mgsub(words,rndidx,txt)

   if (missing(jseg))
      # Rwordseg
      txt2 = segmentCN(txt2,returnType="tm")
   else
      # jeibaR
      txt2 =  unlist(lapply(lapply(txt2,segment,jiebar=jseg),paste0,collapse=" "))

   return(mgsub(rndidx,words,txt2))
}

# txt 是文章 vector , 包含一篇或多篇文章
txt = c("趕快回家然後再一次","再一次然後趕快回家")
# 不能被拆開的詞
VIPwords = c("快回家","再一次")

require(Rwordseg)
# Rwordseg 斷詞
segmentCN(txt,returnType="tm")
#[1] "趕快 回家 然 後 再 一次" "再 一次 然 後 趕快 回 家"
mySeg(txt,VIPwords)
#[1] "趕 快回家 然 後 再一次" "再一次 然 後 趕 快回家"

require(jiebaR)
jseg = worker()
# jiebaR 斷詞
unlist(lapply(lapply(txt,segment,jiebar=jseg),paste0,collapse=" "))
# [1] "趕快 回家 然後 再 一次" "再 一次 然後 趕快 回家"
mySeg(txt,VIPwords,jseg)
#[1] "趕 快回家 然後 再一次" "再一次 然後 趕 快回家"