體驗SAS文字分析的樂趣:IALP論文集的質化分析
作者:高燕, SAS北京研發中心分析產品開發部總監
不久前,我參加了在臺灣召開的2016年IALP大會(第20屆亞洲語言處理國際會議)。 會議結束後,每位演講嘉賓都收到一個隨身碟,裡面包含了所有PDF格式的演講論文。回到北京後,我開始閱讀這些論文以拓展我的學習領域。通常,每次開完會回來,我會先結合我的會議筆記泛讀所有論文標題,然後選擇感興趣的文章,深入瞭解詳情;最後把我認為重要的研究發現總結成一個文檔。這些工作一般需要幾天或更長時間完成。
這次,我決定試用一下SAS®文字分析(SAS® Text Analytics),來幫助我更有效率地閱讀論文,我是這樣做的:
我的第一個實驗是,通過三個步驟生成一個所有論文的文字雲。
第1步:將PDF文檔集轉換為文字檔。
利用SAS TGFilter程式和SAS文檔轉換伺服器,可以將PDF文檔批量轉換為SAS資料集。如果沒有SAS文檔轉換伺服器,你可以先免費下載Pdftotext。Pdftotext只能將PDF檔轉換為文字檔,你需要編寫SAS代碼,將所有文字檔導入到資料集中。此外,如果使用Pdftotext,你還需要檢查PDF檔是否被正確地轉換。逐個檢查文字檔是很煩人的,我希望你能找到更簡單的方法來進行這項檢查。SAS TGFilter程式具有語言檢測功能,任何因轉換錯誤產生的垃圾文檔經過檢測後其對應的語言列被標記為空值,而非「英語」。因此,我建議你使用TGFilter功能,通過檢測語言列是否為「英語」,即可輕鬆地過濾掉所有垃圾文檔。
第2步:將文檔解析成單詞並擷取詞頻。
對文字化的SAS資料集運行SAS程式HPTMINE或TGPARSE,打開詞幹(stem)選項並啟用SAS發佈的英語停用詞列表,就可以擷取所有詞幹在文檔集裡出現的頻率。
第3步:生成文字雲圖。
有了詞頻之後,就可以使用SAS視覺化分析(SAS® Visual Analytics)或使用R生成文字雲圖。我喜歡程式設計,所以使用了SAS IML程式通過SAS提交R腳本。
這些步驟會生成一個文字雲,包含了66篇論文裡頻率最高的500個詞。 共有87篇論文,其中21篇因格式問題不能被SAS 文檔轉換伺服器正確轉換。如果使用軟體Pdftotext,會有19篇文章無法被正確轉換。
圖-1 66篇論文最高頻的500個文字的文字雲
從圖1可以看出,最常用的前10個詞是:詞、語言、中文、模型、系統、句子、語料庫、資訊、特徵和方法(word, language, chinese, model, system,
sentence, corpus, information, feature and method)。IALP是一個國際會議,並不僅僅關注中文。但是,在今年的會議上有一個挑戰賽,其目的是預測繁體中文裡情感詞的情緒正負性以及情緒喚醒的程度。此外,參加挑戰賽的每個團隊都被要求提交一篇論文來介紹自己的工作,所以「中文」在詞彙雲中比其它語言頻率高。
你可能覺得如果我們使用論文正文進行文字雲分析,會有很多雜訊,所以我的第二個實驗是通過類似的處理,生成論文摘要的文字雲。你可以在圖2中查看這些結果。
圖-2 66篇論文摘要最高頻的500個文字的文字雲
論文摘要中最高頻的10個詞是:詞、中文、系統、語言、方法、論文、建議、情感、基礎和語料庫(word, chinese, system, language, method, paper, propose, sentiment, base and corpus)。這些與從論文正文中提取的前10個高頻詞有些不同。字、詞和句子是自然語言的基本組成部分。對於NLP(自然語言處理)中的機器學習而言,標註的語料庫則是關鍵。沒有語料庫,就不能建立任何模型。然而,即使在大數據時代,最高的語料庫也非常稀少,這就是為什麼這麼多研究人員在語料最高上投入大量工作的原因。
我們可以用SAS進行更多的分析嗎?當然。我們可以分析關鍵字、參考文獻、論文影響力、論文分類等。我爭取嘗試更多這類有趣的分析,並在將來與大家分享更多成果。
生成文字雲的SAS腳本如下:
* Step 1: Convert PDF collections into sas dataset;
* NOTE: You should have SAS Document Converte purchased;
proc tgfilter out=paper(where=(text ne '' and language eq 'English'))
tgservice=(hostname="yourhost" port=yourport)
srcdir="D:\temp\pdf_collections"
language="english"
numchars=32000
extlist="pdf"
force;
run;quit;
* Step 2: Parse documents into words and get word frequencies;
* Add document id for each document;
data paper;
set paper;
document_id = _n_;
run;
proc hptmine data=paper;
doc_id document_id;
var text;
parse notagging nonoungroups termwgt=none cellwgt=none
stop=sashelp.engstop
outparent=parent
outterms=key
reducef=1;
run;quit;
* Get stem freq data;
proc sql noprint;
create table paper_stem_freq as
select term as word, freq as freq
from key
where missing(parent) eq 1
order by freq descending;
quit;
* Step 3: Generate word cloud plot with R;
data topstems;
set paper_stem_freq(obs=500);
run;
proc iml;
call ExportDataSetToR("topstems", "d" );
submit / R;
library(wordcloud)
# sort by frequency
d <- d[order(d$freq, decreasing = T), ]
# print wordcloud:
svg(filename="d://temp//wordcloud_top_sas.svg", width=8, height=8)
wordcloud(d$word, d$freq)
dev.off()
endsubmit;
run;quit;