1、且說文本分析

我一直覺得,在數據分析領域,只有文本分析是最「接地氣兒」的,「接地氣兒」不是指最簡單,而是我們普通大眾的使用它最多。

我們每天使用互聯網,但不一定每個人都炒股,不一定都做行業研究,也不一定都搞科研,因此那些高大上的模型對大部分人來說都是飄忽在天上的,只有文本分析,他的產出結果是直接惠及到幾乎全部人。

比如,你總得打字,會使用到輸入法的模糊匹配;你總得網購,刷新頁面的時候就會看到某寶給你推薦的產品;你總得看新聞,APP會根據你以往的輸入給你推薦文章......

文本分析最基本的可以看正則表達式,我曾經寫過SAS和Python的相關文章:

導語:SAS正則表達式,統計師入門文本分析的捷徑?

mp.weixin.qq.com

統計師的Python日記【第九天:正則表達式】?

mp.weixin.qq.com

今天這個小系列,介紹的是計算文本分析中,相似度的思想。

2、文本相似度

計算文本相似度有什麼用?

  • 反垃圾文本的撈取

「誠聘淘寶兼職」、「誠聘打字員」...這樣的小廣告滿天飛,作為網站或者APP的運營者,不可能手動將所有的廣告文本放入屏蔽名單里,挑幾個典型廣告文本,與它滿足一定相似度就進行屏蔽。

  • 推薦系統

在微博和各大BBS上,每一篇文章/帖子的下面都有一個推薦閱讀,那就是根據一定演算法計算出來的相似文章。

  • 冗餘過濾

我們每天接觸過量的信息,信息之間存在大量的重複,相似度可以幫我們刪除這些重複內容,比如,大量相似新聞的過濾篩選。

這裡有一個在線計算程序,你們可以感受一下

忘了說了,複製下面地址到瀏覽器:51tools.info/textsimila

3、餘弦相似度

(1)基本思想

餘弦相似度,就是用空間中兩個向量的夾角,來判斷這兩個向量的相似程度:

  • 當兩個向量夾角越大,距離越遠,最大距離就是兩個向量夾角180°;
  • 夾角越小,距離越近,最小距離就是兩個向量夾角0°,完全重合。

借鑒這一思想,我們可以計算出兩個文本的相似程度。但,我們真的要用夾角的大小去衡量嗎?

文本1與文本2之間的夾角估計有37°;

文本A與文本C之間的夾角大概72.8°

相似度,個么儂就好好弄一個相似程度好伐?比如99%相似、10%相似,更關鍵的是,夾角這個東西——

我不會算!

誰來跟我說說兩個空間向量的角度怎麼計算?哪本書有?

一個更好的方法是計算夾角的餘弦,對,就是那個初二學的——cos(θ)!這個不僅有公式可以算,而且結果也很有意義,是一個0-1的取值。

所以,用餘弦夾角來計算兩個文本的距離的步驟就是:

  • 首先,將兩個文本數字化,變成兩個向量;
  • 其次,計算兩個向量的夾角餘弦cos(θ)

餘弦定理告訴我們:

不記得的翻看書本......

然而對於兩個向量a、b的夾角餘弦呢?

它的公式為:

分子就是2個向量的內積,分母是兩個向量的模長乘積。

---------------------

用兩個向量的坐標即可計算出來,簡單了解一下這個推導:

---------------------

這是兩個二維向量,如果是兩個n維向量的夾角餘弦相似度,只要記得,分子依然是向量內積,分母是兩個向量模長乘積。

知道了向量的夾角餘弦相似度計算方法,現在只要想辦法將文本變成向量就可以了。

(2)文本的餘弦相似度計算

文本是由片語成的,我們一般通過計算詞頻來構造文本向量——詞頻向量。

比如有一句話:

我是數說君,我愛你們,你們愛我嗎?

這段文本是由幾個片語成的:

我/ 是/ 數說君 我/ 愛/ 你們 你們/ 愛/ 我/ 嗎

其中「我」出現了3次,「是」出現一次......依次計算,我們就可以構造如下詞頻向量:

我3, 是1, 數說君1, 愛2, 你們2, 嗎1 → (3,1,1,2,2,1)

這就是一個6維向量了。

需要注意的是,如果這時候有另一段文本需要跟它比較,比如就是:

我是數說君,我愛你們,你們愛我吧?

這時候我們應該這樣分詞:

我3, 是1, 數說君1, 愛2, 你們2, 嗎0, 吧1 → (3,1,1,2,2,0,1)

這裡「嗎」這個維度也需要加上,相應的,別忘了第一句話中也要加上「吧」這個維度:

我3, 是1, 數說君1, 愛2, 你們2, 嗎1, 吧0 → (3,1,1,2,2,1,0)

這就是兩個7維向量了,現在可以將這兩個文本向量進行夾角餘弦的相似度比較,帶入上面的公式:

兩個向量內積=3*3+1+1+2*2+2*2=19

兩個向量模長乘積=sqrt(9+1+1+4+4+1)*sqrt(9+1+1+4+4+1)=20

兩個向量夾角餘弦相似度=19/20=95%

所以這兩段文本的相似度為95%。

這裡有2個問題值得提一下:

(1)當兩個詞頻向量進行比較的時候,維度會擴大。

比如剛剛例子中,彼此沒有出現的「嗎」、「吧」兩個維度會加進來,保證比較的兩段文本維度統一。那麼問題來了,如果兩段很長的文本進行比較(比如上萬字的文章),豈不是維度要擴增很多倍?而且矩陣會非常稀疏,就是很多取值都是0,計算開銷大且效率低,怎麼辦?

因此需要尋求一種有效的特徵降維方法,能夠在不損傷核心信息的情況下降低向量空間的維數,比如TF-IDF演算法。這就是後面會介紹的。

(2)英文文本的比較

與中文不同的是,英文不需要分詞,因為英文天然就是由一個一個片語組成的。

I Love Shushuojun → I/ Love/ Shushuojun

更多內容,歡迎關注我的微信公眾號「數說工作室」。

推薦閱讀:

相关文章