手把手Jieba 中文斷詞Head first Chinese text segmentation

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

13. 結巴的斷詞演算法大概可分成兩個部份,第一個部分是建立Trie DAG 資料結構,快速算出全切分法所有合法的切分組合,再使用統計模型計算最佳結果。

最後 ... UpgradetoPro—sharedecksprivately,controldownloads,hideadsandmore… SpeakerDeck SpeakerDeck PRO Signin Signupforfree 手把手Jieba中文斷詞HeadfirstChinesetextsegmentation fukuball November02,2017 Programming 3 1.9k 手把手Jieba中文斷詞HeadfirstChinesetext segmentation 1.各位好,今天這堂課程是手把手Jieba中文斷詞,中文斷詞在中文自然語言處理上是非常重要的前置處理工作,如果中文斷詞能夠正確地將最小有意義的詞辨識出來,我們才有辦法進行更高層次的自然語言分析,因此中文斷詞的正確性影響了許多自然語言處理應用的成敗,像是,問答系統、自動摘要、文件檢索、機器翻譯等應用都需要先處理中文斷詞。

2.好,首先跟各位介紹一下我自己,我是林志傑,網路上常用的名字是Fukuball,所以各位可以用Fukuball這個關鍵字找到我。

我現在在KKBOX工作,之前在iNDIEVOX當過技術長、目前也是CodeTengu碼天狗技術週刊作者群之一,我使用PHP及Python,最近對機器學習很有興趣,空閒時開發了著名的中文斷詞程式Jieba的PHP版本,所以對中文斷詞有一些研究,今天會把我所知道的都分享給大家,讓大家都有收穫。

3.那,中文斷詞是什麼呢?簡單來說,就是讓電腦可以把中文詞彙以「意義」為單位切割出來,比如以「塵世中一個迷途小書僮」這個例子來說,沒有特別處理的話,電腦會將每個字分開處理,但這對我們來說是沒有意義的,因此在處理語意相關問題時,就會造成效果不佳。

如果能夠斷成「塵世/中/一個/迷途/小/書僮」,這樣對我們來說就有意義多了,對於語意理解也會比較有幫助。

4.這裡讓我們來說明一下中文斷詞有什麼特別的地方(說明投影片),以「我們在野生動物園玩」這句話來說,英文是「Weplayatthewildlifepark」,在英文中我們可以直接以句子中的空白來斷詞,即可斷出有意義的詞出來。

但中文我們沒有詞與詞之間的空白來斷詞,且中文中會有歧異詞的問題,因此「我們在野生動物園玩」可以斷出「我們/在野/生動/物/園/玩」或是「我們/在/野生/動物園/玩」,對我們來說,我們會希望電腦能斷出後面這個結果,但這個問題無法用簡單的programming來解決,這也是中文斷詞與英文斷詞不同的地方。

5.如果我們能夠讓電腦處理好中文斷詞,我們就能夠將斷詞後的結果數值化進行文本分析研究,這樣的自然語言處理過程對問答系統、自動摘要、文件檢索、機器翻譯、語音辨識等應用都會有幫助。

我們在這個講座會展示一個歌詞相似推薦的文件檢索系統,讓大家可以更清楚知道斷詞之後如何應用在實際的問題上。

6.從剛才介紹中,大家應該有看出中文斷詞並不是一個簡單的問題,那目前中文斷詞系統主要的困難會分成哪些面向呢?
 大致可以分成三個大難題,第一個是新詞識別這個難題,例如隨著語言的發展,我們會有新的詞被發明出來,像是特有名詞,例如:人名、地名,以及新發明的詞,例如:ptt中的魯蛇、溫拿等等,這樣的新詞在最早以字典為基礎的斷詞系統中很難被辨識出來,只要字典中沒有,斷詞系統就無法辨識,所以現今的斷詞系統多少要能夠解決某種程度的新詞識別。

第二個難題就是歧異詞識別,例如「我們/在野/生動/物/園/玩」或者是「我們/在/野生/動物園/玩」其實都是合法的斷詞結果,但意義卻完全不同,我們會希望斷詞系統能夠參考上下文斷出後面的結果,也就是能夠解決某種程度的歧異詞識別。

第三個難題就是目前越來越廣泛被使用到的表情符號,這本質上就是新詞識別,但有些斷詞系統會直接將符號忽略掉,因此就無法處理這個問題,因此如果文本中有大量的表情符號,在斷詞時就要好好注意有沒有處理到這個部分的問題。

7.了解了中文斷詞技術主要的困難點之後,我們來看看現今大部份斷詞系統是如何解決中文斷詞這個問題的。

第一個方法是使用正向最大批配法,我們會有一個詞典,將句子在詞典中由前向後比對,一一比對最長詞的匹配結果,就可以斷出「我們/在野/生動/物/園/玩」。

第二個方法是使用逆向最大批配法,我們將句子在詞典中由後向前比對,一一比對最長詞的匹配結果,就可以斷出「我們/在/野生/動物園/玩」。

另一個方法就是正向跟逆向都算一遍,取顆粒最大的,因此我們會斷出「我們/在/野生/動物園/玩」這個結果。

不過上面的做法都有缺點,只要詞典中沒有收錄句子中的詞,那可能效果會非常差。

因此現在大部份比較好的斷詞系統都是使用全切分方法,切分出與詞庫匹配的所有可能,然後再運用統計模型決定最好的切分結果。

我們這次要介紹的jieba中文斷詞程式就是使用類似這樣的方法完成的。

8.了解了中文斷詞的背景知識之後,大家可能會想要知道那究竟要怎麼做中文斷詞,我在這邊會直接推薦使用Jieba,因為我個人是工程師,還是以開發應用為導向,Jieba應該是目前最穩定也最容易使用的中文斷詞程式。

9.有人會問,中研院也有中文斷詞系統啊,那為何還要選擇使用Jieba? 10.其實曾經我也使用中研院斷詞系統,但使用過後才發覺問題很大,首先中研院斷詞系統很不穩定,常常回傳的資料有可能會有被截斷的情況,然後API也不夠完善,當功能不夠完整的時候,開發者就會想要去把它修改得更好,但中研院斷詞系統並非開源的Project,我們也無法調整它,讓這個斷詞系統可以變得更好用,所以最後只能往外尋找其他的資源。

11.後來就看到了Jieba這個斷詞程式,它最大的優點就是它是一個opensource的project,我們可以預期未來會有更多優秀的開發者加入開發Jieba,Jieba也會因為優秀開發者的加入而讓功能變得越來越完善,所以使用Jieba會是一個很好的選擇。

12.接下來我要稍微介紹一下Jieba斷詞演算法的思路,讓大家可以了解結巴的核心是如何處理中文斷詞的,了解演算法可以讓大家知道Jieba的弱點在哪邊,未來如果想要手動改善Jieba的效果,也能知道如何改起。

而這些知識也能夠在大家如果有需要開發自己的中文斷詞系統時帶來一些幫助。

