最近筆者在尋找NLP的套件時,發現這個 https://github.com/zake7749/Chatbot 的專案,於是將它給git clone下來
筆者是使用VS Code加上python 3.6的版本,所需要的套件有
- gensim https://github.com/RaRe-Technologies/gensim
- fuzzywuzzy https://github.com/seatgeek/fuzzywuzzy
- BeautifulSoup https://pypi.python.org/pypi/beautifulsoup4
- jieba 结巴中文分词 https://github.com/fxsjy/jieba
依照專案的說明,需要先建立訓練好的中文詞向量,此部分筆者參考此篇文章「以 gensim 訓練中文詞向量」
取得語料(corpus)
筆者所使用的資料集是維基百科2018/03/01的文章備份資料,而維基百科的中文資料集在此。再來git clone 此專案https://github.com/zake7749/word2vec-tutorial,使用此專案的程式
py wiki_to_txt.py zhwiki-20180301-pages-articles.xml.bz2
這需要一點時間將文章從xml檔案抽出來。
接著使用OpenCC(Windows系統請至此下載)將所有文章轉成繁體字。
詞向量的用意是將一個詞轉換成空間上的一個點,以二維空間為例,【雨】、【多雲】、【下雨】、【下雪】這幾個詞的座標可能為,(4, 4)、(5, 5)、(1, 2)、(3, 3),而原點到詞座標兩點的連線就是向量。上圖左邊的圓圈越大,代表這個詞越重要;右邊表示詞與原點的向量。既然詞可以用向量來表示,而數學上向量有方向與長度,正好可以用來當作詞有沒有相似的一個依據(雖然不一定很精準)。根據相關研究,可以得到『東京之於日本 得到 倫敦之於英國』的效果。那這個和聊天機器人有什麼關係呢?待下回說明吧。
opencc -i wiki_texts.txt -o wiki_zh_tw.txt -c s2tw.json
斷詞並去除停用詞(Stop word)
py segment.py
訓練出word2vector的model
py train.py
訓練時間在Lenovo ThinkPad T440 Core i7-4500U跑了約五十分鐘。
(註:因為在gensim出現了MemoryError所以筆者將Word2Vector的min_count設為10,也就是忽略出現次數少於10的詞。) 而訓練好的詞向量能做什麼呢?請先看下圖詞向量的用意是將一個詞轉換成空間上的一個點,以二維空間為例,【雨】、【多雲】、【下雨】、【下雪】這幾個詞的座標可能為,(4, 4)、(5, 5)、(1, 2)、(3, 3),而原點到詞座標兩點的連線就是向量。上圖左邊的圓圈越大,代表這個詞越重要;右邊表示詞與原點的向量。既然詞可以用向量來表示,而數學上向量有方向與長度,正好可以用來當作詞有沒有相似的一個依據(雖然不一定很精準)。根據相關研究,可以得到『東京之於日本 得到 倫敦之於英國』的效果。那這個和聊天機器人有什麼關係呢?待下回說明吧。
沒有留言:
張貼留言