在自然語言處理 (NLP) 的任務中,純文字的資料型態本身是相當難以進行處理的,尤其是在機器學習的任務當中。
試想:今天我們輸入圖像進行分類的訓練,我們可以使用『像素值』代表圖片的特徵進入模型當中進行訓練。但是文字呢?
文字型態的資料,是沒有辦法如同數值資料一樣進行 Forward Propagation 以及 Backward Propagation 的、是沒有辦法微分的,簡單來講,是沒辦法進行運算並且訓練權重網路的。
為了要解決這個問題,我們需要將『文字』轉換成『數值』。
最簡單的方法,就像我在《[PyTorch] 旅館評論情感分析實戰紀錄 (0)》這篇文章中所做的一樣,將每個『相異字』(Character) 轉換成一個特定的數字。這樣一來,我們便可以將機器學習相關的技術應用在文字領域了。
不過,只是單純地轉換 Character,有時是得不到較好的結果的。對中文而言,有時使用『詞』作為句子裡的基本元件單位會更恰當;另外,只是轉成一個『數字』也很難表現出中文詞彙的多樣性,轉換成『向量』通常效果會更好一點。
Word2Vec 就是這樣的一個工具,其最早是為 Google 開發的一個工具;而今天本文的主角 Gensim 則是它的 Python 實現 (不過只有最高層是 Python、內部還是封裝了 Word2Vec 的 C 接口)。
以下就來簡單地介紹該如何使用 Gensim 這項工具來完成將『文字轉換成向量』這項工作吧!
如果你的電腦裡還沒有 Gensim,可以透過以下指令下載:
這裡以 Wiki 上的中文資料為訓練語料,Wiki 上的資料可是相當優秀的。不僅量多、而且詞彙涵蓋範圍廣,可以應用在許多不同的任務上。
可以從這個網址找到下載處:https://zh.wikipedia.org/wiki/Wikipedia:%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%8B%E8%BD%BD
進入之後可以直接選擇一個日期,那是不同時間點的資料備份。
比如說我選擇了 這個時間點的資料,那麼,我要下載的資料則為:zhwiki--pages-articles-multistream.xml.bz2
要注意的是,你的日期可能與我不同,不過同樣都是這份檔案。
下載之後不用解壓縮,可以使用 Gensim 裡的工具直接提取文章。
WikiCorpus 是 Gensim 裡面的一個函式,可以幫助我們從 Wiki 的資料中提取乾淨的文章。
程式碼如下:
我將原本應是標點符號的地方以空白隔開,畢竟這可能會影響到『斷詞結果』。
『斷詞』這項工作指的是文本分成以『詞』為單位的句子。斷詞的工具有很多種,基本上可以參考我之前寫過的:
如果想要對繁體中文斷詞效果最好,首推 CKIP;如果是要斷詞速度的話,那非 Jieba 莫屬。在這裡以 Jieba 示範。
(註:Wiki 的資料當中許多地方是簡繁混雜的,可以考慮使用 OpenCC 這項工具來轉換。詳細的作法可以參閱我之前撰寫過的《中文繁簡轉換的便利工具 —— OpenCC》)
處理好之後的文本 seg.txt 應如下 (為了展示斷詞效果,我將詞彙斷開的地方使用換行示意):
最後,就只需要使用 Gensim 訓練 Word2Vec 模型即可。
訓練完之後,我將模型儲存為 "word2vec.model"。
首先,我們將剛才訓練好的模型讀入。然後我們隨便選了個詞『生物』。
我們可以看到詞彙的維度的確是 100 維,跟我們剛才訓練時設定的一致。
然後我們可以使用 most_similar 看到這個向量最相近的詞彙 (基本上是將兩向量進行 Cosine Similarity 計算) —— 這是在只使用『數字』代表一個詞彙時所做不到的事情。
有了將文字轉向量之後,大部分機器學習的模型都能跑了,非常方便。
我們所訓練的模型自然不可能涵蓋這個世界上所有的詞彙;也就是說,我們需要考慮在碰到不存在模型詞表(corpus)中的詞彙時,應該如何去處理未知詞。
目前就我所熟悉的處理方式可以分為兩類:
『模型平均向量』我們可以事先計算好、而『全零向量』也可先設置好。接著,再使用 try-except 針對『詞彙』不在『詞表』中的情況進行錯誤處理。
比方說像以下的範例程式碼:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/2745.html