13.結巴的斷詞演算法大概可分成兩個部份,第一個部分是建立TrieDAG資料結構,快速算出全切分法所有合法的切分組合,再使用統計模型計算最佳結果。

最後一步再使用HMM模型計算來辨識新詞。

14.我這邊大概整理了Jieba這個斷詞程式核心演算法如何運作的概觀,這是Jieba各個部份演算法大致的架構及處理流程,首先呢,我們輸入要進行斷詞的句子,這邊我們用Jieba它所提供的例子來說明,我們要將「終於,他來到了網易杭研大廈」這個句子進行斷詞,第一步就是使用正規式來將符號與文字切開,如此就會先斷成像投影片所顯示的這三個部分,第一個部分是「終於」,第二個部分是逗號,第三個部分是「他來到了網易杭研大廈」,然後結巴會把屬於文字的部分進行進一步的處理。

第二步Jieba會載入字典,建立一個Trie字典樹,等一下我們會詳細說明Trie字典樹的結構長什麼樣子,有了Trie字典樹之後,Jieba就開始比對句子中有沒有Trie字典樹中的詞,然後計算出句子有幾種切分組合,再把切分組合表示成一個有向無環圖,大致上這個無環圖可以這樣表示,(解釋),第三步再計算最佳的切分組合是什麼(解釋),在這邊我們就可以得到一個還不錯的結果,最後一步呢,我們看到有連續的單字詞出現,比如這個例子裡斷出的「杭」及「研」這個兩個單字詞,這時我們就可以把這些單字詞再組合起來丟到HMM模型計算看看是否能組成一個新的詞,計算結果是,「杭研」可以再組成一個詞,這就是整個Jieba斷詞程式的運作過程。

我接下來會稍微介紹一下各部分演算法的概念。

15.由剛剛的Jieba核心程式概觀,我們可以知道Jieba斷詞是先用字典來解決大部份的斷詞,我們可以稍微看一下原始碼中的字典,(翻開原始碼),字典的格式是長這樣,Jieba會載入這個字典,然後建立Trie樹,Trie樹又可以叫做前綴樹、字典樹,它可以增加字詞比對的速度,Trie樹的結構就是我投影片上畫出來的這個圖,上面會有每個字詞及它的機率值,程式在比對的時候,比如句子中出現了「在」這個字,那我們就可以得到0.2這個機率值,然後再把句子的下個字往後比對,如果剛好是「野」這個字,那就會得到0.3這個機率值,這兩個都算合法的斷詞結果,程式會把它記下來,然後就可以組合成底下這樣的有向無環圖,記錄了所有的斷詞切分組合及機率值,如此我們就可以根據統計模型的機率值計算出最佳的切分結果了。

16.再來,Jieba會將字典比對的斷詞結果中出現的連續單字詞進行組合,然後使用HMM隱馬可夫模型來計算新詞的組成。

隱馬可夫模型其實是由馬可夫模型所延伸過來的。

我們知道馬可夫模型是由狀態機率及狀態轉移機率所組成,隱馬可夫模型跟馬可夫模型不同的地方就在於隱這個字,馬可夫模型的狀態是可以直接觀察到的,而隱馬可夫模型的狀態是無法直接觀察到的,我們只能從其他的可觀測資料來猜出實際的狀態可能長什麼樣子。

17.隱馬可夫模型是由馬可夫模型延伸過來的,所以先來看一下什麼是馬可夫模型。

基本上馬可夫模型的概念就是選定一個狀態作為起點,然後沿著邊隨意走訪任何一個狀態,一直走一直走,沿途累積機率,走累了就停在某狀態。

舉例來說,猜天氣就可以使用到馬可夫模型,我們如果知道今天是雨天機率,也知道雨天跟晴天之間的轉移機率,那就可以猜猜看明天也是雨天或晴天的機率。

18.這邊我用一個實際的例子來說明,有一名旅客,三天後想到台南遊玩,由氣象報告得知今天的降雨機率為0.2,也知道晴天雨天的轉移機率如下,則此遊客三天後到台南遇到下雨的機率為多少?(解釋投影片) 19.同樣的,我們用猜天氣的例子來舉例說明隱馬可夫模型,比如現在有個人是瞎子,他無法直接觀察到天氣情況,但他可以察覺到人們在各種天氣中所進行的活動,比如有人在走動、有人在購物、地上是潮濕等,如果已經累積到足夠的資料量可以知道晴天時有多少機率有人在走動、在購物、地上是潮濕,雨天時有多少機率有人在走動、在購物、地上是潮濕,然後也知道雨天跟晴天之間的狀態轉移機率,最後我們看了瞎子記錄的最新三天的可觀察狀態,我們要試著去推算這三天是晴天或雨天,並算出一個最佳的組合,這就是隱馬可夫所要解決的問題。

20.隱馬可夫模型幾個重要的名詞我們再整理一下,我們有講到隱藏狀態,每個隱藏狀態會有他的初始機率值,在這個例子中的隱藏狀態就是晴天跟雨天。

然後隱藏狀態之間會有轉移機率值,在今天是雨天的情況下,明天是雨天的機率是多少,今天是晴天的情況下,明天是雨天的機率是多少,用一個矩陣把所有轉移機率值記下來,然後隱馬可夫模型會有可觀察狀態,每個隱藏狀態都會有若干個可觀察狀態,我們可以在隱藏裝態中觀察到各個可觀察狀態的機率值,在這個例子中的可觀察狀態,就是有沒有人在走動或購物或是地上潮濕。

21.好,從瞎子記錄的最新三天的可觀察狀態,我們要試著去推算這三天是晴天或雨天,並算出一個最佳的組合,它的其中一個組合路徑的算法公式大概就長這樣子。

這樣直接看公式會覺得很抽象,我們可以直接代入例子來了解這個公式(解釋公式)假設瞎子記錄的這三天可觀察狀態都是人有在外面走動,那其中一個組合就是三天都是晴天,我們去計算這個組合的機率值。

(解釋公式)所以我們就讓程式去把每一個組合的機率值都算出來,得到的最大值結果就可能是最符合真實的組合。

22.如果大家還不清楚的話,這邊我們詳細算一次給大家看。

(解釋投影片) 23.把剛才的猜天氣例子舉一反三轉換到斷詞這個問題,斷詞其實就是我們要去猜字在句子中組合的結構,字在句子的結構可分成四種結構,我們稱為BMES,B代表開頭,M代表中間,E代表結尾、S代表獨立成詞,而我們要去猜字是屬於這四種結構的哪一種,所以結構就是隱藏狀態,而我們可以看到字的序列,所以字的序列本身就是可觀察狀態。

套到剛才猜天氣的計算公式,我們將每種結構的排列組合都計算出一個機率值,最大的機率值結果,其實就是最佳的斷詞結果。

比如:「在野生動物園」可能就會算出SBEBME這個排列組合會得到最大的機率值。

(看原始碼幫助理解) 24.了解了結巴的演算法之後,我們來看看結巴斷詞程式如何使用。

