text processing 第一步是電腦分詞。上回講過中文自動分詞的難度,以及市面上可用的分詞軟件。
我部門用的叫 nlpbamboo ,安裝相對簡易 ((在 Debian/Ubuntu 有 deb 包安裝)) ,速度也夠快。可是,它有其問題,例如以下的 command 。

echo "我們對 R 環境的介紹中沒有提到統計,但是大多數人用 R 就是因為它的統計功能。不過,我們寧可把 R 當作一個內部實現了許多經 典的時髦的統計技術的環境。部分的統計功能是整合在 R 環境的底層,但是大多數功能則以「包」的形式提供。" | bamboo

分詞結果如下:

我 們對 R 環境 的 介紹 中 沒 有 提到 統計 , 但是 大多 數人 用 R 就 是 因 為 它 的 統計 功能 。 不 過 , 我 們寧 可 把 R 當作 一 個 內部 實現 了 許多 經典 的 時髦 的 統計 技術 的 環境 。 部分 的 統計 功能 是 整合 在 R 環境 的 底層 , 但是 大多 數 功能 則 以 「 包」 的 形式 提供 。

分得非常差。例如「我」、「們對」,而不是「我們」、「對」。原因是甚麼?這是因為 nlpbamboo 所認識的繁體字不多,要送簡體字讓其分詞。 ((希望范國威不要到本博示威。)) 要解決如此問題,必需要一個可將文字由簡繁轉換的軟件。 ((這也是我想改用 Stanford 的原因。因為 Stanford 支持繁體分詞。))
環顧多種轉碼軟件, iconv 是標準,但是當輸入奇怪的中文字它會回報 empty string ,非常有問題。網上找到 cconv 不錯用 ((Ubuntu 的 repo 有此軟件)) ,可以準確的將繁體轉成簡體,也能反轉由簡轉繁。 ((更能處理「发现」(發現)、「头发」(頭髮)同字的問題。)) 在 UNIX 可以這樣的用 Pipe 。 ((是可以最後再 pipe 到 cconv 將文字再轉回繁體。))

echo "我們對 R 環境的介紹中沒有提到統計,但是大多數人用 R 就是因為它的統計功能。不過,我們寧可把 R 當作一個內部實現了許多經 典的時髦的統計技術的環境。部分的統計功能是整合在 R 環境的底層,但是大多數功能則以「包」的形式提供。" | cconv -f UTF-8 -t UTF8-CN | bamboo

分詞結果如下:

我们 对 R 环境 的 介绍 中 没有 提到 统计 , 但是 大多数 人 用 R 就 是 因为 它 的 统计 功能 。 不过 , 我们 宁可 把 R 当作 一个 内部 实现 了 许多 经典 的 时髦 的 统计 技术 的 环境 。 部分 的 统计 功能 是 集成 在 R 环境 的 底层 , 但是 大多数 功能 则 以 「 包」 的 形式 提供 。

bamboo 更支持 part of speech tagging ,如

echo "我們對 R 環境的介紹中沒有提到統計,但是大多數人用 R 就是因為它的統計功能。不過,我們寧可把 R 當作一個內部實現了許多經 典的時髦的統計技術的環境。部分的統計功能是整合在 R 環境的底層,但是大多數功能則以「包」的形式提供。" | cconv -f UTF-8 -t UTF8-CN | bamboo -p crf_pos

結果如下

我们/r 对/p R/n 环境/n 的/u 介绍/vn 中/f 没有/d 提到/v 统计/v ,/w 但是/c 大多数/m 人/n 用/p R/n 就/d 是/v 因为/p 它/r 的/u 统计/vn 功能/n 。/w 不过/c ,/w 我们/r 宁可/d 把/p R/n 当作/v 一个/m 内部/f 实现/v 了/u 许多/m 经典/n 的/u 时髦/a 的/u 统计/vn 技术/n 的/u 环境/n 。/w 部分/n 的/u 统计/vn 功能/n 是/v 集成/v 在/p R/n 环境/n 的/u 底层/n ,/w 但是/c 大多数/m 功能/n 则/d 以/p 「/n 包」/n 的/u 形式/n 提供/v 。/w

分詞的問題解決了。但是如何將如此結果拿去分析呢?
我的方法是用 R 的 system() 去執行上述的 bamboo 和 cconv 。可以寫個 function 去做。

執行後 split_text 此 vector 藏著的是一個這樣的 vector 。

[1] "我们" "对" "R" "环境" "的" "介绍" "中" "没有"
[9] "提到" "统计" "," "但是" "大多数" "人" "用" "R"
[17] "就" "是" "因为" "它" "的" "统计" "功能" "。"
[25] "不过" "," "我们" "宁可" "把" "R" "当作" "一个"
[33] "内部" "实现" "了" "许多" "经典" "的" "时髦" "的"
[41] "统计" "技术" "的" "环境" "。" "部分" "的" "统计"
[49] "功能" "是" "集成" "在" "R" "环境" "的" "底层"
[57] "," "但是" "大多数" "功能" "则" "以" "「" "包」"
[65] "的" "形式" "提供" "。"

之後可以幹的,有除去標點、除去 stop words 等等,這些可以用 gsub() 配合 regular expression 進行。

[code]
bamboo <- function(chinesetxt, postag = FALSE, split_vec=FALSE) {
### very raw system call to bamboo to segment the chinese text
### postag: Part Of Speech tagging
### split_vec: To split the space delimited Chinese text to vector, maybe useful if you are not using this function with tm package
bamboopipe <- ifelse(postag,"/opt/bamboo/bin/bamboo -p crf_pos ","/opt/bamboo/bin/bamboo ")
segtext <- system(paste(bamboopipe, sep=""), input=chinesetxt, intern=TRUE)
segtext <- Reduce(paste, segtext)
ifelse(split_vec,return(unlist(strsplit(segtext, split=" "))),return(segtext))
}

cconv <- function(chinesetxt, toCN=TRUE) {
### also a very raw system call to cconv to convert any UTF-8 Chinese text to UTF-8 Simplified Chinese
### or Traditional Chinese
### the input text must be UTF-8
outputmode <- ifelse(toCN, "UTF8-CN", "UTF8-TW")
output.c <- system(paste("cconv -f UTF-8 -t ", outputmode, sep=""), input = chinesetxt, intern = T)
output.c <- Reduce(paste, output.c)
return(output.c)
}
split_text <- bamboo(cconv("我們對 R 環境的介紹中沒有提到統計,但是大多數人用 R 就是因為它的統計功能。不過,我們寧可把 R 當作一個內部實現了許多經典的時髦的統計技術的環境。部分的統計功能是整合在 R 環境的底層,但是大多數功能則以「包」的形式提供。"), split_vec=TRUE)
[/code]