成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詞向量計算和文本分類工具fastText的應用原理及實踐

人工智能
fastText是Facebook于2016年開源的一個詞向量計算和文本分類工具,在學術上并沒有太大創新。但是它的優點也非常明顯,在文本分類任務中,fastText(淺層網絡)往往能取得和深度網絡相媲美的精度,卻在訓練時間上比深度網絡快許多數量級。

fastText是Facebook于2016年開源的一個詞向量計算和文本分類工具,在學術上并沒有太大創新。但是它的優點也非常明顯,在文本分類任務中,fastText(淺層網絡)往往能取得和深度網絡相媲美的精度,卻在訓練時間上比深度網絡快許多數量級。在標準的多核CPU上, 能夠在10分鐘之內訓練10億詞級別語料庫的詞向量,能夠在1分鐘之內分類有著30萬多類別的50多萬句子。

[[218117]]

本文首先會介紹一些預備知識,比如softmax、ngram等,然后簡單介紹word2vec原理,之后來講解fastText的原理,并著手使用keras搭建一個簡單的fastText分類器,***,我們會介紹fastText在達觀數據的應用。

1. 預備知識

(2)分層Softmax

你可能也發現了,標準的Softmax回歸中,要計算y=j時的Softmax概率:,我們需要對所有的K個概率做歸一化,這在|y| 很大時非常耗時。于是,分層Softmax誕生了,它的基本思想是使用樹的層級結構替代扁平化的標準Softmax,使得在計算時,只需計算一條路徑上的所有節點的概率值,無需在意其他的節點。

下圖是一個分層Softmax示例:

 

(3)n-gram特征

在文本特征提取中,常常能看到n-gram的身影。它是一種基于語言模型的算法,基本思想是將文本內容按照字節順序進行大小為N的滑動窗口操作,最終形成長度為N的字節片段序列。看下面的例子:

我來到達觀數據參觀

相應的bigram特征為:我來    來到    到達    達觀    觀數    數據    據參    參觀

相應的trigram特征為:我來到    來到達    到達觀    達觀數    觀數據    數據參    據參觀

注意一點:n-gram中的gram根據粒度不同,有不同的含義。它可以是字粒度,也可以是詞粒度的。上面所舉的例子屬于字粒度的n-gram,詞粒度的n-gram看下面例子:

我 來到 達觀數據 參觀

相應的bigram特征為:我/來到    來到/達觀數據    達觀數據/參觀

相應的trigram特征為:我/來到/達觀數據    來到/達觀數據/參觀

n-gram產生的特征只是作為文本特征的候選集,你后面可能會采用信息熵、卡方統計、IDF等文本特征選擇方式篩選出比較重要特征。

2. word2vec

你可能要問,這篇文章不是介紹fastText的么,怎么開始介紹起了word2vec?最主要的原因是word2vec的CBOW模型架構和fastText模型非常相似。于是,你可以看到Facebook開源的fastText工具不僅實現了fastText文本分類工具,還實現了快速詞向量訓練工具。

word2vec主要有兩種模型:skip-gram 模型和CBOW模型,這里只介紹CBOW模型,有關skip-gram模型的內容請參考達觀另一篇技術文章:技術干貨 | 漫談Word2vec之skip-gram模型 http://zhuanlan.51cto.com/art/201710/554674.htm

(1)模型架構

CBOW模型的基本思路是:用上下文預測目標詞匯。架構圖如下所示:

(2)前向傳播

 

(3)反向傳播學習權重矩陣

3. fastText分類

終于到我們的fastText出場了。這里有一點需要特別注意,一般情況下,使用fastText進行文本分類的同時也會產生詞的embedding,即embedding是fastText分類的產物。除非你決定使用預訓練的embedding來訓練fastText分類模型,這另當別論。

(1)字符級別的n-gram

word2vec把語料庫中的每個單詞當成原子的,它會為每個單詞生成一個向量。這忽略了單詞內部的形態特征,比如:“apple” 和“apples”,“達觀數據”和“達觀”,這兩個例子中,兩個單詞都有較多公共字符,即它們的內部形態類似,但是在傳統的word2vec中,這種單詞內部形態信息因為它們被轉換成不同的id丟失了。

為了克服這個問題,fastText使用了字符級別的n-grams來表示一個單詞。對于單詞“apple”,假設n的取值為3,則它的trigram有

“<ap”,  “app”,  “ppl”,  “ple”,  “le>”

其中,<表示前綴,>表示后綴。于是,我們可以用這些trigram來表示“apple”這個單詞,進一步,我們可以用這5個trigram的向量疊加來表示“apple”的詞向量。

這帶來兩點好處:

1.對于低頻詞生成的詞向量效果會更好。因為它們的n-gram可以和其他詞共享。

2.對于訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字符級n-gram向量。

(2)模型架構

之前提到過,fastText模型架構和word2vec的CBOW模型架構非常相似。下面是fastText模型架構圖:

