如果從一開始就給大家說什么是向量化再拋出類似稀疏矩陣、文本特征等一系列專業(yè)名詞大家必然聽的云里霧里不知所云,那不如就由淺入深從頭開始講起我們的到底在干什么(what)我們又是如何實現(xiàn)的(how)、我們?yōu)槭裁匆@樣實現(xiàn)(why)這三個方面開始講吧!
一、首先我們到底在干什么
身處于互聯(lián)網(wǎng)大數(shù)據(jù)時代,每個人、每個企業(yè)既是數(shù)據(jù)的生產(chǎn)者又是信息的消費者,數(shù)據(jù)的價值也備受著關注越來越多的企業(yè)開始去嘗試挖掘數(shù)據(jù)的價值,越來越多的用戶也正享受著大數(shù)據(jù)時代為他們提供的便利,大數(shù)據(jù)的獲取、處理與分析,已成為提高未來競爭力的關鍵因素,所以我們要做的就是————數(shù)據(jù)分析
對于文本的分析有一個專有名詞叫做 nlp(Natural Language Processing),翻譯為自然語言處理,它是計算機科學、人工智能和語言學的交叉領域,目的是讓計算機處理或“理解”自然語言,以執(zhí)行諸如語言翻譯和問題回答等任務。他主要用到三種技術:
▌技術1:文本嵌入(Text Embeddings)
在傳統(tǒng)的NLP中, 我們把單詞看成是離散符號, 然后用一個one-hot向量來表示。向量的維數(shù)是整個詞庫中單詞的數(shù)量。單詞作為離散符號的問題在于, 對于一個one-hot向量來說,沒有自然的相似性概念。因此, 另一種方法是學習在向量本身中的編碼相似性。核心思想是一個詞的意思是由經(jīng)常出現(xiàn)在其附近的詞給出的。
文本嵌入是字符串的實值向量表示形式。我們?yōu)槊總€單詞構建一個稠密的向量, 這樣做是以便它與出現(xiàn)在相似上下文中的單詞向量相似。對于大多數(shù)深度NLP任務而言,詞嵌入被認為是一個很好的起點。它們允許深度學習在較小的數(shù)據(jù)集上有效,因為它們通常是深度學習體系結構的第一批輸入,也是NLP中最流行的遷移學習方式。
▌技術2:機器翻譯
機器翻譯是語言理解的經(jīng)典測試。它由語言分析和語言生成兩部分組成。大型機器翻譯系統(tǒng)有巨大的商業(yè)用途,因為全球語言是一個每年400億美元的產(chǎn)業(yè)
▌技術3:Dialogue 和 Conversations
關于會話AI的文章很多,其中大部分集中在垂直聊天機器人、messenger平臺、商業(yè)趨勢和創(chuàng)業(yè)機會(比如亞馬遜Alexa、蘋果Siri、Facebook M、谷歌助理、微軟Cortana)。人工智能理解自然語言的能力仍然有限。因此,創(chuàng)建完全自動化的開放域會話助理仍然是一個開放的挑戰(zhàn)
我們要用到的技術就是文本嵌入(Text Embeddings)!
數(shù)據(jù)分析師Seth Grimes曾指出“80%的商業(yè)信息來自非結構化數(shù)據(jù),主要是文本數(shù)據(jù)”,這一表述可能夸大了文本數(shù)據(jù)在商業(yè)數(shù)據(jù)中的占比,但是文本數(shù)據(jù)的蘊含的信息價值毋庸置疑
如果原始文本是數(shù)據(jù),那么文本挖掘就是信息,NLP就是知識,也就是語法和語義的關系。下面的金字塔表示了這種關系:

