隨著人們在網路上產生的內容不斷增加,眼花撩亂的文章、資訊在網路上比比皆是,對於內容管理者和內容生產者來說,如何讓文章可以與對應的讀者群接觸便成為重要的課題。
身為內容管理者,工作內容之一便是如何分配文章給有興趣的讀者,同時讓讀者節省尋找好文章的精力,也讓內容生產者的作品能獲得關注,使兩者雙贏。人工分類建立文章間的關係固然可行,但也佔據許多人力,同時可能帶有偏差,這時推薦系統便成為可能的幫手。
文章推薦系統的思路有很多種,
1. 讀者與文章的交互矩陣 => 矩陣分解
2. 文章的相似度矩陣 => 文章embedding向量
3. 讀者閱讀文章的序列 => 馬可夫鍊
我們這次選擇的是第二種,相較於其他方法的好處是不需要前處理成特定矩陣和訓練模型,不過仍需微調(fine-tuning)BERT成該文本領域的模型。使用BERT的套件在BERT出來後便如雨後春筍般冒出,本文使用的是transformers.
首先呢,可以用 simpletransformers微調你的BERT。
train.txt 的格式如下
===title1===Paragraph1===title2===
Paragraph2
等待你的模型訓練完,大概幾分鐘之內會訓練完成(注意GPU約莫需要10G左右才能訓練語言模型(Language Model))。
接著,載入模型並推論文章embedding向量。Transformers 的使用概念是先將文字轉成token,由於模型計算的是數字,再轉成對應id輸入模型。
得到所有文章的embedding向量後,做average pooling處理,雖然average pooling不一定能得到好的結果,但簡單、直覺。最後,我以umap呈現embedding向量及其分群結果。
結語
這次做的簡單NLP項目,可視為文本相似度、無監督細粒度(fine-grained)分類、文本叢集(text clustering)應用在文本推薦、搜尋、分群上,雖然表現尚可,但這個簡單的實現仍有許多可以精進的地方,例如可以換成sentenceBERT強化對文本相似度任務的表現、使用average pooling以外的pooling方法,增強BERT 對文本的理解希望能在文本推薦這項目上有更好的表現。