注意:此架構圖沒有展示詞向量的訓練過程。可以看到,和CBOW一樣,fastText模型也只有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。不同的是,CBOW的輸入是目標單詞的上下文,fastText的輸入是多個單詞及其n-gram特征,這些特征用來表示單個文檔;CBOW的輸入單詞被onehot編碼過,fastText的輸入特征是被embedding過;CBOW的輸出是目標詞匯,fastText的輸出是文檔對應的類標。

值得注意的是,fastText在輸入時,將單詞的字符級別的n-gram向量作為額外的特征;在輸出時,fastText采用了分層Softmax,大大降低了模型訓練時間。這兩個知識點在前文中已經講過,這里不再贅述。

fastText相關公式的推導和CBOW非常類似,這里也不展開了。

(3)核心思想

現在拋開那些不是很討人喜歡的公式推導,來想一想fastText文本分類的核心思想是什么?

仔細觀察模型的后半部分,即從隱含層輸出到輸出層輸出,會發現它就是一個softmax線性多類別分類器,分類器的輸入是一個用來表征當前文檔的向量;模型的前半部分,即從輸入層輸入到隱含層輸出部分,主要在做一件事情:生成用來表征文檔的向量。那么它是如何做的呢?疊加構成這篇文檔的所有詞及n-gram的詞向量,然后取平均。疊加詞向量背后的思想就是傳統的詞袋法,即將文檔看成一個由詞構成的集合。

于是fastText的核心思想就是:將整篇文檔的詞及n-gram向量疊加平均得到文檔向量,然后使用文檔向量做softmax多分類。這中間涉及到兩個技巧:字符級n-gram特征的引入以及分層Softmax分類。

(4)關于分類效果

還有個問題,就是為何fastText的分類效果常常不輸于傳統的非線性分類器?

假設我們有兩段文本:

我  來到  達觀數據

俺  去了  達而觀信息科技

這兩段文本意思幾乎一模一樣,如果要分類,肯定要分到同一個類中去。但在傳統的分類器中,用來表征這兩段文本的向量可能差距非常大。傳統的文本分類中,你需要計算出每個詞的權重,比如tfidf值, “我”和“俺” 算出的tfidf值相差可能會比較大,其他詞類似,于是,VSM(向量空間模型)中用來表征這兩段文本的文本向量差別可能比較大。但是fastText就不一樣了,它是用單詞的embedding疊加獲得的文檔向量,詞向量的重要特點就是向量的距離可以用來衡量單詞間的語義相似程度,于是,在fastText模型中,這兩段文本的向量應該是非常相似的,于是,它們很大概率會被分到同一個類中。

使用詞embedding而非詞本身作為特征,這是fastText效果好的一個原因;另一個原因就是字符級n-gram特征的引入對分類效果會有一些提升 。

4. 手寫一個fastText

keras是一個抽象層次很高的神經網絡API,由python編寫,底層可以基于Tensorflow、Theano或者CNTK。它的優點在于:用戶友好、模塊性好、易擴展等。所以下面我會用keras簡單搭一個fastText的demo版,生產可用的fastText請移步https://github.com/facebookresearch/fastText。如果你弄懂了上面所講的它的原理,下面的demo對你來講應該是非常明了的。

為了簡化我們的任務:

  • 訓練詞向量時,我們使用正常的word2vec方法,而真實的fastText還附加了字符級別的n-gram作為特征輸入;
  • 我們的輸出層使用簡單的softmax分類,而真實的fastText使用的是Hierarchical Softmax。

首先定義幾個常量:

  • VOCAB_SIZE = 2000
  • EMBEDDING_DIM = 100
  • MAX_WORDS = 500
  • CLASS_NUM = 5

VOCAB_SIZE表示詞匯表大小,這里簡單設置為2000;

EMBEDDING_DIM表示經過embedding層輸出,每個詞被分布式表示的向量的維度,這里設置為100。比如對于“達觀”這個詞,會被一個長度為100的類似于[ 0.97860014, 5.93589592, 0.22342691, -3.83102846, -0.23053935, …]的實值向量來表示;

MAX_WORDS表示一篇文檔最多使用的詞個數,因為文檔可能長短不一(即詞數不同),為了能feed到一個固定維度的神經網絡,我們需要設置一個***詞數,對于詞數少于這個閾值的文檔,我們需要用“未知詞”去填充。比如可以設置詞匯表中索引為0的詞為“未知詞”,用0去填充少于閾值的部分;

CLASS_NUM表示類別數,多分類問題,這里簡單設置為5。