二、1、我們又是如何實現(xiàn)的呢
我們要分析的原始數(shù)據(jù)、符號文字序列不能直接傳遞給算法,因為它們大多數(shù)要求具有固定長度的數(shù)字矩陣特征向量,而不是具有可變長度的原始文本文檔。為解決這個問題,scikit-learn提供了從文本內(nèi)容中提取數(shù)字特征的最常見方法,即:
令牌化(tokenizing) 對每個可能的詞令牌分成字符串并賦予整數(shù)形的id,例如通過使用空格和標點符號作為令牌分隔符。
統(tǒng)計(counting) 每個詞令牌在文檔中的出現(xiàn)次數(shù)。
標準化、歸一化(normalizing) 在大多數(shù)的文檔 / 樣本中,可以減少重要的次令牌的出現(xiàn)次數(shù)的權重。
在該方案中,特征和樣本定義如下:
每個單獨的令牌發(fā)生頻率(歸一化或不歸零)被視為一個特征。
給定文檔中所有的令牌頻率向量被看做一個多元sample樣本。
因此,文本的集合可被表示為矩陣形式,每行對應一條文本,每列對應每個文本中出現(xiàn)的詞令牌(如單個詞)。

我們稱向量化是將文本文檔集合轉換為數(shù)字集合特征向量的普通方法。 這種特殊思想(令牌化,計數(shù)和歸一化)被稱為 Bag of Words 或 “Bag of n-grams” 模型,也就是詞袋模型。 文檔由單詞出現(xiàn)來描述,同時完全忽略文檔中單詞的相對位置信息。

可能大家還是聽得有些迷糊,那我舉個稍微平易的例子為大家鞏固一下理解吧。我們可以把待分析的文本、原始數(shù)據(jù)想象成為一個拼裝完成的‘樂高積木’,現(xiàn)在我們要分析這個樂高積木,然后我們把它一塊一塊拆下來,拆除完成之后原本完整的積木變成了一塊塊單獨的零件,我們?yōu)椴鹣碌牧慵患患陌凑疹愋途幧闲蛱柌⑶野凑枕樞蚺帕泻茫@就完成了第一步———分詞標記(tokenizing)

【a零件0號,b零件1號,c零件2號,d零件3號,e零件4號,f零件5號,g零件6號,...........】

然后我們要統(tǒng)計拆除下來每個零件的個數(shù),這就是關鍵的第二部——統(tǒng)計(counting)
【a零件0號:61,b 零件1號:5 ,c 零件2號:6 ,d 零件3號:99 ,e 零件4號:7 ,f 零件5號:5 號,g 零件6號 :2,...........】

但是有許多零件是常常出現(xiàn)但是并不是特別重要的或者太大太小總之我們想要的,我們就要去除對他們的統(tǒng)計,這就是第三部分————歸一化(normalizing),我們即將要探討的TF-IDF模型就是實現(xiàn)歸一化的一種方法。
**【b 零件1號:5 ,c 零件2號:6 ,e 零件4號:7 ,f 零件5號:5 ,g 零件6號 :2,...........】 **
現(xiàn)在大家是否對向量化的過程有了更為具象的認識呢,好了重頭戲終于來了,到底什么是TF-IDF呢
TF-IDF(term frequency-inverse document frequency)詞頻-逆文件頻率。在處理文本時,如何將文字轉化為模型可以處理的向量呢?TF-IDF就是這個問題的解決方案之一。字詞的重要性與其在文本中出現(xiàn)的頻率成正比(TF),與其在語料庫中出現(xiàn)的頻率成反比(IDF)。
TF就是詞頻,詞語在文章中出現(xiàn)的次數(shù)。

IDF叫做逆文檔頻率,有些詞可能在文本中頻繁出現(xiàn),但并不重要,也即信息量小,如is,of,that這些單詞,或是中文中的是、這、那,這些單詞在語料庫中出現(xiàn)的頻率也非常大,我們就可以利用這點,降低其權重。

TF-IDF則是將上面的TF-IDF相乘就得到了的綜合參數(shù)


