中文斷詞的新詞偵測技術 - Journey

文章推薦指數: 80 %
投票人數:10人

談到自然語言處理(NLP)的中文斷詞技術,我們通常都會直接聯想並使用Jieba ... 這裡使用的演算法的概念、說明參考自互联网时代的社会语言学:基于SNS的 ... 0% 談到自然語言處理(NLP)的中文斷詞技術,我們通常都會直接聯想並使用Jieba套件,網路上也有許多人分享了Jieba套件的功能介紹與使用方法。

但是當我在使用是卻感到非常困惑,困惑的地方在於,隨著時代的演進會不斷產生新的詞彙,那麼我們透過「過去定義好的字典,適合用來分析未來的資料嗎?」 文章架構 一定要新詞偵測嗎? 資料來源與說明 資料前處理 新詞偵測 展示成果 一定要新詞偵測嗎?在做文字探勘的分析時,首先的任務就是需要將非結構化的文字資料整理成結構化的形態,其中英文因為有空格作為字跟字之間的界限,因此可以很輕鬆的進行斷字。

在中文的文章中雖然有標點符號可以切分成不同的句子,但句子內並沒有空格能把句子斷成不同的詞,因此怎麼把句子斷成詞就是一門很大的學問。

Jieba就是幫我們把句子斷詞的套件,而斷詞的方法是透過事先定義的詞典來匹配文章,因此詞典的好壞很直接的影響了斷詞的成果,我們就直接來看看Jieba預設的斷詞結果吧! 123importjiebasent='蔡英文強調,希望其他產業也能台積電一樣,把台灣當作研發與生產的基地''/'.join(jieba.lcut(sent)) ‘蔡/英文/強調/,/希望/其他/產業/也/能/台積/電一樣/,/把/台灣/當作/研發/與/生產/的/基地’ 如上所示,原本是「蔡英文」被誤斷成「蔡」和「英文」,可想而知,這會讓我們在後續的分析成果中出現英文時沒辦法區辨出到底指的是語言的「英文」,還是總統的蔡「英文」。

同樣的「台積電」也被斷成了「台積」和「電一樣」(?) 我們再多看幾個例子就會發現,斷詞的結果仍有許多可以再改善的地方 12sent='法人預期,本季台積電營運表現可望淡季不淡,預估比去年第四季的營收高峰季減在5%以內。

''/'.join(jieba.lcut(sent)) ‘法人/預期/,/本季/台積/電營/運表現/可望/淡季/不淡/,/預估/比/去年/第四季/的/營收/高峰/季減/在/5%/以內/。

’ 12sent='法人預估台積公司今年營運將呈現高成長,營收將年成長15%至20%,並續創歷史新高紀錄。

''/'.join(jieba.lcut(sent)) ‘法人/預估/台積/公司/今年/營運將/呈現/高成/長/,/營收/將年/成長/15%/至/20%/,/並續/創歷史/新高/紀錄/。

’ 如果我們想要透過文字探勘來獲得有價值的資訊,那一定需要立基在好的斷詞結果之上,而Jieba則是透過比對詞典的方式來進行斷詞的。

但是除了最一開始曾提到「詞」會有時間的影響因素之外,在不同的產業、場域(現實/網路社群..等等)也都會有各自的專有名詞,而且這些因素彼此間還會彼此交互影響,這些因素都會讓情況變得相當複雜。

那麼字典到底要怎麼新增與維護呢?最直接的方式當然就是透過人工的方式維護字典,例如當我們看到「蔡英文」不在詞庫中時,我們就把這個詞增加進字典中,透過不斷地循環來增加詞典的豐富程度,但是這樣的缺點是需要花費大量的人力成本。

而看完這篇文章的你們,以後就可以透過統計的方式來幫助我們找出那些字可以組合成詞,讓我們可以輸入透過大量的語料庫,就自動得到一份專屬的詞典! 資料來源與說明資料來源收集資料最快的方式當然就是透過網路爬蟲的技術在網路上收集資料囉!這篇文章中的範例資料是我在中時新聞網上爬取有關台積電的新聞資料,有興趣的人可以點擊此處直接下載台積電新聞資料。

至於爬蟲的方法或想要爬其他關鍵詞新聞的人請參考如何透過爬蟲抓取中時新聞這篇文章。