25.我這邊要先跟各位說明一下,要使用Jieba斷詞程式最好還是用UnixBase相關的作業系統,比如:Ubuntu或Mac,比較不會遇到Unicode相關問題,而且安裝環境也會比較方便,大家可以看這張投影片所提供的連結找到符合自己作業系統如何安裝Python。

26.而當你照著文章的步驟裝好了Python,你同時也會安裝好了pip這個Python的套件管理工具。

pip可以讓你很方便的安裝其他開發者所提供的第三方套件,如果你沒有使用pip來管理其他開發者所提供的套件,就需要自己手動去抓這些套件回來,有些比較複雜的套件,可能會與其他的套件有相依關係,這時你就要自己去處理這些問題。

如果你是使用pip這個管理工具來安裝套件,他如果偵測到目前要裝的套件跟其他套件有相依關係,就會自動幫你處理好,所以最好都使用pip來安裝管理第三方套件。

使用別人的套件也是一種設計模式,它讓我們不用重新製造輪子,當別人有寫好的套件,我們可以直接使用,然後專注于我們自己的專案開發,這就叫做Dry(Don’tRepeatYourself)。

27.裝好之後我們要先裝一下Virtualenv這個套件。

這個套件可以讓我們在開發Python相關程式的時候可以創造一個分開且完全乾淨不會互相干擾的Python環境。

相關指令如下:(說明投影片) 28.接下來就是安裝Jieba套件,只要下這個指令就會安裝好了,非常簡單~ 29.今天的展示的程式碼大家都可以在這邊下載來自己玩玩看。

30.那我們實際來使用一下Jieba的斷詞,這是我寫好的一個SampleCode,斷詞模式是使用預設的精確斷詞模式,我們想要斷詞的句子是「塵世中一個迷途小書僮」、「我們在野生動物園玩」及「林志傑是結巴PHP的作者」,「我們在野生動物園玩」會有歧異詞的問題,「林志傑是結巴PHP的作者」會有新詞識別的問題,程式的語法就是使用jieba.cut來進行斷詞(解釋原始碼),我們來執行程式看一下結果。

(開終端機) 31.好,這就是我們剛剛執行程式的結果,感覺結果還不錯。

32.Jieba還有提供另一個斷詞模式,叫做全模式,我們只要加上一個參數cut_all,然後設成True,就可以切換成全模式。

全模式的斷詞結果會將所有可以成詞的部份都列出來。

我們可以來實際執行一下看有沒有什麼不一樣的地方。

(開終端機) 33.好,這就是我們剛剛執行的結果,上面是精確模式,下面是全模式,大家應該可以很清楚的比較出不同,精確模式就是演算法得出的最精確斷詞結果。

而全模式會把所有在句子中可以成為一個詞的詞都列出來。

一般來說我們都會是使用上面的精確模式來斷詞,但有時,例如在做搜尋功能的時候,可能就會使用到全模式。

34.Jieba還有一個功能可以列出斷詞結果在句子中的位置,語法就像這樣(解釋原始碼),jieba.tokenize,這邊要特別注意字串的前面要加一個u字,統一將字串都轉成unicode來處理。

我們來執行程式實際看一下結果。

(開終端機) 35.結果就像這樣,從0斷到第2個字,以此類推。

36.Jieba也有標注斷詞詞性的功能,語法就像這樣,使用pseg.cut來進行斷詞,得到斷詞詞性的結果。

我們來執行程式實際看一下結果。

(開終端機) 37.左邊就是斷詞結果,右邊就是斷詞的詞性,我們要去對一下詞性的列表,才可以知道這些符號的意義。

以上就是Jieba這個斷詞程式大概的使用方法及功能。

38.接下來我們用一些實際的例子來看看Jieba的斷詞效果。

因為我的公司主要是做音樂相關的資料,所以這邊就用歌詞分析來看看Jieba的斷詞效果。

這裡我們用回聲樂團的座右銘這首歌來進行斷詞。

投影片上就是這首歌的歌詞,也就是我們要進行斷詞的文本。

39.這是歌詞斷詞的SampleCode(解釋原始碼),我們在這邊沒有切換詞庫,直接使用預設的詞庫,我們來執行程式看一下結果。

(開終端機) 40.其實如果我們使用預設詞庫,我們會發現斷詞的結果很不理想(解釋投影片) 41.我們再整理一下剛才的斷詞結果,「座右銘」被斷成了「座/右銘」,「墓誌銘」被斷成了「墓誌/銘」,主要是因為預設詞庫是簡體中文,因此這樣的斷詞結果大部分是使用HMM的演算法猜測出來的,所以也相對不準確。

使用足夠的詞庫來進行斷詞會得到比較精確的斷詞結果。

42.好,那就讓我們切換到繁體詞庫試試看,這是SampleCode(解釋原始碼),我們來執行程式看一下結果。

(開終端機) 43.其實如果我們使用繁體詞庫,我們會發現斷詞的結果很變理想了(解釋投影片) 44.我們再整理一下剛才的斷詞結果,「座右銘」成功斷成「座右銘」,「墓誌銘」也成功斷成「墓誌銘」了,所以只要有足夠的詞庫,加上HMM的演算法,就可以得到不錯的斷詞結果。

45.Jieba還有一個功能,它可以算出文章中的關鍵字,語法就像這樣(解釋原始碼),我們來執行程式看一下結果。

(開終端機) 46.這就是Jieba算出來文章中的關鍵字,(解釋投影片) 47.那Jieba究竟是怎麼算出文章的關鍵字的呢?其實他背後的演算法就是使用TF-IDF這個演算法,這個演算法的核心概念就是「某個詞在一篇文章中出現的頻率高,且在其他文章中很少出現,則此詞語為具代表性的關鍵詞」,(解釋公式),我們也可以從這個演算法知道,為何說斷詞會是文本分析的基礎,因為斷詞之後,我們才可以計算詞頻,將詞轉換成數值,進一步發展出更多的演算法。

48.另外,Jieba也可以設定停用詞,停用詞就是一些比較沒有意義的詞,我們可以直接去除掉的,我們可以看一下停用詞列表,大家可以一自己的文本情況設定自己的停用詞詞典。

使用停用詞的方法如投影片。

49.如此我們可以讓關鍵字更凸顯出來。

50.從剛剛的例子,我們已經多少了解Jieba斷詞程式的斷詞效果了,那我們可以再提高斷詞的準確性嗎?大致上可以再做調整的方式有幾個,一個是調整文本資料,如HMM模型中的觀察機率及轉移機率以及詞典切分統計模型的機率值,但這需要搜集大量的資料,並整理分析才能完成。

或者是我們可以再去調整斷詞的演算法,目前也有很多人繼續研究斷詞的演算法,可能可以增加斷詞的效率,或是增加斷詞的效果。

另外一個比較快的方式就是使用自定義詞典,直接用較大的字典來增加斷詞的效果。

目前Jieba就有API可以讓研究者使用自定義詞典來增進斷詞的效果。