模型搭建遵循以下步驟:

  • 添加輸入層(embedding層)。Embedding層的輸入是一批文檔,每個文檔由一個詞匯索引序列構成。例如:[10, 30, 80, 1000] 可能表示“我 昨天 來到 達觀數據”這個短文本,其中“我”、“昨天”、“來到”、“達觀數據”在詞匯表中的索引分別是10、30、80、1000;Embedding層將每個單詞映射成EMBEDDING_DIM維的向量。于是:input_shape=(BATCH_SIZE, MAX_WORDS), output_shape=(BATCH_SIZE, MAX_WORDS, EMBEDDING_DIM);
  • 添加隱含層(投影層)。投影層對一個文檔中所有單詞的向量進行疊加平均。keras提供的GlobalAveragePooling1D類可以幫我們實現這個功能。這層的input_shape是Embedding層的output_shape,這層的output_shape=( BATCH_SIZE, EMBEDDING_DIM);
  • 添加輸出層(softmax層)。真實的fastText這層是Hierarchical Softmax,因為keras原生并沒有支持Hierarchical Softmax,所以這里用Softmax代替。這層指定了CLASS_NUM,對于一篇文檔,輸出層會產生CLASS_NUM個概率值,分別表示此文檔屬于當前類的可能性。這層的output_shape=(BATCH_SIZE, CLASS_NUM)。
  • 指定損失函數、優化器類型、評價指標,編譯模型。損失函數我們設置為categorical_crossentropy,它就是我們上面所說的softmax回歸的損失函數;優化器我們設置為SGD,表示隨機梯度下降優化器;評價指標選擇accuracy,表示精度。

用訓練數據feed模型時,你需要:

  • 將文檔分好詞,構建詞匯表。詞匯表中每個詞用一個整數(索引)來代替,并預留“未知詞”索引,假設為0;
  • 對類標進行onehot化。假設我們文本數據總共有3個類別,對應的類標分別是1、2、3,那么這三個類標對應的onehot向量分別是[1, 0, 0]、[0, 1, 0]、[0, 0, 1];
  • 對一批文本,將每個文本轉化為詞索引序列,每個類標轉化為onehot向量。就像之前的例子,“我 昨天 來到 達觀數據”可能被轉化為[10, 30, 80, 1000];它屬于類別1,它的類標就是[1, 0, 0]。由于我們設置了MAX_WORDS=500,這個短文本向量后面就需要補496個0,即[10, 30, 80, 1000, 0, 0, 0, …, 0]。因此,batch_xs的 維度為( BATCH_SIZE, MAX_WORDS),batch_ys的維度為(BATCH_SIZE, CLASS_NUM)。

下面是構建模型的代碼,數據處理、feed數據到模型的代碼比較繁瑣,這里不展示。

5. fastText在達觀數據的應用

fastText作為誕生不久的詞向量訓練、文本分類工具,在達觀得到了比較深入的應用。主要被用在以下兩個系統:

  • 同近義詞挖掘。Facebook開源的fastText工具也實現了詞向量的訓練,達觀基于各種垂直領域的語料,使用其挖掘出一批同近義詞;
  • 文本分類系統。在類標數、數據量都比較大時,達觀會選擇fastText 來做文本分類,以實現快速訓練預測、節省內存的目的。

【本文為51CTO專欄作者“達觀數據”的原創稿件,轉載可通過51CTO專欄獲取聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-10-09 08:00:00

機器學習文本分類算法

2012-06-14 10:21:31

線程線程池Java

2015-07-22 18:07:59

阿里云批量計算

2017-11-27 08:38:10

UPS選擇容量

2018-08-15 09:13:27

布線系統線纜用量

2023-09-21 08:16:56

JDK 21向量計算計算

2009-08-21 10:50:42

電線電纜材料用量

2025-06-11 04:00:00

增量計算Lamda架構

2019-11-06 16:40:31

awkLinux文本分析工具

2024-01-16 10:45:31

C++語言代碼

2020-03-23 08:00:00

開源數據集文本分類

2017-04-13 09:18:02

深度學習文本分類

2017-01-06 11:18:58

星瑞格

2018-02-28 16:20:57

中科睿芯

2021-03-06 07:00:00

awk文本分析工具Linux

2024-12-20 16:00:00

Python文本分類聚類

2018-07-25 12:00:21

2017-08-04 14:23:04

機器學習神經網絡TensorFlow

2025-06-05 11:49:59

OpenAI深度學習模型

2019-06-06 10:19:33

谷歌開源計算庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩黄色小视频 | 国产精品久久久久一区二区三区 | 久久亚洲一区二区 | 91综合网| 久久久久一区 | 久久丝袜 | 成人区精品一区二区婷婷 | 国产精品久久久久9999鸭 | www.99热这里只有精品 | 欧美日韩精品一区二区三区视频 | 亚洲欧美国产视频 | 亚洲天堂成人在线视频 | 久久99精品久久久久久琪琪 | 久久国内精品 | 欧美亚洲视频 | 欧美国产91 | 91小视频在线 | 成人妇女免费播放久久久 | 中文字幕精品一区二区三区精品 | 国产精品久久九九 | 欧美久久一级 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲五码在线 | 国产福利在线视频 | 精品视频一区二区三区在线观看 | 久久久一二三 | 欧美性吧 | 在线免费国产视频 | 日本大香伊一区二区三区 | 人妖一区 | 日本不卡一区 | 日韩精品久久久 | 天堂久久av | 国产精品久久久久无码av | 剑来高清在线观看 | 日韩在线播放一区 | 久热9| 天堂av中文 | 中文字幕 亚洲一区 | 国产99久久久国产精品 | 日韩国产在线观看 |