
數(shù)據(jù)挖掘入門——分詞
隨著社會(huì)化數(shù)據(jù)大量產(chǎn)生,硬件速度上升、成本降低,大數(shù)據(jù)技術(shù)的落地實(shí)現(xiàn),讓冷冰冰的數(shù)據(jù)具有智慧逐漸成為新的熱點(diǎn)。要從數(shù)據(jù)中發(fā)現(xiàn)有用的信息就要用到數(shù)據(jù)挖掘技術(shù),不過買來的數(shù)據(jù)挖掘書籍一打開全是大量的數(shù)學(xué)公式,而課本知識(shí)早已還給老師了,著實(shí)難以下手、非常頭大!
我們不妨先跳過數(shù)學(xué)公式,看看我們了解數(shù)據(jù)挖掘的目的——發(fā)現(xiàn)數(shù)據(jù)中價(jià)值。這個(gè)才是關(guān)鍵,如何發(fā)現(xiàn)數(shù)據(jù)中的價(jià)值。那什么是數(shù)據(jù)呢?比如大家要上網(wǎng)首先需要輸入網(wǎng)址,打開網(wǎng)頁后會(huì)自動(dòng)判斷哪些是圖片、哪些是新聞、哪些是用戶名稱、游戲圖標(biāo)等。大腦可以存儲(chǔ)大量的信息,包括文字、聲音、視頻、圖片等,這些同樣可以轉(zhuǎn)換成數(shù)據(jù)存儲(chǔ)在電腦。人的大腦可以根據(jù)輸入自動(dòng)進(jìn)行判斷,電腦可以通過輸入判斷嗎?
答案是肯定的! 不過需要我們編寫程序來判斷每一種信息,就拿文字識(shí)別來說吧,怎么從一個(gè)人在社交網(wǎng)絡(luò)的言論判斷他今天的心情是高興還是憤怒!比如:“你假如上午沒給我吃冰淇淋,我絕對(duì)會(huì)不happy的。” 信息發(fā)布時(shí)間為下午2點(diǎn)。對(duì)于我們?nèi)祟愐豢催@個(gè)句子就知道他是吃過冰淇淋了,心情肯定不會(huì)是憤怒。那計(jì)算機(jī)怎么知道呢?
這就是今天的主題,要讓計(jì)算機(jī)理解句子的語義,必須要有個(gè)程序,上面的句子和發(fā)布時(shí)間是輸入,輸出就是 “高興”。要得到“高興”就要建立 “高興”的規(guī)則,可以建一個(gè)感情色彩詞庫,比如高興(識(shí)別詞是高興、happy),憤怒(識(shí)別詞是憤怒、生氣)。這里的識(shí)別詞就是輸入中出現(xiàn)的詞語,比如上面的句子中的“happy”就識(shí)別出了“高興”這個(gè)感情色彩詞。但是光識(shí)別出“happy”肯定是不行的,前面的“假如……沒……,我……不……”等關(guān)鍵詞都需要識(shí)別出來,才能完整判斷一個(gè)句子的意思。為了達(dá)到這個(gè)效果,就必須要用分詞技術(shù)了。
分詞
我們先人工對(duì)上面的句子來進(jìn)行一下切詞,使用斜線分割:“你/假如/上午/沒/給/我/吃/冰淇淋/,/我/絕對(duì)/會(huì)/不/happy/的/。/”。但是程序如何做到自動(dòng)切分?這個(gè)其實(shí)中國的前輩們已經(jīng)做了很多中文分詞的研究,常見的分詞算法有:
1. 基于詞典的分詞,需要先預(yù)設(shè)一個(gè)分詞詞典,比如上面句子切分出來的“假如、上午”這些詞先存放在詞典,然后把句子切分成單字組合成詞語去詞典里查找,匹配上了就挑選出來一個(gè)詞。沒有匹配上的就切分成單字。
2. 基于統(tǒng)計(jì)的分詞,需要先獲取大量的文本語料庫(比如新聞、微博等),然后統(tǒng)計(jì)文本里相鄰的字同時(shí)出現(xiàn)的次數(shù),次數(shù)越多就越可能構(gòu)成一個(gè)詞。當(dāng)達(dá)到一定次數(shù)時(shí)就構(gòu)成了一個(gè)詞,即可形成語料概率庫。再對(duì)上面句子進(jìn)行單字切分,把字與字結(jié)合后在語料概率庫里查找對(duì)應(yīng)的概率,如果概率大于一定值就挑選出來形成一個(gè)詞。這個(gè)是大概描述,實(shí)際生產(chǎn)環(huán)境中還需要對(duì)句子的上下文進(jìn)行結(jié)合才能更準(zhǔn)確的分詞。
3. 基于語義的分詞,簡而言之就是模擬人類對(duì)句子的理解來進(jìn)行分詞。需要先整理出中文語句的句法、語義信息作為知識(shí)庫,然后結(jié)合句子的上下文,對(duì)句子進(jìn)行單字切分后組合成詞逐個(gè)帶入知識(shí)庫進(jìn)行識(shí)別,識(shí)別出來就挑選出一個(gè)詞。目前還沒有特別成熟的基于語義的分詞系統(tǒng)。
基于詞典的分詞
為了讓大家快速的了解分詞技術(shù),我們采用第一個(gè)方式來做測試:基于詞典的分詞,這種方式簡單暴力可以解決百分之七八十的問題?;谠~典的分詞大概分為以下幾種方式:
1. 正向最大匹配,沿著我們看到的句子逐字拆分后組合成詞語到詞典里去匹配,直到匹配不到詞語為止。舉個(gè)實(shí)際的例子:“人民大會(huì)堂真雄偉”,我們先拆分為單字“人”去詞典里去查找,發(fā)現(xiàn)有“人”這個(gè)詞,繼續(xù)組合句子里的單字組合“人民”去詞典里查找,發(fā)現(xiàn)有“人民”這個(gè)詞,以此類推發(fā)現(xiàn)到“人民大會(huì)堂”,然后會(huì)結(jié)合“人民大會(huì)堂真”去詞典里查找沒有找到這個(gè)詞,第一個(gè)詞“人民大會(huì)堂”查找結(jié)束。最終分詞的結(jié)果為:“人民大會(huì)堂/真/雄偉”。如下圖演示了用正向最大匹配算法識(shí)別人民大會(huì)堂的過程,“真”,“雄偉”的識(shí)別類似。
2. 逆向最大匹配,這個(gè)和上面相反,就是倒著推理。比如“沿海南方向”,我們按正向最大匹配來做就會(huì)切分成 “沿海/南方/向”,這樣就明顯不對(duì)。采用逆向最大匹配法則來解決這個(gè)問題,從句子的最后取得“方向”這兩個(gè)字查找詞典找到“方向”這個(gè)詞。再加上“南方向”組成三字組合查找詞典沒有這個(gè)詞,查找結(jié)束,找到“方向”這個(gè)詞。以此類推,最終分出“沿/海南/方向”。
3. 雙向最大匹配,顧名思義就是結(jié)合正向最大匹配和逆向最大匹配,最終取其中合理的結(jié)果。最早由哈工大王曉龍博士理論化的取最小切分詞數(shù),比如“我在中華人民共和國家的院子里看書”,正向最大匹配切分出來為“我/在/中華人民共和國/家/的/院子/里/看書”工8個(gè)詞語,逆向最大匹配切分出來為“我/在/中華/人民/共/和/國家/的/院子/里/看書”共11個(gè)詞語。取正向最大匹配切出來的結(jié)果就是正確的。但是如果把上面那個(gè)例子“沿海南方向”雙向切分,都是3個(gè)詞語,改如何選擇?看第4個(gè)《最佳匹配法則》。
4. 最佳匹配法則,先準(zhǔn)備一堆文本語料庫、一個(gè)詞庫,統(tǒng)計(jì)詞庫里的每一個(gè)詞在語料庫里出現(xiàn)的次數(shù)記錄下來。最后按照詞頻高的優(yōu)先選出,比如“沿海南方向”,正向切分為:“沿海/南方/向”,逆向切分為:“沿/海南/方向”。其中“海南”的頻度最高,優(yōu)先取出來。剩下“沿”、“方向”也就正常切分了。是不是這就是基于詞典分詞的最佳方案?比如數(shù)學(xué)之美中提到的:“把手抬起來” 和 “這扇門的把手”,可以分為“把”、“手”、“把手”,不管怎么分總有一句話的意思不對(duì)。后續(xù)再介紹如何通過統(tǒng)計(jì)的分詞處理這些問題。
說了這么多,我們來實(shí)戰(zhàn)一下如何基于詞典的分詞:
public class TestPositiveMatch {
public static void main(String[] args) {
String str = "我愛這個(gè)中華人民共和國大家庭";
List<String> normalDict = new ArrayList<String>();
normalDict.add("");
normalDict.add("愛");
normalDict.add("中華"); //測試詞庫里有中華和中華人民共和國,按照最大匹配應(yīng)該匹配出中華人民共和國
normalDict.add("中華人民共和國");
int strLen = str.length(); //傳入字符串的長度
int j = 0;
String matchWord = ""; //根據(jù)詞庫里識(shí)別出來的詞
int matchPos = 0; //根據(jù)詞庫里識(shí)別出來詞后當(dāng)前句子中的位置
while (j < strLen) { //從0字符匹配到字符串結(jié)束
int matchPosTmp = 0; //截取字符串的位置
int i = 1;
while (matchPosTmp < strLen) { //從當(dāng)前位置直到整句結(jié)束,匹配最大長度
matchPosTmp = i + j;
String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串
if (normalDict.contains(keyTmp)) { //判斷當(dāng)前字符串是否在詞典中
matchWord = keyTmp; //如果在詞典中匹配上了就賦值
matchPos = matchPosTmp; //同時(shí)保存好匹配位置
}
i++;
}
if (!matchWord.isEmpty()) {
//有匹配結(jié)果就輸出最大長度匹配字符串
j = matchPos;
//保存位置,下次從當(dāng)前位置繼續(xù)往后截取
System.out.print(matchWord + " ");
} else {
//從當(dāng)前詞開始往后都沒有能夠匹配上的詞,則按照單字切分的原則切分
System.out.print(str.substring(j, ++j) + " ");
}
matchWord = "";
}
}
}
輸出結(jié)果為:我愛這個(gè)中華人民共和國大家庭
按照這樣我們一個(gè)基本的分詞程序開發(fā)完成。
對(duì)于文章一開始提到的問題還沒解決,如何讓程序識(shí)別文本中的感情色彩?,F(xiàn)在我們先要構(gòu)建一個(gè)感情色彩詞庫“高興”,修飾詞庫“沒”、"不”。再完善一下我們的程序:
public class TestSentimentPositiveMatch {
public static void main(String[] args) {
String str = "你假如上午沒給我吃冰淇淋,我絕對(duì)會(huì)不happy的。";
//語義映射
Map<String, String> sentimentMap = new HashMap<String, String>();
sentimentMap.put("happy", "高興");
//情感詞庫
List<String> sentimentDict = new ArrayList<String>();
sentimentDict.add("happy");
//修飾詞
List<String> decorativeDict = new ArrayList<String>();
decorativeDict.add("不");
decorativeDict.add("沒");
//修飾詞衡量分?jǐn)?shù)
Map<String, Double> decorativeScoreMap = new HashMap<String, Double>();
decorativeScoreMap.put("不", -0.5);
decorativeScoreMap.put("沒", -0.5);
List<String> decorativeWordList = new ArrayList<String>(); //修飾詞
String sentimentResult = ""; //情感結(jié)果
int strLen = str.length(); //傳入字符串的長度
int j = 0;
String matchSentimentWord = ""; //根據(jù)詞庫里識(shí)別出來的情感詞
String matchDecorativeWord = ""; //根據(jù)詞庫里識(shí)別出來的修飾詞
int matchPos = 0; //根據(jù)詞庫里識(shí)別出來詞后當(dāng)前句子中的位置
while (j < strLen) { //從0字符匹配到字符串結(jié)束
int matchPosTmp = 0; //截取字符串的位置
int i = 1;
while (matchPosTmp < strLen) { //從當(dāng)前位置直到整句結(jié)束,匹配最大長度
matchPosTmp = i + j;
String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串
if (sentimentDict.contains(keyTmp)) { //判斷當(dāng)前字符串是否在詞典中
matchSentimentWord = keyTmp; //如果在詞典中匹配上了就賦值
matchPos = matchPosTmp; //同時(shí)保存好匹配位置
}
if (decorativeDict.contains(keyTmp)) { //判斷當(dāng)前字符串是否在詞典中
matchDecorativeWord = keyTmp; //如果在詞典中匹配上了就賦值
matchPos = matchPosTmp; //同時(shí)保存好匹配位置
}
i++;
}
if (!matchSentimentWord.isEmpty()) {
//有匹配結(jié)果就輸出最大長度匹配字符串
j = matchPos;
//保存位置,下次從當(dāng)前位置繼續(xù)往后截取
System.out.print(matchSentimentWord + " ");
sentimentResult = sentimentMap.get(matchSentimentWord);
}
if (!matchDecorativeWord.isEmpty()) {
//有匹配結(jié)果就輸出最大長度匹配字符串
j = matchPos;
//保存位置,下次從當(dāng)前位置繼續(xù)往后截取
System.out.print(matchDecorativeWord + " ");
decorativeWordList.add(matchDecorativeWord);
} else {
//從當(dāng)前詞開始往后都沒有能夠匹配上的詞,則按照單字切分的原則切分
System.out.print(str.substring(j, ++j) + " ");
}
matchSentimentWord = "";
matchDecorativeWord = "";
}
double totalScore = 1;
for (String decorativeWord : decorativeWordList) {
Double scoreTmp = decorativeScoreMap.get(decorativeWord);
totalScore *= scoreTmp;
}
System.out.print("\r\n");
if (totalScore > 0) {
System.out.println("當(dāng)前心情是:" + sentimentResult);
} else {
System.out.println("當(dāng)前心情是:不" + sentimentResult);
}
}
}
通過傳入“你假如上午沒給我吃冰淇淋,我絕對(duì)會(huì)不happy的。”,結(jié)果輸出為:“當(dāng)前心情是:高興”。當(dāng)然你也可以改變其中的修飾詞,比如改為:“你假如上午沒給我吃冰淇淋,我絕對(duì)會(huì)happy的?!?,結(jié)果輸出為:“當(dāng)前心情是:不高興”。
機(jī)器再也不是冷冰冰的,看起來他能讀懂你的意思了。不過這只是一個(gè)開始,拋出幾個(gè)問題:
如何讓程序識(shí)別句子中的時(shí)間?比如“上午”、“下午2點(diǎn)”。
如何處理“把手抬起來” 和 “這扇門的把手”中的“把”與“手”的問題?
如何構(gòu)建海量的知識(shí)庫,讓程序從“嬰兒”變成“成年人”?
如何使用有限的存儲(chǔ)空間存儲(chǔ)海量的知識(shí)庫?
如何提高程序在海量知識(shí)庫中查找定位信息的效率?
如何識(shí)別新詞、人名、新鮮事物等未知領(lǐng)域?
宇宙蕓蕓眾生都是相通的,大腦也許就是一個(gè)小宇宙,在這個(gè)小宇宙又有很多星球、住著很多生物。而電腦也是宇宙中地球上的一個(gè)產(chǎn)物,只要存儲(chǔ)計(jì)算速度發(fā)展到足夠強(qiáng)大一定可以構(gòu)建成一個(gè)強(qiáng)大的大腦。
你看這個(gè)單詞 "testaword" 認(rèn)識(shí)嗎?可能不認(rèn)識(shí),因?yàn)槲覀兾骞傧全@取到的信息,然后根據(jù)大腦以往學(xué)習(xí)的經(jīng)驗(yàn)做出判斷。但是你看這個(gè)短語 " test a word" 認(rèn)識(shí)嗎?再看看開始那個(gè)單詞“testaword”是不是就親切多了?
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03