51.這邊就來跟大家說明一下Jieba使用自定義詞典的方法,語法就是jieba.load_userdict,這樣就可以了。

需要注意一下自定義詞典的格式,我們來看一下(看原始碼) 52.除了事先定義好自訂義字典,jieba也提供了一個可以在程式中動態增加字詞的方法,語法就像這樣(解釋原始碼),我們可以實際來使用看看(LiveDemo)(全台大停電) 53.剛剛我們用Jieba來實際看看國語歌詞的斷詞效果,現在如果是台語歌詞,不知道斷詞結果會如何,我們這邊就用滅火器的島嶼天光這首歌來試試看 54.好,這是SampleCode(解釋原始碼),我們來執行程式看一下結果。

(開終端機) 55.其實斷詞的結果還算不錯,有些明顯是台語用法的詞才會有斷詞效果不好的問題(解釋投影片) 56.我們再整理一下剛才的斷詞結果,「「袂當」斷成了「袂」「當」,「袂記」斷成了「袂」「記」,「袂有」斷成了「袂」「有」,這都是明顯的台語用詞,所以jieba目前無法處理,快速的解法就是使用自定義詞典。

57.這是使用自定義詞典的SampleCode(解釋原始碼),我們來執行程式看一下結果。

(開終端機) 58.如此斷詞的效果就變得更好了(解釋投影片) 59.所以從剛剛的結果來看,我們使用了自定義詞典之後,斷詞結果可以符合我們預期,這是因為我在自定義詞典裡加了這幾個台語用詞(解釋投影片) 60.以上大概就是Jieba斷詞程式如何使用的所有內容,基本上我們可以利用Jieba來幫助我們完成中文斷詞的工作了,但斷完詞要幹嘛呢?當然要實際應用到真實的應用系統啊! 61.大家可以思考看看中文斷詞後可以用在什麼樣的地方,想想自己可以做出什麼樣的應用。

比如我們公司是做音樂的,我們就可以用在歌詞分析,或者是分析歌詞自動建立情境歌單,或者是為創作者做一個自動填詞的功能,或者是做一個相似歌詞推薦的功能。

我這邊來展示一下如何將斷詞應用到一個相似歌詞推薦系統。

62.相似歌詞推薦系統大致的開發訓練流程如下:第一步,我們使用結巴中文斷詞將斷好詞的歌詞集合成一個資料集;然後我們需要去掉一些無用的停用字;接下來將每首歌詞做encoding,把歌詞轉成用向量來表示;接下來使用LSA語意分析演算法進行降維,讓歌詞的潛在語意被凸顯出來;最後我們就可以使用cosinsimilarity來計算歌詞之間的相似度了。

我這邊使用了gensim套件處理步驟2-5,但全部自幹也不算太難。

因此完成這個訓練之後,我們就可以輸入一首歌詞,讓系統能夠推薦出語意相似的歌詞。

63.讓我們實際展示一下吧! 64.這是剛才輸入的歌詞:楊培安的「我的驕傲」,推薦出來的結果很理想,前五名是:「楊培安我的驕傲」、「五月天倔強」、「張雨生我的未來不是夢」、「五月天憨人」、「五月天一顆蘋果」基本上都是有關「夢想」、「不放棄」、「勵志」相關的歌曲。

65.如果我們把歌詞攤開來看,我們的確可以感覺到歌詞中的語意是很相似的(分析歌詞) 69.我們再展示一個例子,輸入周杰倫的「安靜」,推薦出來的結果很理想,前五名是:「周杰倫安靜」、「黃品源那麼愛你為什麼」、「孫燕姿我不難過」、「陳奕迅婚禮的祝福」、「周杰倫斷了的弦」基本上都是有關「失戀」、「分手」、「心碎」相關的歌曲。

70.以上我們展示了如何應用中文斷詞到實作一個簡單的相似歌詞推薦系統,接下來我們來看一些其他有趣的議題。

71.網路上有人問「下雨天留客天留我不留」及「海水朝朝朝朝朝朝朝落;浮雲長長長長長長長消」會有什麼樣的斷詞結果,我們可以來實際試一下看看。

其實這樣的問題各種斷法都有其意義,因此不太算是中文斷詞需要去解決的問題。

72.另外,從使用結巴的經驗來看,結巴對於新詞辨識的表現還算不錯,但對於歧異詞辨識可能還需要加強,有時會出錯。

歧異詞辨識前最有效的解法是使用DeepLearningLSTM模型來處理斷詞,我自己也有訓練出一個簡體中文的斷詞模型,能夠比較有效的解決歧異詞辨識的問題。