資料說明基本上我把截至昨天為止在中時新聞網上面有關台積電的新聞都抓下來了,時間範圍是2009年11月至2020年1月的資料,共計15,455則新聞,包含以下欄位資訊 TITLE:新聞標題 TIME:新聞發佈時間 CATEGORY:新聞類型 DESCRIPTION:新聞摘要 CONTENT:新聞內文 KEYWORDS:新聞關鍵詞 FROM:新聞網站 LINK:新聞網址 資料前處理只保留中文字因為這裡是想要找出中文的新詞,因此在這裡先將新聞內文中的英文、數字、標點符號、emoji…等等的資料濾除,讓我們的語料庫只單純的保留下中文的文字,而中文字在Unicode的編碼落在「\u4e00」與「\u9fa5」之間,因此我們在這裡透過以下的正則表達式來保留我們需要的中文資料 按照年月串接新聞由於在新詞偵測時會需要使用到大量的運算資源,考量記憶體的負擔與運算時間的原因,在這裡我將新聞按照年月拆分,並將相同年月的新聞串接起來當做同一篇文章進行分析。

因此在後續新詞偵測的語料庫中,共有123篇文章(123個月份的資料) 新詞偵測演算法這裡使用的演算法的概念、說明參考自互联网时代的社会语言学:基于SNS的文本数据挖掘,說明如下 提取所有候選詞 我們的目的是希望在沒有預先定義好字典的情況下,透過統計的方法得到一份字典,因此會先透過窮舉的方式列出所有可能的詞。

通常會先設定詞最長的長度(建議設定為6)後再進行搜索。

以「天氣預報說周五會下雨」為例 長度2:天氣/氣預/預報/報說/說周/… 長度3:天氣預/氣預報/預報說/報說周/… 長度4:天氣預報/氣預報說/預報說周/報說周五/…. … 檢測指標1:詞頻 如同以上的範例,透過窮舉的方式我們當然可以把所有的詞都找出來,但同時也會找到許多錯誤的詞,如長度2中的「氣預」、「報說」、「說周」等等,因此我們可以透過統計詞頻的方式作為第一個檢測指標。

可以預見的是,當我們文章的長度夠長時,「正確的詞」出現的次數會遠高於「錯誤的詞」,因此我們可以將出現次數太少的詞濾除。

檢測指標2:內部凝固度(PMI) 以「電影院」為例,如果「電影」和「院」兩個詞是完全獨立的詞的話「電影院」在文章中的出現機率,應該會與出現「電影」的機率和出現「院」的機率乘積的值兩者會接近,這時候表示兩者可能是偶然拼接到一起的。

但如果「電影院」出現機率遠高於「電影」的機率乘上「院」的機率的話,表示兩個詞並不獨立,也就是這兩個詞可能是一個詞。

檢測指標3:外部自由度(Entropy) 除了看內部內部凝固度之外,還需要進一步看外部的表現。

如果一個文本片段能夠算作一個詞的話,它應該能夠靈活地出現在各種不同的環境中,具有非常豐富的左鄰字集合和右鄰字集合。

以「被子」和「輩子」為例,我們可以說「買被子」、「蓋被子」、「進被子」、「好被子」、「這被子」等等,在「被子」前面加各種字;但「輩子」的用法卻非常固定,除了「一輩子」、「這輩子」、「上輩子」、「下輩子」,基本上「輩子」前面不能加別的字了。

「輩子」這個文本片段前面可以出現的字太有限,以至於直覺上我們可能會認為,「輩子」並不單獨成詞,真正成詞的其實是「一輩子」、「這輩子」之類的整體。

綜合評分 這裡透過簡單的加總凝固度和自由度的得分來幫各個詞評分,接著我們就可以按照這個評分對資料集排序,並且自行決定合適的閾值(Threshold),來選擇要選幾分以上的詞作為我們的專屬字典。

實際在使用時,可以再自行調整這個綜合評分應該如何加權計算。

新詞偵測實作 在網路上已經有人將以上的演算法轉換成具體的程式碼,可以參考以下網站python简单实现新词发现,我在使用時僅有稍微調整這份程式碼就可以使用了。

以下我們分別列出分數最高與最低的50個詞彙,要強調的是這是我們沒有預先定義好字典的情況下透過統計方法自動計算得出的! 最高分的50個詞 醞釀/泡沫/犧牲/垃圾/槓桿/貢獻/余湘/蟄伏/駕駛/妙禪/禿鷹/夥伴/烘焙/泡麵/苗栗/辣椒/邏輯/肌肉/呼籲/野村/尺寸/犯罪/挖礦/漏洞/麒麟/蓬勃/敬鵬/古蹟/咖啡/徘徊/干擾/梅姬/螞蟻/卜蜂/硫酸/搜索/什麼/灌溉/鳳凰/侵蝕/陰霾/掌握/餐飲/烘托/紓困/瑕疵/霹靂/暑假/魔咒/雜誌 最低分的50個詞 復五日線/轉機題/逆勢收/能源教育/規劃未/中東緊張/負債表/險試產/目前多方取/決議每/台北時間/受制歐美/關鍵地位/也會是不錯/等類股拉回/多芬第九號/開發案/信心指數/去年度財報/長黎方/全年毛/統一及長榮/兩地/貿易戰休兵/低接/除息前/貨市場上則/統一超/後市不/鎳價/主要受惠/李秀利表示/度因工廠而/援極紫外/與股后方/上市櫃市值/外銷訂/年以來/交大/創歷年同/鞋與/本周納入/魏哲家表示/受惠於國際/無限可能/果砍/重啟協/運底部已/小幅成長/統初選 觀察一下應該就會發現高分的詞的結果都很符合我們的常識與邏輯,至於原本被錯誤斷詞的「蔡英文」與「台積電」也有成功斷出來(只是藏在後面一些些的排序);而最低分的50個詞中則出現許多不合理的詞彙。

