好久沒po文了~ 真的有點面目可憎QQ 馬上補一篇XD
--
我一直覺得人文學者對於文本(text)的理解深度是遠大於理科學者的,但是理科學者卻有著計算力一個極大的優點:擴展性(scalability),因此數理可以藉由 "遠讀" ,拆解脈絡的方式達成另一種過去無法提供的全新切點。
下面以台灣知名文獻「淡新檔案」做文本探勘跨領域的嘗試。
一、淡新檔案簡介
「淡新檔案」是清乾隆四十一年(1776)至光緒二十一年(1895)淡水廳、臺北府及新竹縣的行政與司法檔案,日治時代由新竹地方法院承接,轉送覆審法院(即高等法院),再轉贈臺北帝國大學文政學部,供學術研究之用。戰後移交本校法學院,並由法律系戴炎輝教授命名及主持整理工作,將檔案內之文件分為行政、民事及刑事三門,門下並分類、款、案、件全檔共計一、一六三案,一九、一五二件。
類別以行政編最多,年代以光緒年間最多。全部檔案原件及三十三捲微捲於民國七十五年(1986)由戴教授移交本館特藏組珍藏,清點實得總案數為一、一四三案,共一九、二八一件。
在現存的清代臺灣省、府、州、縣廳署檔案中,以「淡新檔案」最具規模、完整而亙及長期間。本檔案為研究我國清治時代臺灣行政、司法、經濟、社會、農業等極有價值之第一手資料,故對研究臺灣法制史、地方行政史、社會經濟史等深具學術價值,彌足珍貴。也是瞭解傳統中國法律制度與司法審判的重要憑藉,為世界有名的傳統中國縣級檔案。
首保糧差楊陞稟為水沖倒戶難征列單聲明稟請核案察奪事
二、動機:淡新檔案的文本重分類
淡新檔案是由西方的分類觀點(民事、刑事、行政)來作為淡新檔案的分類標準。但是西方的分類法缺點是拆解掉了當時的脈絡。當時中國通常以六部(吏、戶、禮、兵、刑、工)作為分類標準。因此希望以自動化的方法重建當時的分類。
三、中文文本預處理
這裡加一點中文預處理要注意的地方:)
1. XML file parsing
- 豐富檔案(Rich Documents)- 自定檔案描述並使其更豐富
- 後設資料(Metadata)- 描述其它檔案或網路資訊
- 配置文件(Configuration Files)- 描述軟體設定的參數
[R code] XML : R library for parsing XML
library("XML") xmlfile_1 <- xmlTreeParse("d_0001.xml") xmltop_1 <- xmlRoot(xmlfile_1) main_text_1 <- xmlSApply(xmltop_1[[1]], function(x) xmlSApply(x, xmlValue)) main_text_1 <- data.frame(t(main_text_1),row.names=NULL) main_text_1 <- data.frame(lapply(main_text_1, as.character), stringsAsFactors=FALSE)
2. 斷詞 (segmentation)
在英文結構中,每個表意的單詞都是獨立的,但中文或日文需要的詞中間沒有空白或其他符號,因此斷詞變成一個重要的課題。(不過中文沒有 Accents, stemming, Case folding等議題)
Rwordseg 是一個R環境下的中文分詞工具,使用 rJava 調用 Java 分詞工具 Ansj,採用隱式馬可夫模型(Hidden Markov Model, HMM)。,但中文表意的字符之間沒有空格連接,因此需要中文分詞工具的協助。
詳細說明見作者的github!
https://github.com/NLPchina/ansj_seg
Rwordseg 是一個R環境下的中文分詞工具,使用 rJava 調用 Java 分詞工具 Ansj,採用隱式馬可夫模型(Hidden Markov Model, HMM)。,但中文表意的字符之間沒有空格連接,因此需要中文分詞工具的協助。
詳細說明見作者的github!
https://github.com/NLPchina/ansj_seg
3. 去除停用字 (Stopword)
停用詞出現頻繁,但它們跟文章的內容近乎無關,造成檢索分類等方法的雜訊問題,因此要去除,例如中文裡的之、以、何...等等。
- 經驗法則:the 30 most common words account for 30% of the tokens in written text
- Zipf's law : $rank \times freq. = const.$
4. 產生 Term Document Matrix
library("rJava") library("Rwordseg") library("tm") library("tmcn") library("SnowballC") d.corpus <- Corpus(VectorSource(content)) d.corpus <- tm_map(d.corpus, removePunctuation) d.corpus <- tm_map(d.corpus, stripWhitespace) d.corpus <- tm_map(d.corpus, removeNumbers) stop.word <- readLines('stopword.tw') d.corpus <- tm_map(d.corpus, removeWords, stop.word) d.corpus <- tm_map(d.corpus, content_transformer(segmentCN)) extract_tdm <- TermDocumentMatrix(d.corpus, control = list(wordLengths = c(1, 2)))
四、Language Model Implementataion : Naive Bayes Classifier
簡單介紹 Language model 並實作 Naive Bayes classifier。
0. Language Model
Generate a piece of text by generating each word. (using unigram model)
for example :
[用心去感覺] Smoothing : Dirichlet Prior/Bayesian
Assign a low probability to words not observed in the training corpus.
Smoothing connected with TF-IDF weighting and document length normalization
1. Naive Bayes Classifier : word probability
意義為在某一個主題下某字出現的機率。這是有smoothing的版本,多了1和|V|兩個參
數可調節 smoothing 的影響力。
2. Naive Bayes Classifier : The class prior probabilities
意義為在某一個主題出現的機率。這也是有smoothing的版本,多了1和|C|兩個參數可
調節 smoothing 的影響力。
3. Using Naive Bayes Classifier
先算某主題出現該文章的機率,再用貝氏定理反轉成該文章是某主題的機率。
- 分母不用算,因為每一個要比較的機率值除的分母都一樣
- 分子取log相加,不然會有超出精度的問題。
四、結果
藉由建立古代六部分類的分類器(在此簡單以刑事為例),可以將西方分類法中民事、行政的案件放入分類器,即可篩選出可疑的檔案做人工精確的分類定位。
1. 成功案例 : 第22433 案
淡新檔案: 第22433 案
檔案名稱: ntul-od-th22433_000_00_00_4
成文日期: 光緒13年5月(1887)
簡述: 據竹北一保三塊厝莊民姚浪具告姚寬滋恨較故害阻被黨毆叩請驗究由
這個事件是霸佔引起的鬥毆,這就是我們要抓出他可能分類有爭議的部分。
[註]甘結狀 : 立下契約保證以後不會再犯,類似和解書或切結書。
2. 失敗案例 : 第 11201 案
淡新檔案: 第11201 案
檔案名稱: ntul-od-th11201_001
作者/發文者: 李承烈(族長);陳南薰(左鄰);黃日省(右鄰)
成文日期: 嘉慶25年(1820)
原件作成地點: 淡水分府
簡述: 族長李承烈等具狀保結李鴻圖頂補淡水廳右典吏
由於[1]沒有語意分析,[2]文本過短,把良民 "不" "偷拐搶騙" 的敘述當成刑事案件。
藉由中國與西方案件分類重定位,釐清兩者間刑事案件的分野,以重新釐清不同文化對於刑事事件的詮釋。
相關研究皆放在github開源共享:
https://github.com/sunprinceS/Criminal-Analysis-in-Qing
References
台灣大學典藏數位化計劃