73.這就是我今天這個講題所有的內容,希望大家都有得到收獲,如果有問題可以現在發問,或者用上面這些方式與我聯繫,謝謝! fukuball November02,2017 Tweet Share MoreDecksbyfukuball SeeAllbyfukuball AI工具手把手工作坊/HandsonAITools fukuball 8 1.3k HUGO靜態網站生成器2分鐘上手/CreateStaticWebsitewithHugoin2minutes fukuball 1 3.4k 中文斷詞:斷句不要悲劇/HeadfirstChinesetextsegmentation fukuball 8 22k 機器學習與智慧音樂應用/MachineLearningandtheIntelligentMusicApplication fukuball 2 1.4k iNDIEVOXOpenData/API智慧音樂應用:AnIntroducetoiNDIEVOXOpenData/APIandtheintelligentmusicapplication fukuball 5 1.8k iNDIEVOX踏入演唱會售票之後的快速蛻變:HowwebuildascalablePHPwebsiteforticketing fukuball 11 2.2k JIEBA結巴中文斷詞 fukuball 55 30k OtherDecksinProgramming SeeAllinProgramming JakartaEE10-FeaturebyFeaturewithMyOpenSourceJourney ivargrimstad 0 330 SREbridgethegap:FeaturedevelopmenttoCoreAPI/機能開発チームとコアAPIチームの架け橋としてのSRE kenzan100 1 1.2k ReactNativeアプリにStorybookCSF3.0を導入しよう texmeijin 0 110 RethinkingAuthforSPAsandMicroFrontends:EasyandSecureWithGateways manfredsteyer PRO 0 100 JetpackCompose頑張らないPreviewParameterProvider horie23 0 120 dotdotdot_in_predict_function bk_18 1 110 PythonユーザによるRust入門 rmizuta3 3 1.8k モダンとレガシーが混在するDMMブックスで培ったSREPractices onohiroshi1 0 640 Quartoを使ってみませんか/quarto_get_started s_uryu 2 520 LearningDDD輪読会#4/LearningDDDBookClub#4 suzushin54 1 180 競プロへの誘-いざな- u76ner 0 390 [RailsConf2022]Thepitfallsofrealtime-ification palkan 0 430 Featured SeeAllFeatured jQuery:Nuts,BoltsandBling dougneiner 56 6.4k HowGitHubUsesGitHubtoBuildGitHub holman 465 280k DesignandStrategy:HowtoDealwithPeopleWhoDon’t"Get"Design morganepeng 103 16k IntergalacticJavascriptRobotsfromOuterSpace tanoku 261 25k Fontdeck:RealignnotRedesign paulrobertlloyd 73 4.1k GraphQLとの向き合い方2022年版 quramy 16 8.2k Large-scaleJavaScriptApplicationArchitecture addyosmani 499 110k HelpingUsersFindTheirOwnWay:CreatingModernSearchExperiences danielanewman 7 1k BuildTheRightThingAndHitYourDates maggiecrowley 19 1.2k Testing201,or:GreatExpectations jmmastey 21 5.4k TheWorldRunsonBadSoftware bkeepers PRO 57 5.3k GraphQLの誤解/rethinking-graphql sonatard 25 6.3k Transcript ⼿手把⼿手Jieba中⽂文斷詞HeadfirstChinesetextsegmentationFukuballLin @社群媒體資料分析 關於我Fukuball/林林志傑FukuballLin@社群媒體資料分析簡介幕僚僚⼯工程師 中⽂文斷詞中⽂文斷詞是什什麼?•讓電腦把詞彙以「意義」為單位切割出來來•例例如:塵世中⼀一個迷途⼩小書僮•X塵/ 世/中/⼀一/個/迷/途/⼩小/書/僮•O塵世/中/⼀一個/迷途/⼩小/書僮FukuballLin@社群媒體資料分析 中⽂文斷詞中⽂文斷詞與英⽂文斷詞不同•我們在野⽣生動物園玩vsWeplayatthewildlife park•We/play/at/the/wildlife/park•我們/在野/⽣生動/物/園/玩or我們/在/野⽣生/動物園/玩FukuballLin@社群媒體資料分析 中⽂文斷詞中⽂文斷詞的⽤用處•⽂文本分析研究•問答系統、⾃自動摘要、⽂文件檢索、機器翻譯、語⾳音辨識FukuballLin@ 社群媒體資料分析 中⽂文斷詞中⽂文斷詞技術的難題•新詞識別•特有名詞:⼈人名、地名,魯魯蛇、溫拿•歧異異詞識別•我們 /在野/⽣生動/物/園/玩or我們/在/野⽣生/動物園/玩•表情符號識別•XDDDD、:)、0rzFukuballLin@社群媒體資料分析 中⽂文斷詞常⽤用解法•正向最⼤大匹配法:我們/在野/⽣生動/物 /園/玩•逆向最⼤大匹配法:我們/在/野⽣生/動物園/玩•雙向最⼤大匹配法:兩兩種算法都算⼀一遍,取顆粒最⼤大•全切分⽅方法:切分出與詞庫匹配的所有可能詞,再運⽤用統計語⾔言模型決定最優切分結果FukuballLin@社群媒體資料分析 中⽂文斷詞:⾸首選JiebaFukuballLin@社群媒體資料分析 中研院也有中⽂文斷詞系統啊?Jieba結巴FukuballLin@社群媒體資料分析 曾經我也使⽤用中研院斷詞系統,直到我膝蓋中了了⼀一箭FukuballLin@社群媒體資料分析 擁抱開源碼Jieba結巴FukuballLin@社群媒體資料分析 Jieba斷詞演算法FukuballLin@社群媒體資料分析 Jieba斷詞演算法•建立TrieDAG,使⽤用全切分⽅方法,統計模型計算最佳結果•未知詞(新詞)使⽤用HMM 模型計算辨識出來來斷詞演算法FukuballLin@社群媒體資料分析 斷詞演算法Jieba結巴斷詞演算法概觀正規式處理理需要斷詞處理理的字串串Trie樹比對建立DAG圖統計模型計算最佳切分路路徑 利利⽤用HMM模型得出未知詞斷詞結果終於,他來來到了了網易易杭研⼤大廈終於,他來來到了了網易易杭研⼤大廈{0:[0,1],1:[1]}{0:[0],1:[1,2],2:[2],3:[3],4:[4,5],5:[5],6:[6],7:[7],8:[8,9],9:[9]}1他3來來到4了了6網易易7杭8研10⼤大廈終於,,,他,來來到,了了,網易易,杭研,⼤大廈杭研FukuballLin@社群媒體資料分析 TrieDAG計算最佳切分路路徑•Trie樹-前綴樹、字典樹,增加比 對速度•DAG有向無環圖root在野0.3動物⽣生動0.3活0.2……在0.2野⽣生0.4斷詞演算法在0.2野0.3野⽣生0.4⽣生動0.3物動物0.2園0.1園0.3物0.1園0.1園0.3FukuballLin@社群媒體資料分析 HMM模型及Viterbi算法(1)斷詞演算法•什什麼是HMM隱⾺馬可夫模型(HiddenMarkov Model)•只能觀察到觀察序列列O(果),無法觀察到狀狀態序列列S(因)FukuballLin@社群媒體資料分析 ⾺馬可夫模型補充(1)斷詞演算法•⾺馬可夫模型:選⼀一個狀狀態作為起點,然後沿著邊隨意走訪任何⼀一個狀狀態,⼀一直走⼀一直走,沿途累積機率,走累了了就停在某狀狀態。

