立場新聞 Stand News

【Python實戰篇】用AI為留言加emoji

2018/11/5 — 0:05

如何用人工智能來做情緒分析,是一門頗有商業價值的應用,因為對沖基金經理可以藉此來分析討論區中對某隻股份留言的看好或看淡情緒,企業可以得到社交媒體上對自家產品的觀感,政黨在選舉中亦可以細分不同選民群組對其宣傳的反應。因此今次嘗試訓練一個簡單的神經網絡,來對留言標籤一個emoji,以評估該留言的情緒。

程式的原理是這樣的,首先我搜集或創作了近150個留言,並為每個留言標籤了一個emoji,如「講大話比較可恥」便給予一個「sad」的emoji😞,又如「珍珠奶茶真好喝!」便標籤一個開餐🍴的emoji,作為訓練AI之用。我總共設定了8種emojis,分別為❤️ ⚾ 😄 😞 🍴 😭 💩 😡。

之後便要將每個留言的字詞分拆作分析,照樣用我提過的jieba程式庫,於是「珍珠奶茶真好喝!」便會分割成['珍珠奶茶', '真', '好喝']等三個片語。

廣告

記著,電腦是不懂得語言的,它只懂得數字,所以要把所有語言變成數字來分析。這時便要出動文本向量word2vec,這是利用超大的文字庫,如維基百科數十萬篇文章,將其透過算法分析,搜尋字詞與字詞間的關係,例如「爸爸」與「媽媽」及「兒女」等詞語會較接近,而與「巴士」或「日出」等字詞距離較遠。透過算法分析這海量文字庫,會得出一個文字向量,當中每個字詞均有數十至數百個向量,比較不同字詞的向量,便知道它們在字海中的相對位置。

網上有大量文字庫可供使用,如維基百科,但我奉勸若閣下電腦裝備並不算強勁,則可避則避,因為這些文字庫動輒以G(即一千Meg)計,訓練時會用盡電腦的記憶體(通常都不夠),而且時間起碼要數小時,雖然資料可能會更合用及較新,但耗時耗電亦傷硬盤,我利用維基百科訓練得出的文字向量檔案超過3G,單單讀入檔案已花去不少時間。

廣告

所以我最後都轉用一些已訓練好的文字向量,如facebook的fasttext,中文版只有860M,只有自己訓練的4分1,作為示範已夠用。

我的程式是基於知名AI學者吳恩達的課堂習作emojify改編,習作是英文,因此本程式要全面中文化,加入如上分割詞語等動作,但由於「珍珠奶茶」雖然被視作一個整體用語,但在文字向量庫內可能並沒有這詞語,因此要加入一個小程序,若文字向量沒有「珍珠奶茶」一詞時,便要將詞語還原為每隻字來輸入,以取得單字的向量,而每個字詞均有300個向量。要了解這些向量是什麼,可以使用gensim的程式庫,

from gensim.models.keyedvectors import KeyedVectors

word_vectors = KeyedVectors.load_word2vec_format("data/wiki.zh.vec", binary = False)

word_vectors.most_similar('金庸', topn = 10)

輸出為:

[('武俠', 0.9502643942832947),

('武侠', 0.9435855150222778),

('古龍', 0.9424386024475098),

('青書', 0.9368023872375488),

('凡庸', 0.9342538118362427),

('麟作', 0.9340458512306213),

('侶', 0.9336172342300415),

('明兒', 0.9333961009979248),

('伏妖', 0.9331773519515991),

('奇書', 0.9330675005912781)]

若輸入金庸,可找出與其最相近的字詞,頭幾位分別為武俠、古龍等,又譬如輸入:

word_vectors.similarity("電視", "劉德華")

輸出為:

0.85784405 

因為向量都是少於一,即劉德華與電視的字詞有很高的相關性。

使用文字向量的好處,在於電腦會懂得舉一反三,在稍後訓練它揣摩留言的情緒時,可用較少的留言數目。

到正式訓練電腦理解留言,原理是把每個留言分割的字詞,取得其300個文字向量,然後把留言中的每個字詞向量相加並取平均值,把這個平均值輸入一層softmax模型,進行最小化損失函數的操作,在學習速度為0.005的1000回合訓練後,便得出對訓練數據95%準確率而對測試數據59%準確率的模型。

圖:吳恩達深度學習作業

圖:吳恩達深度學習作業

59%準確率當然不算理想,絕對有改進空間餘地,若讀者有興趣,可以嘗試調低學習速度及調升訓練回合,看看有多大改善。

那不如看看初步成果如何,輸入"政府橫蠻無理",電腦懂得配搭😡,但訓練中的留言其實並無橫蠻無理這詞語,意味AI懂得在文字向量中找到相關詞語。

又如"我喜歡小貓",電腦的標籤為❤️,但訓練留言中亦無提及貓,只有一條"我愛小狗",但AI懂得找出關聯處。又如"我訂了三文魚",電腦的標籤為🍴,但訓練留言中只有提及壽司。

標籤emoji只是第一步,更有用的方向是能圍繞某個題目,分析留言的整體情緒,並得出有用的結論,而是次程式涉及的語言訓練及原理,相信亦可以應用在這些較高階的用途上。

程式當然還有很多改善的地方,實際上文中的神經網絡只有一層太淺了,可以加深,又或使用處理自然語言的序列模型,如長短記憶(LSTM),這些可留待高手示範。

另一個方向,是把程式弄成web app,再讓用家輸入留言及標籤,一起協助訓練程式的AI,但由於文字向量頗大,一般雲端服務可能要付費才能運作,故此稍後才進行吧。

程式完整碼可到此下載,但因facebook的文字向量檔較大,請到上面的facebook連結下載,再放回data子目錄便可。

以下為主程序的jupyter檔案:

 

 

發表意見