二、2.具體又是怎么實現(xiàn)的呢
首先請安裝sklearn,Scikit-learn是一個用于數(shù)據(jù)挖掘和數(shù)據(jù)分析的簡單且有效的工具,它是基于Python的機器學習模塊,基于BSD開源許可證。
pip install scikit-learn
我們會用到Scikit-Learn中的兩個類:CountVectorizer和TfidfTransformer。
CountVectorizer類 實現(xiàn)了 tokenization (詞語切分)和 counting (統(tǒng)計詞頻)
TfidfTransformer類 實現(xiàn)歸一化
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
# 該類會將文本中的詞語轉換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文本下的詞頻
vectorizer = CountVectorizer()
# 計算每個出現(xiàn)詞的詞頻
X = vectorizer.fit_transform(corpus)
# 打印詞袋中所有文本特征值
print(vectorizer.get_feature_names())
# 打印詞頻矩陣
print(X.toarray())
# 該類會統(tǒng)計每個詞語的tf-idf權值
transformer = TfidfTransformer()
# 計算詞頻矩陣X的TF-IDF值
tfidf = transformer.fit_transform(X)
# 將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文本中的tf-idf權重
print(tfidf.toarray())
運行結果如下:

請注意在sklearn中計算tfidf可能與教科書中給的公式有所不同,我們輸入一個擁有三個特征,3*6的矩陣,手動計算一遍他的權重,然后對比計算機給出的結果

他的默認公式如下:

tf表示特征出現(xiàn)的次數(shù)
nd表示文檔的總數(shù)
df是包含特征 t 的文檔數(shù)
對于第一個[3,0,1]有:

最后要正則化,使其適應歐幾里得標準:


下面是計算機計算的權重:

如果要提取中文關鍵詞則需要引用jieba庫,對語料庫進行分詞。

運行結果如下:

jieba庫中內(nèi)置了TF-IDF算法,可以直接計算權重并輸出topkeywords,比較推薦使用!


四、我們?yōu)槭裁匆@樣做
關鍵詞提取技術是自然語言處理的重要基礎。隨著信息科學技術的快速發(fā)展以及互聯(lián)網(wǎng)的普及,網(wǎng)絡文本資源呈幾何級數(shù)不斷增長。面對更新日益頻繁和規(guī)模龐大的文本數(shù)據(jù),如何高效準確地實現(xiàn)關鍵詞提取成為影響信息檢索系統(tǒng)性能的關鍵。
TF-IDF簡單快速,結果符合實際情況使它成為了經(jīng)典的權重算法但是他也有缺點,單純以詞頻衡量詞的重要性,不夠全面,有時重要的詞出現(xiàn)的次數(shù)不多,而且對詞的出現(xiàn)位置沒有設置,出現(xiàn)位置靠前的詞和出現(xiàn)位置靠后的詞的重要性一樣,可能對全文的第一段或者每一段的第一句給予較大的權重。
對經(jīng)典的 TFIDF 方法進行改進 通過了解中文自然語言的結構和中文關鍵詞的特點,結合關鍵詞的頻率、位置關系以及詞性等特征,從而提高關鍵詞的提取性能。
目前國內(nèi)學者提出了以下幾種關鍵詞提取的改進辦法:
提出一種綜合多因素的關鍵詞提取方法。該方法綜合網(wǎng)頁中詞語的詞長、詞性以及位置信息進行綜合加權。
利用詞語之間的語義的連貫性,結合詞頻、位置等特征,提出一種基于詞匯鏈的網(wǎng)頁關鍵詞提取方法。
通過自然語言表現(xiàn)出的復雜網(wǎng)絡特征,根據(jù)語言網(wǎng)絡的“小世界”特性,提出基于語言網(wǎng)絡的關鍵詞提取方法。該方法借用復雜網(wǎng)絡的特性,將詞語之間的鏈接關系和位置信息相融合,從而提高關鍵詞的抽取性能。
四、參考資料:
給出一些我學習過程中的參考資料,希望能與大家交流學習
英文文檔:https://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage
中文文檔:https://github.com/apachecn/sklearn-doc-zh/blob/master/docs/0.21.3/39.md