•舉例例:猜天氣,可直接觀察到天氣狀狀態及轉移機率FukuballLin @社群媒體資料分析 ⾺馬可夫模型補充(2)•有⼀一名旅客,三天後想到台南遊玩,由氣象報告得知今天的降雨機率為0.2,也知道晴天雨天的轉移機率如下,則此遊客三天後到台南遇到下雨的機率為多少?斷詞演算法FukuballLin @社群媒體資料分析 HMM模型及Viterbi算法(2)•舉例例:猜天氣,只能看到⼈人們的⾏行行為,但看不到天氣狀狀態,所以由觀察⾏行行為來來估算實際天氣情況斷詞演算法FukuballLin @社群媒體資料分析 HMM模型及Viterbi算法(3)•隱藏狀狀態•轉移機率•觀察狀狀態 •觀察狀狀態機率斷詞演算法FukuballLin@社群媒體資料分析 HMM模型及Viterbi算法(4)•其中⼀一條路路徑的算法斷詞演算法FukuballLin@ 社群媒體資料分析 HMM模型及Viterbi算法(5)斷詞演算法states=('Rainy','Sunny')observations =('walk','shop','clean')start_probability={'Rainy':0.6,'Sunny':0.4}transition_probability={'Rainy':{'Rainy':0.7,'Sunny':0.3},'Sunny':{'Rainy':0.4,'Sunny':0.6},}emission_probability={'Rainy':{'walk':0.1,'shop':0.4,'clean':0.5},'Sunny':{'walk':0.6,'shop':0.3,'clean':0.1},}觀察狀狀態:走走走晴晴晴0.4*(0.6)*0.6*(0.6)*0.6*(0.6)=0.031104雨晴晴0.6*(0.1)*0.3*(0.6)*0.6*(0.6)=0.003888雨雨晴0.6*(0.1)*0.7*(0.1)*0.3*(0.6)=0.000756雨晴雨0.6*(0.1)*0.3*(0.6)*0.4*(0.1)=0.000432晴雨雨0.4*(0.6)*0.4*(0.1)*0.7*(0.1)=0.000672雨雨雨0.6*(0.1)*0.7*(0.1)*0.7*(0.1)=0.000294最⼤大機率組合:晴晴晴!!!FukuballLin@社群媒體資料分析 HMM模型及Viterbi算法(6)•轉換到斷詞(看原始碼幫助理理解)-隱藏狀狀態:BMES,B(開頭)M(中間)E(結 尾)S(獨立成詞)-觀察狀狀態:所有可以看到的字•由觀察到的字詞序列列,計算出最⼤大的BMES機率組合•在野⽣生動物園:SBEBME斷詞演算法FukuballLin@社群媒體資料分析 Jieba結巴實作FukuballLin@社群媒體資料分析 Python安裝•官⽅方網站:https://www.python.org/downloads/•InstallingPythononMacOS X(使⽤用homebrew)-http://docs.python-guide.org/en/latest/starting/install/osx/•InstallingPythononWindows-http://docs.python-guide.org/en/latest/starting/install/win/結巴實作 PIP是什什麼•Python的套件管理理⼯工具•DRY(Don'tRepeatYourself) 結巴實作 Virtualenv安裝與使⽤用$pipinstallvirtualenv$virtualenvENV$ cdENV$sourcebin/activate$deactivate安裝創建虛擬環境進入虛擬環境資料夾啟動虛擬環境退出虛擬環境結巴實作FukuballLin@社群媒體資料分析 Jieba安裝$pipinstalljieba安裝結巴實作FukuballLin @社群媒體資料分析 範例例程式碼下載•全部檔案位址-https://bit.ly/chinese-seg結巴實作FukuballLin@社群媒體資料分析 斷詞精確模式(demo01)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")seg_list=jieba.cut("塵世中⼀一個迷途⼩小書僮")print(" /".join(seg_list))seg_list=jieba.cut("我們在野⽣生動物園玩")print("/".join(seg_list))#歧異異詞辨識seg_list=jieba.cut("林林志傑是結巴PHP的作者")print("/".join(seg_list))#新詞辨識結巴實作FukuballLin@社群媒體資料分析 斷詞精確模式執⾏行行結果塵世/中/⼀一個/迷途/⼩小 /書僮我們/在/野⽣生/動物園/玩林林志傑/是/結巴/PHP/的/作者結巴實作FukuballLin@社群媒體資料分析 斷詞全模式(demo02)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")seg_list=jieba.cut("我來來到北京清華⼤大學")print(" /".join(seg_list))seg_list=jieba.cut("我來來到北京清華⼤大學",cut_all=True)print("/".join(seg_list))結巴實作FukuballLin@社群媒體資料分析 斷詞全模式執⾏行行結果我/來來到/北京/清華⼤大學我/ 來來到/北京/清華/清華⼤大學/華⼤大/⼤大學結巴實作FukuballLin@社群媒體資料分析 斷詞返回原⽂文的起⽌止位置(demo03)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")result=jieba.tokenize(u'圖畫裡,龍不吟,虎不嘯,⼩小⼩小書僮可笑可笑') fortkinresult:print("word%s\t\tstart:%d\t\tend:%d"%(tk[0],tk[1],tk[2]))結巴實作FukuballLin@社群媒體資料分析 斷詞返回原⽂文的起⽌止位置執⾏行行結果word圖畫start:0end:2word裡start:2 end:3word,start:3end:4word龍不吟start:4end:7word,start:7end:8word虎不嘯start:8end:11word,start:11end:12word⼩小⼩小start:12end:14word書僮start:14end:16word可笑start:16end:18word可笑start:18end:20結巴實作FukuballLin@社群媒體資料分析 詞性標注(demo04)#encoding=utf-8importjiebaimportjieba.possegaspsegjieba.set_dictionary("data/dict.txt.big") words=pseg.cut("颱風就是要泛⾈舟啊不然要幹嘛")forword,flaginwords:print('%s%s'%(word,flag))結巴實作FukuballLin@社群媒體資料分析 詞性標注執⾏行行結果颱風x就是d要v泛⾈舟nz啊 zg不然c要v幹嘛x詞性列列表:https://gist.github.com/luw2007/6016931結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例⼀一(demo05)我沒有⼼心我沒有真實的⾃自我我只有消瘦的臉孔所謂軟弱所謂的順從⼀一向是我的座右銘⽽而我沒有那海海洋的寬闊 我只要熱情的撫摸所謂空洞洞所謂不安全感是我的墓誌銘⽽而你是否和我⼀一般怯懦是否和我⼀一般矯作和我⼀一般囉唆我沒有⼒力力我沒有滿腔的熱火我只有滿肚的如果所謂勇氣所謂的認同感是我隨便便說說⽽而你是否和我⼀一般怯懦是否和我⼀一般矯作是否對你來來說只是⼀一場遊戲雖然沒有把握⽽而你是否和我⼀一般退縮是否和我⼀一般肌迫是否對你來來說回聲樂團座右銘結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:中⽂文歌詞斷詞,使⽤用預設詞庫#encoding=utf-8importjiebacontent=open('data/lyric1.txt','rb').read()print "Input:",contentwords=jieba.cut(content)print("/".join(words))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:中⽂文歌詞斷詞,使⽤用預設詞庫執⾏行行結果我/沒/有⼼心/我/ 沒/有/真實/的/⾃自我/我/只有/消瘦/的/臉孔/所謂/軟弱/所謂/的/順/從/⼀一向/是/我/的/座/右銘/⽽而/我/沒有/那/海海洋/的/寬闊/我/只要/熱情/的/撫/摸/所謂/空洞洞/所謂/不安全感/是/我/的/墓誌/銘/⽽而/你/是否/和/我/⼀一般/怯懦/是否/和/我/⼀一般/矯作/和/我/⼀一般/囉/唆/⽽而/你/是否/和/我/⼀一般/退縮/是否/和/我/⼀一般/肌迫/⼀一般/地/困惑/我/沒/有⼒力力/我/沒/有/滿腔/的/熱火/我/只有/滿肚/的/如果/所謂/勇氣/所謂/的/認/同感/是/我/隨便便/說/說/⽽而/你/是否/和/我/⼀一般/怯懦/是否/和/我/⼀一般/矯作/是否/對/你/來來/說/只是/⼀一場/遊戲/雖然/沒/有把握/⽽而/你/是否/和/我/⼀一般/退縮/是否/和/我/⼀一般/肌迫/是否/對/你/來來/說/只是/逼不得已/雖然/沒有/藉⼝口結巴實作FukuballLin@社群媒體資料分析 中⽂文歌詞斷詞,使⽤用預設詞庫結果分析•「座右銘」被斷成了了「座/右銘」•「墓誌銘」被斷成了了「墓誌/銘」 •預設詞庫是簡體中⽂文結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:中⽂文歌詞斷詞,使⽤用繁體詞庫(demo06)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")content=open('data/lyric1.txt', 'rb').read()print"Input:",contentwords=jieba.cut(content)print("/".join(words))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:中⽂文歌詞斷詞,使⽤用繁體詞庫執⾏行行結果我/沒有/⼼心/我/ 沒有/真實/的/⾃自我/我/只有/消瘦/的/臉孔/所謂/軟弱/所謂/的/順從/⼀一向/是/我/的/座右銘/⽽而/我/沒有/那/海海洋/的/寬闊/我/只要/熱情/的/撫摸/所謂/空洞洞/所謂/不安全感/是/我/的/墓誌銘/⽽而/你/是否/和/我/⼀一般/怯懦/是否/和/我/⼀一般/矯作/和/我/⼀一般/囉唆/⽽而/你/是否/和/我/⼀一般/退縮/是否/和/我/⼀一般/肌迫/⼀一般/地/困惑/我/沒有/⼒力力/我/沒有/滿腔/的/熱火/我/只有/滿肚/的/如果/所謂/勇氣/所謂/的/認同感/是/我/隨便便說說/⽽而/你/是否/和/我/⼀一般/怯懦/是否/和/我/⼀一般/矯作/是否/對/你/來來說/只是/⼀一場/遊戲/雖然/沒有/把握/⽽而/你/是否/和/我/⼀一般/退縮/是否/和/我/⼀一般/肌迫/是否/對/你/來來說/只是/逼不得已/雖然/沒有/藉⼝口結巴實作FukuballLin@社群媒體資料分析 中⽂文歌詞斷詞,使⽤用繁體詞庫結果分析•「座右銘」成功斷成「座右銘」•「墓誌銘」也成功斷成「墓誌銘」結巴實作FukuballLin@ 社群媒體資料分析 使⽤用實例例:取出⽂文章中的關鍵詞(demo07)#encoding=utf-8importjiebaimportjieba.analysejieba.set_dictionary("data/dict.txt.big")content= open('data/lyric1.txt','rb').read()print"Input:",contenttags=jieba.analyse.extract_tags(content,10)print"Output:"print("/".join(tags))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:取出⽂文章中的關鍵詞執⾏行行結果所謂/沒有/是否/⼀一般/ 矯作/來來說/怯懦/墓誌銘/退縮/寬闊結巴實作FukuballLin@社群媒體資料分析 TF-IDF關鍵詞算法•某個詞在⼀一篇⽂文章中出現的頻率⾼高,且在其他⽂文章中很少出現,則此詞語為具代表性的關鍵詞•TermFrequency•Inverse DocumentFrequency•TF-IDF結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:關鍵詞去除停⽤用字(demo08)#encoding=utf-8importjiebaimportjieba.analysejieba.set_dictionary("data/dict.txt.big")jieba.analyse.set_stop_words("data/stop_words.txt")content =open('data/lyric1.txt','rb').read()print"Input:",contenttags=jieba.analyse.extract_tags(content,10)print"Output:"print("/".join(tags))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:關鍵詞去除停⽤用字執⾏行行結果所謂/⼀一般/矯作/來來說/ 怯懦/墓誌銘/退縮/寬闊/順從/熱情結巴實作FukuballLin@社群媒體資料分析 如何再提⾼高斷詞的準確性?•調整⽂文本資料,如HMM模型,字典詞頻•調整演算法(使⽤用現在號稱最準的DeepLearning) •使⽤用⾃自定義詞典結巴實作FukuballLin@社群媒體資料分析 Jieba⾃自定義詞典⽤用法#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")jieba.load_userdict("data/userdict.txt")結巴實作FukuballLin @社群媒體資料分析 Jieba動態新增詞典(demo09)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")jieba.add_word(word,freq=None,tag=None) 結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例⼆二(demo10)親愛的媽媽請你毋通煩惱我原諒我⾏行行袂開跤我欲去對抗袂當原諒的⼈人⽍歹勢啦愛⼈人啊 袂當陪你去看電影原諒我⾏行行袂開跤我欲去對抗欺負咱的⼈人天⾊色漸漸光遮有⼀一陣⼈人為了了守護咱的夢成做更更加勇敢的⼈人滅火器島嶼天光已經袂記是第幾⼯工請毋通煩惱我因為阮阮知道無⾏行行過寒冬袂有花開的⼀一⼯工天⾊色漸漸光天⾊色漸漸光已經是更更加勇敢的⼈人天⾊色漸漸光咱就⼤大聲來來唱著歌⼀一直到希望的光線照光島嶼每⼀一個⼈人天⾊色漸漸光咱就⼤大聲來來唱著歌⽇日頭⼀一爬上⼭山結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:台語歌詞斷詞,使⽤用繁體詞庫#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")content=open('data/lyric2.txt','rb').read() print"Input:",contentwords=jieba.cut(content)print("/".join(words))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:台語歌詞斷詞,使⽤用繁體詞庫執⾏行行結果親愛/的/媽媽/請/ 你/毋通/煩惱/我/原諒/我/⾏行行袂/開跤/我/欲/去/對抗/袂/當/原諒/的/⼈人/⽍歹勢/啦/愛⼈人/啊/袂/當/陪你去/看/電影/原諒/我/⾏行行袂/開跤/我/欲/去/對抗/欺負/咱/的/⼈人/天⾊色/漸漸/光/遮有/⼀一陣/⼈人/為/了了/守護/咱/的/夢/成/做/更更加/勇敢的⼈人/天⾊色/漸漸/光/已經/不再/驚惶/現在/就是/彼⼀一⼯工/換阮阮/做/守護/恁/的/⼈人/已經/袂/記/是/第幾/⼯工/請/毋通/煩惱/我/因為/阮阮/知道/無⾏行行過/寒冬/袂/有/花開/的/⼀一⼯工/天⾊色/漸漸/光/天⾊色/漸漸/光/已經/是/更更加/勇敢的⼈人/天⾊色/漸漸/光/咱/就/⼤大聲/來來/唱/著歌/⼀一直/到/希望/的/光線/照光/島嶼/每/⼀一個/⼈人/天⾊色/漸漸/光/咱/就/⼤大聲/來來/唱/著歌/⽇日頭/⼀一爬/上⼭山/就/會/使/轉去/啦/現在/是/彼/⼀一⼯工/勇敢/的/台灣/⼈人結巴實作FukuballLin@社群媒體資料分析 台語歌詞斷詞,使⽤用繁體詞庫結果分析•「袂當」斷成了了「袂」「當」•「袂記」斷成了了「袂」「記」•「袂有」斷成了了「袂」「有」結巴實作Fukuball Lin@社群媒體資料分析 使⽤用實例例:台語歌詞斷詞,使⽤用繁體詞庫加⾃自定義詞庫(demo11)#encoding=utf-8importjiebajieba.set_dictionary("data/dict.txt.big")jieba.load_userdict("data/userdict.txt")content= open('data/lyric2.txt','rb').read()print"Input:",contentwords=jieba.cut(content)print("/".join(words))結巴實作FukuballLin@社群媒體資料分析 使⽤用實例例:台語歌詞斷詞,使⽤用繁體詞庫加⾃自定義詞庫執⾏行行結果親愛/的/媽媽/請/ 你/毋通/煩惱/我/原諒/我/⾏行行袂開跤/我/欲/去/對抗/袂當/原諒/的/⼈人/⽍歹勢/啦/愛⼈人/啊/袂當/陪你去/看/電影/原諒/我/⾏行行袂開跤/我/欲/去/對抗/欺負/咱/的/⼈人/天⾊色/漸漸/光/遮有/⼀一陣/⼈人/為/了了/守護/咱/的/夢/成/做/更更加/勇敢的⼈人/天⾊色/漸漸/光/已經/不再/驚惶/現在/就是/彼⼀一⼯工/換阮阮/做/守護/恁/的/⼈人/已經/袂記/是/第幾/⼯工/請/毋通/煩惱/我/因為/阮阮/知道/無⾏行行過/寒冬/袂有/花開/的/⼀一⼯工/天⾊色/漸漸/光/天⾊色/漸漸/光/已經/是/更更加/勇敢的⼈人/天⾊色/漸漸/光/咱/就/⼤大聲/來來/唱著/歌/⼀一直/到/希望/的/光線/照光/島嶼/每/⼀一個/⼈人/天⾊色/漸漸/光/咱/就/⼤大聲/來來/唱著/歌/⽇日頭/⼀一爬/上⼭山/就/會使/轉去/啦/現在/是/彼/⼀一⼯工/勇敢/的/台灣/⼈人結巴實作FukuballLin@社群媒體資料分析 台語歌詞斷詞,使⽤用繁體詞庫加⾃自定義詞庫結果分析•符合預期結果•⾃自定義詞庫格式:⾏行行袂開跤2v袂當 4d袂記4v袂有4d會使70d結巴實作FukuballLin@社群媒體資料分析 中⽂文斷詞實際應⽤用FukuballLin@社群媒體資料分析 中⽂文斷詞應⽤用在⾳音樂•歌詞分析•情境歌單•⾃自動填詞•相似歌詞推薦、 實際應⽤用FukuballLin@社群媒體資料分析 中⽂文歌詞相似推薦系統(1)•Step1:中⽂文斷詞,集合成資料集•Step2:去掉停⽤用字•Step 3:將每⾸首歌詞轉成向量量表⽰示(doc2vec)•Step4:LSA算法降維•Step5:使⽤用降維後的向量量計算cosinsimilarity•這邊使⽤用了了gensim套件處理理步驟2-5,但全部⾃自幹也不算太難、實際應⽤用FukuballLin@社群媒體資料分析 中⽂文歌詞相似推薦系統(2)、實際應⽤用DemoFukuballLin@社群媒體資料分析 中⽂文歌詞相似推薦系統(3)、實際應⽤用•輸入:楊培安我的驕傲歌詞•輸出: •楊培安我的驕傲•五⽉月天倔強•張雨⽣生我的未來來不是夢•五⽉月天憨⼈人•五⽉月天⼀一顆蘋果FukuballLin@社群媒體資料分析 中⽂文歌詞相似推薦系統(4)、實際應⽤用《我的驕傲》節錄沒有⼭山不能跨越沒有海海不能冒險讓歷史記得這⼀一天當我⽤用⼼心立下諾⾔言 沒有事不能改變沒有夢不能實現我站在未來來最前線抬頭迎接每個考驗海海闊天空是我的地圖想寫下全新紀錄放眼天下在等我去征服⽤用熱⾎血燃燒⿊黑夜等待最燦爛的⽇日出看陽光與我賽跑風雨和我狂飆我的驕傲⾃自⼰己打造每個夢永遠比天⾼高⼀一顆⼼心為希望在跳躍讓世界為我歡呼⼤大地為我炫耀我的驕傲你會看到汗和淚淚痛苦的煎熬在這⼀一刻都是我光榮的記號《倔強》節錄最美的願望 ⼀一定最瘋狂我就是我⾃自⼰己的神 在我活的地⽅方我和我最後的倔強 握緊雙⼿手絕對不放下⼀一站是不是天堂 就算失望不能絕望我和我驕傲的倔強 我在風中⼤大聲的唱這⼀一次為⾃自⼰己瘋狂 就這⼀一次 我和我的倔強逆風的⽅方向 更更適合⾶飛翔我不怕千萬⼈人阻擋 只怕⾃自⼰己投降我和我最後的倔強 握緊雙⼿手絕對不放下⼀一站是不是天堂 就算失望不能絕望我和我驕傲的倔強 我在風中⼤大聲的唱這⼀一次為⾃自⼰己瘋狂 就這⼀一次 我和我的倔強FukuballLin@社群媒體資料分析 、補充說明LSA潛在語意分析(1)FukuballLin@社群媒體資料分析 LSA潛在語意分析(2)、補充說明LSA降維SVD分解表⽰示歌詞如何⽤用兩兩種Topic來來呈現,可明顯看出有兩兩類歌詞原本要⽤用12個詞來來描述歌詞,現在只要⽤用兩兩個Topic就可以描述 row1有關愛情的字詞值都較⾼高,所以Topic1應代表愛情row2有關夢想的字詞值都較⾼高,所以Topic2應代表夢想無法完整呈現歌詞情意FukuballLin@社群媒體資料分析 LSA潛在語意分析(3)、補充說明風景世界巧克⼒力力甜美愛情快樂 滋味咖哩理理想夢想陽光⾶飛翔能夠完整呈現歌詞情意c1c2c3c4c5m1m2m3m4FukuballLin@社群媒體資料分析 中⽂文歌詞相似推薦系統(5)、實際應⽤用•輸入:周杰倫倫安靜歌詞•輸出: •周杰倫倫安靜•黃品源那麼愛你為什什麼•孫燕姿我不難過•陳奕迅婚禮的祝福•周杰倫倫斷了了的弦FukuballLin@社群媒體資料分析 其他議題FukuballLin@社群媒體資料分析 其他議題(1)(demo12)、其他議題•網路路上有⼈人問:•下雨天留留客天留留我不留留•海海⽔水朝朝朝朝朝朝朝落落; 浮雲長長長長長長長消•有各種斷法,基本上不太算是斷詞的問題FukuballLin@社群媒體資料分析 其他議題(2)、其他議題•結巴對於新詞辨識表現還不錯,但對於歧異異詞辨識則有待加強•歧異異詞辨識⽬目前最有效的解法是使⽤用DeepLearning LSTM模型來來斷詞FukuballLin@社群媒體資料分析 Q&AFindMeTwitter@fukuballGithub@fukuballFacebook @fukuballFukuballLin@社群媒體資料分析



請為這篇文章評分?