我們可以把分數當做是否成詞的信心程度,在使用時還需要選擇一個合適閾值,並保留閾值以上的詞彙來當做字典。

年度關鍵詞以下是我透過tf-idf方法計算得出的年度關鍵字,如果對於tf-idf還不熟悉的人可以參考机器学习:生动理解TF-IDF算法,考量篇幅的原因我就不對資料預處理的過程進行說明了 2020 表示、去年、產能、資金、開高、不過、營收、第一、走高、晶片、投顧、高點、華為、貿易、處理器、加上、全球、美元、法人、預期、台灣、設備、表現、三星、帶動、美國、買超、產業、早盤、技術、今年、指出、行情、成長、漲幅、電子、製程、投資、半導體、億元、大漲、新高、持續、市場、奈米、指數、外資、股價、台股、台積電 2019 客戶、去年、漲幅、上漲、以及、明年、貿易戰、營運、美股、帶動、全球、加上、震盪、投資、影響、大立光、蘋果、資金、產業、晶片、指出、目前、美元、公司、台灣、製程、技術、法人、表示、預期、成長、電子、持續、半導體、表現、新高、美國、華為、買超、今年、早盤、營收、奈米、市場、億元、指數、外資、股價、台股、台積電 2018 美股、大陸、全球、股王、賣超、產業、獲利、投資、去年、半導體、震盪、下跌、買超、蘋果、影響、開高、指出、族群、權值、鴻海、預期、奈米、加上、早盤、股票、上漲、新高、美元、公司、大立光、暫報、表示、目前、美國、方面、台灣、成長、法人、持續、電子、表現、營收、今年、外資、股價、指數、市場、億元、台股、台積電 2017 企業、帶動、國際、今日、賣超、產業、整理、影響、漲幅、獲利、奈米、預期、開高、加上、半導體、震盪、族群、暫報、美元、投資、指出、買超、上漲、權值、公司、目前、蘋果、美國、萬點、股票、成長、法人、持續、表示、方面、台灣、鴻海、大立光、新高、營收、電子、表現、今年、股價、外資、市場、指數、億元、台股、台積電 2016 族群、震盪、經濟、大陸、加上、可望、整理、全球、獲利、資金、奈米、蘋果、今日、投資、去年、漲幅、賣超、權值、美元、上漲、金融、國際、公司、鴻海、暫報、美國、股票、指出、預期、目前、台灣、買超、持續、大立光、方面、成長、表示、新高、法人、表現、電子、營收、股價、今年、指數、外資、市場、億元、台股、台積電 雖然還有2009-2016的資料,但就不在這裡繼續列出來了。

從結果來看2019年爆發的美中貿易戰確實有被偵測出來。

同理,我們可以透過分析這些關鍵字來了解台積電在各個年度中發生了些什麼事情。

或者藉以監測公司的營運狀況、風險…等等。

今天的分享到這邊,我將台積電的新聞放入這份新詞偵測的演算法後,得到的結果如下,有需要這份字典的人也可以在這裡下載台積電專屬字典.xlsx 附件 台積電新聞資料_2009-2020 台積電專屬字典.xlsx TableofContents Overview 1.文章架構2.一定要新詞偵測嗎?3.資料來源與說明3.1.資料來源3.2.資料說明4.資料前處理4.1.只保留中文字4.2.按照年月串接新聞5.新詞偵測演算法5.1.提取所有候選詞5.2.檢測指標1:詞頻5.3.檢測指標2:內部凝固度(PMI)5.4.檢測指標3:外部自由度(Entropy)5.5.綜合評分6.新詞偵測實作7.年度關鍵詞8.附件 tlyu0419 Establishthiswebsiteforsharing.Hopefully,itwillhelpyou. 24 posts 46 tags GitHub E-Mail FBPage YouTube RSS



請為這篇文章評分?