當前位置:首頁 » 操作系統 » idf演算法

idf演算法

發布時間: 2022-11-29 00:45:34

『壹』 Elasticsearch——評分機制詳解

一個搜索引擎使用的時候必定需要排序這個模塊,如果在不選擇按照某一欄位排序的情況下,都是按照打分的高低進行一個默認排序的,所以如果正式使用的話,必須對默認排序的打分策略有一個詳細的了解才可以,否則被問起來為什麼這個在前面,那個在後面?

將查詢作為輸入,將每一個因素最後通過公式綜合起來,返回該文檔的最終得分。這個綜合考量的過程,就是將相關的文檔被優先返回的考量過程。

Elasticsearch是基於Lucene的,所以它的評分機制也是基於Lucene的。在Lucene中把這種相關性稱為得分(score),確定文檔和查詢有多大相關性的過程被稱為打分(scoring)。

ES最常用的評分模型是 TF/IDF和BM25,TF-IDF屬於向量空間模型,而BM25屬於概率模型,但是他們的評分公式差別並不大,都使用IDF方法和TF方法的某種乘積來定義單個詞項的權重,然後把和查詢匹配的詞項的權重相加作為整篇文檔的分數。

在ES 5.0版本之前使用了TF/IDF演算法實現,而在5.0之後默認使用BM25方法實現。

relevance score相關性算分:簡單來說,就是計算出,一個索引中的文本,與搜索文本,他們之間的關聯匹配程度。

通過倒排索引可以獲取與查詢語句相匹配的文檔列表,那麼如何將最符合用戶查詢需求的文檔放到前列呢?

本質是一個排序問題,排序的依據是相關性算分。

Elasticsearch使用的是 term frequency/inverse document frequency演算法,簡稱為TF/IDF演算法。TF詞頻(Term Frequency),IDF逆向文件頻率(Inverse Document Frequency)

相關性算分的幾個重要概念如下:

ES目前主要有兩個相關性算分模型,如下:

BM25中的IDF公式為:

原版BM25的log中是沒有加1的,Lucene為了防止產生負值,做了一點小優化。雖然對公式進行了更改,但其實和原來的公式沒有實質性的差異,下面是新舊函數曲線對比:

BM25中TF的公式為:

其中tf是傳統的詞頻值。先來看下改良前後的函數曲線對比(下圖中k=1.2):

可以看到,傳統的tf計算公式中,詞頻越高,tf值就越大,沒有上限。但BM中的tf,隨著詞頻的增長,tf值會無限逼近(k+1),相當於是有上限的。這就是二者的區別。一般 k取 1.2,Lucene中也使用1.2作為 k 的默認值。

在傳統的計算公式中,還有一個norm。BM25將這個因素加到了TF的計算公式中,結合了norm因素的BM25中的TF計算公式為:

和之前相比,就是給分母上面的 k 加了一個乘數 (1.0−b+b∗L)(1.0−b+b∗L)。 其中的 L 的計算公式為:

其中,|d|是當前文檔的長度,avgDl 是語料庫中所有文檔的平均長度。

b 是一個常數,用來控制 L 對最總評分影響的大小,一般取0~1之間的數(取0則代表完全忽略 L )。Lucene中 b 的默認值為 0.75。

通過這些細節上的改良,BM25在很多實際場景中的表現都優於傳統的TF-IDF,所以從Lucene 6.0.0版本開始,上位成為默認的相似度評分演算法。

上例是通過similarity屬性來指定打分模型,用到了以下三個參數:

如果我們要使用某種特定的打分模型,並且希望應用到全局,那麼就在elasticsearch.yml配置文件中加入:

通過boosting可以人為控制某個欄位的在評分過程中的比重,有兩種類型:

通過在mapping中設置boost參數,可以在索引期間改變欄位的評分權重:

需要注意的是:在索引期間修改的文檔boosting是存儲在索引中的,要想修改boosting必須重新索引該篇文檔。

一旦映射建立完成,那麼所有name欄位都會自動擁有一個boost值,並且是以降低精度的數值存儲在Lucene內部的索引結構中。只有一個位元組用於存儲浮點型數值(存不下就損失精度了),計算文檔的最終得分時可能會損失精度。

另外,boost是應用與詞條的。因此,再被boost的欄位中如果匹配上了多個詞條,就意味著計算多次的boost,這將會進一步增加欄位的權重,可能會影響最終的文檔得分。

查詢期間的boosting可以避免上述問題。

幾乎所有的查詢類型都支持boost,例如:

就對於最終得分而言,加了boost的name查詢更有影響力。也只有在bool查詢中,boost更有意義。

boost也可以用於multi_match查詢。

除此之外,我們還可以使用特殊的語法,只為特定的欄位指定一個boost。通過在欄位名稱後添加一個^符號和boost的值。告訴ES只需對那個欄位進行boost:

上例中,title欄位被boost了3倍。

需要注意的是:在使用boost的時候,無論是欄位或者詞條,都是按照相對值來boost的,而不是乘以乘數。如果對於所有的待搜索詞條boost了同樣的值,那麼就好像沒有boost一樣。因為Lucene會標准化boost的值。如果boost一個欄位4倍,不是意味著該欄位的得分就是乘以4的結果。

ES背後的評分過程比我們想像的要復雜,有時候某個查詢結果可能跟我們的預期不太一樣,這時候可以通過explain讓ES解釋一下評分細節。

由於結果太長,我們這里對結果進行了過濾("size": 1返回一篇文檔),只查看指定的欄位("_source": "name"只返回name欄位)。

在新增的_explanation欄位中,可以看到value值是0.9331132,那麼是怎麼算出來的呢?

分詞spring在描述欄位(name)出現了1次,所以TF的綜合得分經過"description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:"計算,得分是0.43243244。

那麼逆文檔詞頻呢?根據"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:"計算得分是0.98082924。

需要注意的是,explain的特性會給ES帶來額外的性能開銷,一般只在調試時使用。

搜索的時候,要依靠倒排索引;排序的時候,需要依靠正排索引,看到每個document的每個field,然後進行排序,所謂的正排索引,其實就是doc values。

在建立索引的時候,一方面會建立倒排索引,以供搜索用;一方面會建立正排索引,也就是doc values,以供排序,聚合,過濾等操作使用。

doc values是被保存在磁碟上的,此時如果內存足夠,os會自動將其緩存在內存中,性能還是會很高;如果內存不足夠,os會將其寫入磁碟上。

DocValues默認是啟用的,可以在創建索引的時候關閉,如果後面要開啟DocValues,需要做reindex操作。

參考:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

https://blog.csdn.net/qq_29860591/article/details/109574595

https://www.jianshu.com/p/2624f61f1d02

http://www.dtmao.cc/news_show_378736.shtml

https://blog.csdn.net/molong1208/article/details/50623948

https://www.cnblogs.com/Neeo/articles/10721071.html

https://www.cnblogs.com/jpfss/p/10775376.html

https://zhuanlan.hu.com/p/27951938

『貳』 TF-IDF 演算法

有一篇很長的文章,用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到?

"智能問答"、"企業"、"問答庫"這三個詞的出現次數一樣多。這是不是意味著,作為關鍵詞,它們的重要性是一樣的?

「企業」是很常見的詞,相對而言「智能問答」和「問答庫」不那麼常見。如果這三個詞在一篇文章的出現次數一樣多,我們有理由可以認為,「智能問答」和「問答庫」的重要程度要大於「企業」,也就是說,在關鍵詞排序方面,「智能問答「和」問答庫「應該排在」企業「前面。

需要一個重要性調整系數,衡量一個詞是不是常見詞。如果某個詞比較少見,但是它在這篇文章中多次出現,那麼它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。

用統計學語言表達,就是在詞頻的基礎上,要對每個詞分配一個"重要性"權重。

這個權重叫做"逆文檔頻率"(Inverse Document Frequency,縮寫為IDF),它的大小與一個詞的常見程度成反比。

知道了"詞頻"(TF)和"逆文檔頻率"(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關鍵詞。

需要一個語料庫(corpus),用來模擬語言的使用環境。
逆文檔頻率(IDF)= log(語料庫的文檔總數/包含該詞的文檔數+1)
如果一個詞越常見,那麼分母就越大,逆文檔頻率就越小越接近0。分母之所以要加1,是為了避免分母為0(即所有文檔都不包含該詞)。log表示對得到的值取對數。

TF-IDF=詞頻(TF)*逆文檔頻率(IDF)

TF-IDF與一個詞在文檔中的出現次數成正比,與該詞在整個語言中的出現次數成反比。所以,自動提取關鍵詞的演算法就很清楚了,就是計算出文檔的每個詞的TF-IDF值,然後按降序排列,取排在最前面的幾個詞。

自動提取關鍵詞,TF-IDF演算法還可以用於許多別的地方。比如,信息檢索時,對於每個文檔,都可以分別計算一組搜索詞("中國"、"蜜蜂"、"養殖")的TF-IDF,將它們相加,就可以得到整個文檔的TF-IDF。這個值最高的文檔就是與搜索詞最相關的文檔。

希望找到與原文章相似的其他文章,為了找出相似的文章,需要用到"餘弦相似性"(cosine similiarity)。下面,我舉一個例子來說明,什麼是"餘弦相似性"。

句子A:我喜歡吃蘋果,不喜歡吃香蕉
句子B:我不喜歡吃蘋果,也不喜歡吃香蕉
請問怎樣才能計算上面兩句話的相似程度?

基本思路是:如果這兩句話的用詞越相似,它們的內容就應該越相似。因此,可以從詞頻入手,計算它們的相似程度。

問題就變成了如何計算這兩個向量的相似程度。
我們可以把它們想像成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成一個夾角,如果夾角為0度,意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。
以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。餘弦定理告訴我們,可以用下面的公式求得:

coso=a_2+b_2-c_2/2ab
假定a向量是[x1, y1],b向量是[x2, y2],那麼可以將餘弦定理改寫成下面的形式:

coso=x_1x_2+y_1+y_2/sqrt()
餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。所以,上面的句子A和句子B是很相似的,事實上它們的夾角大約為20.3度。

由此,我們就得到了"找出相似文章"的一種演算法:

如果能從3000字的文章,提煉出150字的摘要,就可以為讀者節省大量閱讀時間。由人完成的摘要叫"人工摘要",由機器完成的就叫"自動摘要"。

文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。"自動摘要"就是要找出那些包含信息最多的句子。

句子的信息量用"關鍵詞"來衡量。如果包含的關鍵詞越多,就說明這個句子越重要。Luhn提出用"簇"(cluster)表示關鍵詞的聚集。所謂"簇"就是包含多個關鍵詞的句子片段。

『叄』 情感分析之TF-IDF演算法

http://mini.eastday.com/bdmip/180414224336264.html

在這篇文章中,主要介紹的內容有:

1、將單詞轉換為特徵向量

2、TF-IDF計算單詞關聯度

文本的預處理和分詞。

如何將單詞等分類數據轉成為數值格式,以方便我們後面使用機器學習來訓練模型。

一、將單詞轉換為特徵向量

詞袋模型(bag-of-words model):將文本以數值特徵向量的形式來表示。主要通過兩個步驟來實現詞袋模型:

1、為整個文檔集(包含了許多的文檔)上的每個單詞創建一個唯一的標記。

2、為每個文檔構建一個特徵向量,主要包含每個單詞在文檔上的出現次數。

注意:由於每個文檔中出現的單詞數量只是整個文檔集中很少的一部分,因此會有很多的單詞沒有出現過,就會被標記為0。所以,特徵向量中大多數的元素就會為0,就會產生稀疏矩陣。

下面通過sklearn的CountVectorizer來實現一個詞袋模型,將文檔轉換成為特徵向量

通過count.vocabulary_我們可以看出每個單詞所對應的索引位置,每一個句子都是由一個6維的特徵向量所組成。其中,第一列的索引為0,對應單詞"and","and"在第一和二條句子中沒有出現過,所以為0,在第三條句子中出現過一些,所以為1。特徵向量中的值也被稱為原始詞頻(raw term frequency)簡寫為tf(t,d),表示在文檔d中詞彙t的出現次數。

注意:在上面詞袋模型中,我們是使用單個的單詞來構建詞向量,這樣的序列被稱為1元組(1-gram)或單元組(unigram)模型。除了一元組以外,我們還可以構建n元組(n-gram)。n元組模型中的n取值與特定的應用場景有關,如在反垃圾郵件中,n的值為3或4的n元組可以獲得比較好的效果。下面舉例說明一下n元組,如在"the weather is sweet"這句話中,

1元組:"the"、"weather"、"is"、"sweet"。

2元組:"the weather"、"weather is"、"is sweet"。

在sklearn中,可以設置CountVecorizer中的ngram_range參數來構建不同的n元組模型,默認ngram_range=(1,1)。

sklearn通過CountVecorizer構建2元組

二、TF-IDF計算單詞關聯度

在使用上面的方法來構建詞向量的時候可能會遇到一個問題:一個單詞在不同類型的文檔中都出現,這種類型的單詞其實是不具備文檔類型的區分能力。我們通過TF-IDF演算法來構建詞向量,從而來克服這個問題。

詞頻-逆文檔頻率(TF-IDF,term frequency-inverse document frequency):tf-idf可以定義為詞頻×逆文檔頻率

其中tf(t,d)表示單詞t在文檔d中的出現次數,idf(t,d)為逆文檔頻率,計算公式如下

其中,nd表示文檔的總數,df(t,d)表示包含單詞t的文檔d的數量。分母中加入常數1,是為了防止df(t,d)=0的情況,導致分母為0。取log的目的是保證當df(t,d)很小的時候,不會導致idf(t,d)過大。

通過sklearn的TfidfTransformer和CountVectorizer來計算tf-idf

可以發現"is"(第二列)和"the"(第六列),它們在三個句子中都出現過,它們對於文檔的分類所提供的信息並不會很多,所以它們的tf-idf的值相對來說都是比較小的。

注意:sklearn中的TfidfTransformer的TF-IDF的計算與我們上面所定義TF-IDF的公式有所不同,sklearn的TF-IDF計算公式

通常在計算TF-IDF之前,會對原始詞頻tf(t,d)做歸一化處理,TfidfTransformer是直接對tf-idf做歸一化。TfidfTransformer默認使用L2歸一化,它通過與一個未歸一化特徵向量L2范數的比值,使得返迴向量的長度為1,計算公式如下:

下面通過一個例子來說明sklearn中的TfidfTransformer的tf-idf的計算過程,以上面的第一句話"The sun is shining"為例子

1、計算原始詞頻

a、單詞所對應的下標

b、計算第三句話的原始詞頻tf(t,d)

c、計算逆文檔頻率idf(t,d)

注意:其他的詞在計算tf-idf都是0,因為原始詞頻為0,所以就不需要計算idf了,log是以自然數e為底。

d、計算tf-idf

所以,第一個句子的tf-idf特徵向量為[0,1,1.29,1.29,0,1,0]

e、tf-idf的L2歸一化

『肆』 如何用python玩轉TF-IDF之尋找相似文章並生成摘要

應用1:關鍵詞自動生成

核心思想是對於某個文檔中的某個詞,計算其在這個文檔中的標准化TF值,然後計算這個詞在整個語料庫中的標准化IDF值。在這里,標准化是說對原始的計算公式進行了一些變換以取得更好的衡量效果,並避免某些極端情況的出現。這個詞的TF-IDF值便等於TF*IDF。對於這個文檔中的所有詞計算它們的TF-IDF值,並按照由高到低的順序進行排序,由此我們便可以提取我們想要的數量的關鍵詞。

TF-IDF的優點是快捷迅速,結果相對來說比較符合實際情況。缺點是當一篇文檔中的兩個詞的IDF值相同的時候,出現次數少的那個詞有可能更為重要。再者,TF-IDF演算法無法體現我詞的位置信息,出現位置靠前的詞與出現位置靠後的詞,都被視為重要性相同,這是不正確的。存在的解決辦法是對文章的第一段和每段的第一句話給予比較大的權重。

應用2:計算文本相似度

明白了對於每個詞,如何計算它的TF-IDF值。那麼計算文本相似度也輕而易舉。我們已經計算了文章中每個詞的TF-IDF值,那麼我們便可以將文章表徵為詞的TF-IDF數值向量。要計算兩個文本的相似度,只需要計算餘弦即可,餘弦值越大,兩個文本便越相似。

應用3:自動摘要

2007年,美國學者的論文<A Survey on Automatic Text Summarization>總結了目前的自動摘要演算法,其中很重要的一種就是詞頻統計。這種方法最早出自1958年IBM公司一位科學家的論文<The Automatic Creation of Literature Abstracts>。這位科學家認為,文章的信息都包含在句子中,有的句子包含的信息多,有的句子包含的信息少。自動摘要就是找出那些包含信息最多的句子。那麼句子的信息量怎麼衡量呢?論文中採用了關鍵詞來衡量。如果包含的關鍵詞越多,就說明這個句子越重要,這位科學家提出用Cluster的來表示關鍵詞的聚集。所謂簇,就是包含多個關鍵詞的句子片段。


以第一個圖為例,其中的cluster一共有7個詞,其中4個是關鍵詞。因此它的重要性分值就等於(4*4)/7=2.3。然後,找出包含cluster重要性分值最高的句子(比如5句),把它們合在一起,就構成了這篇文章的自動摘要。具體實現可以參見<Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites>(O'Reilly, 2011)一書的第8章,Python代碼見github。這種演算法後來被簡化,不再區分cluster,只考慮句子包含的關鍵詞。偽代碼如下。

Summarizer(originalText,maxSummarySize):
//計算文本的詞頻,生成一個列表,比如[(10,'the'),(3,'language'),(8,'code')...]
wordFrequences=getWordCounts(originalText)
//過濾掉停用詞,列表變成[(3,'language'),(8,'code')...]
contentWordFrequences=filtStopWords(wordFrequences)
//按照詞頻的大小進行排序,形成的列表為['code','language'...]
contentWordsSortbyFreq=sortByFreqThenDropFreq(contentWordFrequences)
//將文章分成句子
sentences=getSentences(originalText)
//選擇關鍵詞首先出現的句子
setSummarySentences={}
:
firstMatchingSentence=search(sentences,word)
setSummarySentences.add(firstMatchingSentence)
ifsetSummarySentences.size()=maxSummarySize:
break
//將選中的句子按照出現順序,組成摘要
summary=""
foreachsentenceinsentences:
:
summary=summary+""+sentence
returnsummary


類似的演算法已經被寫成了工具,比如基於Java的Classifier4J庫的SimpleSummariser模塊、基於C語言的OTS庫、以及基於classifier4J的C#實現和python實現。

『伍』 TFIDF演算法實現關鍵詞抽取

其實這是一個很簡單的演算法。
先來學習一下概念:

在實際的使用過程中,實際上先使用歷史存量數據計算出每個詞的IDF值,作為一個原始信息,在對新內容進行處理時,只需要計算出TF值就可以了,然後對這篇內容的所有詞計算出TFIDF值,然後進行排序就ok了。

TFIDF是一種十分簡單的關鍵詞提取方案,在實際的應用中,還可以進行多種演算法的融合,之後我再慢慢介紹。

當然了,該演算法還有一些變種,基本上基於下面幾種方法,有興趣的可以了解一下。

『陸』 通俗理解TF-IDF

在信息檢索中,tf-idf(詞頻-逆文檔頻率)是一種統計方法,用以評估一個單詞在一個文檔集合或語料庫中的重要程度。經常被用作信息檢索、文本挖掘以及用戶模型的權重因素。tf-idf的值會隨著單詞在文檔中出現的次數的增加而增大,也會隨著單詞在語料庫中出現的次數的增多而減小。tf-idf是如今最流行的詞頻加權方案之一。

tf-idf的各種改進版本經常被搜索引擎用作在給定用戶查詢時對文檔的相關性進行評分和排序的主要工具。tf-idf可以成功地用於各種主題欄位的停用詞過濾,包括文本摘要和分類。

TF-IDF實際上是:TF * IDF。主要思想是:如果某個詞或短語在一篇文章中出現的頻率高(即TF高),並且在其他文章中很少出現(即IDF高),則認為此詞或者短語具有很好的類別區分能力,適合用來分類。

通俗理解TF-IDF就是:TF刻畫了詞語t對某篇文檔的重要性,IDF刻畫了詞語t對整個文檔集的重要性。

TF(Term Frequency,詞頻)表示一個給定詞語t在一篇給定文檔d中出現的頻率。TF越高,則詞語t對文檔d來說越重要,TF越低,則詞語t對文檔d來說越不重要。那是否可以以TF作為文本相似度評價標准呢?答案是不行的,舉個例子,常用的中文詞語如「我」,「了」,「是」等,在給定的一篇中文文檔中出現的頻率是很高的,但這些中文詞幾乎在每篇文檔中都具有非常高的詞頻,如果以TF作為文本相似度評價標准,那麼幾乎每篇文檔都能被命中。

對於在某一文檔 d j 里的詞語 t i 來說,t i 的詞頻可表示為:

IDF(Inverse Document Frequency,逆向文件頻率)的主要思想是:如果包含詞語t的文檔越少,則IDF越大,說明詞語t在整個文檔集層面上具有很好的類別區分能力。IDF說明了什麼問題呢?還是舉個例子,常用的中文詞語如「我」,「了」,「是」等在每篇文檔中幾乎具有非常高的詞頻,那麼對於整個文檔集而言,這些詞都是不重要的。對於整個文檔集而言,評價詞語重要性的標准就是IDF。

某一特定詞語的IDF,可以由總文件數除以包含該詞語的文件數,再將得到的商取對數得到:

TFIDF演算法是建立在這樣一個假設之上的:對區別文檔最有意義的詞語應該是那些在文檔中出現頻率高,而在整個文檔集合的其他文檔中出現頻率少的詞語,所以如果特徵空間坐標系取TF詞頻作為測度,就可以體現同類文本的特點。另外考慮到單詞區別不同類別的能力,TF-IDF法認為一個單詞出現的文本頻數(即包含某個單詞的文本數)越小,它區別不同類別文本的能力就越大。因此引入了逆文本頻度IDF的概念,以TF和IDF的乘積作為特徵空間坐標系的取值測度,並用它完成對權值TF的調整,調整權值的目的在於突出重要單詞,抑制次要單詞。但是在本質上IDF是一種試圖抑制雜訊的加權,並且單純地認為文本頻率小的單詞就越重要,文本頻率大的單詞就越無用,顯然這並不是完全正確的。IDF的簡單結構並不能有效地反映單詞的重要程度和特徵詞的分布情況,使其無法很好地完成對權值調整的功能,所以TF-IDF法的精度並不是很高。

此外,在TFIDF演算法中並沒有體現出單詞的位置信息,對於Web文檔而言,權重的計算方法應該體現出HTML的結構特徵。特徵詞在不同的標記符中對文章內容的反映程度不同,其權重的計算方法也應不同。因此應該對於處於網頁不同位置的特徵詞分別賦予不同的系數,然後乘以特徵詞的詞頻,以提高文本表示的效果。

『柒』 文本特徵提取

在對文本數據進行處理時,很大一部分精力都用在數據集的特徵提取上,因此記錄一下常用的文本特徵提取方法。

文本特徵提取一般分為兩部分
(1)文本本身屬性:母音字數數、輔音字母數、···
(2)基於文本的特徵提取:TF-IDF等

比如提取以上文檔的特徵,基於文本本身可以提取特徵:
(1)字數:統計每一行text文本的詞彙數量(有多少個單詞)
(2)非重復單詞數量:統計每一行text文本中只出現一次的單詞個數
(3)長度:每一行text的長度,佔了多少存儲空間(包含空格、符號、字母等的長度)
(4)停止詞數量統計:between、but、about、very等詞彙的數量統計
(5)標點符號數量:每一行text中包含的標點符號數量
(6)大寫單詞數量:統計大寫單詞數量
(7)標題式單詞數量:統計單詞拼寫首字母是否為大寫,且其他字母為小寫的單詞數量
(8)單詞的平均長度:每一行text中每個單詞長度的平均值
這些特徵的提取不涉及復雜的函數計算,基於文本本身屬性提取直觀信息作為模型訓練的特徵。

·

TF-IDF演算法 :計算單詞權重最為有效的實現方法就是TF-IDF, 它是由Salton在1988 年提出的,以特徵詞在文檔d中出現的次數與包含該特徵詞的文檔數之比作為該詞的權重。

python中使用TfidfVectorizer函數實現TF-IDF特徵的提取,生成每個text的TF-IDF特徵。

·

經過TF-IDF特徵提取後,數據集的特徵變數超級多(TF-IDF計算了整個數據集出現的所有單詞對每個test的權重),面對這樣龐大的特徵數據,可以通過SVD實現對數據集的壓縮
SVD的原理是將龐大的TF-IDF生成的數據集A進行拆分,設置K值(想要壓縮得到的維度,例如K=20,壓縮後得到20列的特徵數據集)X就是只有K個特徵轉換後的數據集。

經過壓縮後的TF-IDF只有K列,與01中 基於文本本身特徵 合並,即為文本數據集的特徵向量。

『捌』 CV(8):TD-IDF演算法

參考: TF-IDF原理及使用

1. 原理

       TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率),是一種用於資訊檢索與資訊探勘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。 字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。

       詞頻 (term frequency, TF)指的是某一個給定的詞語在該文件中出現的次數。這個數字通常會被歸一化(一般是詞頻除以文章總詞數), 以防止它偏向長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞頻,而不管該詞語重要與否。)

       但是, 需要注意, 一些通用的詞語對於主題並沒有太大的作用, 反倒是一些出現頻率較少的詞才能夠表達文章的主題, 所以單純使用是TF不合適的。權重的設計必須滿足:一個詞預測主題的能力越強,權重越大,反之,權重越小。所有統計的文章中,一些詞只是在其中很少幾篇文章中出現,那麼這樣的詞對文章的主題的作用很大,這些詞的權重應該設計的較大。IDF就是在完成這樣的工作.

       逆向文件頻率 (inverse document frequency, IDF): IDF的主要思想是如果包含詞條t的文檔越少, IDF越大,則說明詞條具有很好的類別區分能力。某一特定詞語的IDF,可以由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到。

    某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。

2. 實例:

『玖』 大數據演算法:分類演算法

KNN演算法,即K近鄰(K Nearest Neighbour)演算法,是一種基本的分類演算法。其主要原理是:對於一個需要分類的數據,將其和一組已經分類標注好的樣本集合進行比較,得到距離最近的K個樣本,K個樣本最多歸屬的類別,就是這個需要分類數據的類別。下面我給你畫了一個KNN演算法的原理圖。

圖中,紅藍綠三種顏色的點為樣本數據,分屬三種類別 、 、 。對於待分類點 ,計算和它距離最近的5個點(即K為5),這5個點最多歸屬的類別為 (4個點歸屬 ,1個點歸屬 ),那麼 的類別被分類為 。

KNN的演算法流程也非常簡單,請看下面的流程圖。

KNN演算法是一種非常簡單實用的分類演算法,可用於各種分類的場景,比如新聞分類、商品分類等,甚至可用於簡單的文字識別。對於新聞分類,可以提前對若干新聞進行人工標注,標好新聞類別,計算好特徵向量。對於一篇未分類的新聞,計算其特徵向量後,跟所有已標注新聞進行距離計算,然後進一步利用KNN演算法進行自動分類。

讀到這你肯定會問,如何計算數據的距離呢?如何獲得新聞的特徵向量呢?

KNN演算法的關鍵是要比較需要分類的數據與樣本數據之間的距離,這在機器學習中通常的做法是:提取數據的特徵值,根據特徵值組成一個n維實數向量空間(這個空間也被稱作特徵空間),然後計算向量之間的空間距離。空間之間的距離計算方法有很多種,常用的有歐氏距離、餘弦距離等。

對於數據 和 ,若其特徵空間為n維實數向量空間 ,即 , ,則其歐氏距離計算公式為

這個歐式距離公式其實我們在初中的時候就學過,平面幾何和立體幾何里兩個點之間的距離,也是用這個公式計算出來的,只是平面幾何(二維幾何)里的n=2,立體幾何(三維幾何)里的n=3,而機器學習需要面對的每個數據都可能有n維的維度,即每個數據有n個特徵值。但是不管特徵值n是多少,兩個數據之間的空間距離的計算公式還是這個歐氏計算公式。大多數機器學習演算法都需要計算數據之間的距離,因此掌握數據的距離計算公式是掌握機器學習演算法的基礎。

歐氏距離是最常用的數據計算公式,但是在文本數據以及用戶評價數據的機器學習中,更常用的距離計算方法是餘弦相似度。

餘弦相似度的值越接近1表示其越相似,越接近0表示其差異越大,使用餘弦相似度可以消除數據的某些冗餘信息,某些情況下更貼近數據的本質。我舉個簡單的例子,比如兩篇文章的特徵值都是:「大數據」「機器學習」和「極客時間」,A文章的特徵向量為(3, 3, 3),即這三個詞出現次數都是3;B文章的特徵向量為(6, 6, 6),即這三個詞出現次數都是6。如果光看特徵向量,這兩個向量差別很大,如果用歐氏距離計算確實也很大,但是這兩篇文章其實非常相似,只是篇幅不同而已,它們的餘弦相似度為1,表示非常相似。

餘弦相似度其實是計算向量的夾角,而歐氏距離公式是計算空間距離。餘弦相似度更關注數據的相似性,比如兩個用戶給兩件商品的打分分別是(3, 3)和(4, 4),那麼兩個用戶對兩件商品的喜好是相似的,這種情況下,餘弦相似度比歐氏距離更合理。

我們知道了機器學習的演算法需要計算距離,而計算距離需要還知道數據的特徵向量,因此提取數據的特徵向量是機器學習工程師們的重要工作,有時候甚至是最重要的工作。不同的數據以及不同的應用場景需要提取不同的特徵值,我們以比較常見的文本數據為例,看看如何提取文本特徵向量。

文本數據的特徵值就是提取文本關鍵詞,TF-IDF演算法是比較常用且直觀的一種文本關鍵詞提取演算法。這種演算法是由TF和IDF兩部分構成。

TF是詞頻(Term Frequency),表示某個單詞在文檔中出現的頻率,一個單詞在一個文檔中出現的越頻繁,TF值越高。

詞頻:

IDF是逆文檔頻率(Inverse Document Frequency),表示這個單詞在所有文檔中的稀缺程度,越少文檔出現這個詞,IDF值越高。

逆文檔頻率:

TF與IDF的乘積就是TF-IDF。

所以如果一個詞在某一個文檔中頻繁出現,但在所有文檔中卻很少出現,那麼這個詞很可能就是這個文檔的關鍵詞。比如一篇關於原子能的技術文章,「核裂變」「放射性」「半衰期」等詞彙會在這篇文檔中頻繁出現,即TF很高;但是在所有文檔中出現的頻率卻比較低,即IDF也比較高。因此這幾個詞的TF-IDF值就會很高,就可能是這篇文檔的關鍵詞。如果這是一篇關於中國原子能的文章,也許「中國」這個詞也會頻繁出現,即TF也很高,但是「中國」也在很多文檔中出現,那麼IDF就會比較低,最後「中國」這個詞的TF-IDF就很低,不會成為這個文檔的關鍵詞。

提取出關鍵詞以後,就可以利用關鍵詞的詞頻構造特徵向量,比如上面例子關於原子能的文章,「核裂變」「放射性」「半衰期」這三個詞是特徵值,分別出現次數為12、9、4。那麼這篇文章的特徵向量就是(12, 9, 4),再利用前面提到的空間距離計算公式計算與其他文檔的距離,結合KNN演算法就可以實現文檔的自動分類。

貝葉斯公式是一種基於條件概率的分類演算法,如果我們已經知道A和B的發生概率,並且知道了B發生情況下A發生的概率,可以用貝葉斯公式計算A發生的情況下B發生的概率。事實上,我們可以根據A的情況,即輸入數據,判斷B的概率,即B的可能性,進而進行分類。

舉個例子:假設一所學校里男生佔60%,女生佔40%。男生總是穿長褲,女生則一半穿長褲一半穿裙子。假設你走在校園中,迎面走來一個穿長褲的學生,你能夠推斷出這個穿長褲學生是男生的概率是多少嗎?

答案是75%,具體演算法是:

這個演算法就利用了貝葉斯公式,貝葉斯公式的寫法是:

意思是A發生的條件下B發生的概率,等於B發生的條件下A發生的概率,乘以B發生的概率,除以A發生的概率。還是上面這個例子,如果我問你迎面走來穿裙子的學生是女生的概率是多少。同樣帶入貝葉斯公式,可以計算出是女生的概率為100%。其實這個結果我們根據常識也能推斷出來,但是很多時候,常識受各種因素的干擾,會出現偏差。比如有人看到一篇博士生給初中學歷老闆打工的新聞,就感嘆讀書無用。事實上,只是少見多怪,樣本量太少而已。而大量數據的統計規律則能准確反映事物的分類概率。

貝葉斯分類的一個典型的應用場合是垃圾郵件分類,通過對樣本郵件的統計,我們知道每個詞在郵件中出現的概率 ,我們也知道正常郵件概率 和垃圾郵件的概率 ,還可以統計出垃圾郵件中各個詞的出現概率 ,那麼現在一封新郵件到來,我們就可以根據郵件中出現的詞,計算 ,即得到這些詞出現情況下,郵件為垃圾郵件的概率,進而判斷郵件是否為垃圾郵件。

現實中,貝葉斯公式等號右邊的概率,我們可以通過對大數據的統計獲得,當有新的數據到來的時候,我們就可以帶入上面的貝葉斯公式計算其概率。而如果我們設定概率超過某個值就認為其會發生,那麼我們就對這個數據進行了分類和預測,具體過程如下圖所示。

訓練樣本就是我們的原始數據,有時候原始數據並不包含我們想要計算的維度數據,比如我們想用貝葉斯公式自動分類垃圾郵件,那麼首先要對原始郵件進行標注,需要標注哪些郵件是正常郵件、哪些郵件是垃圾郵件。這一類需要對數據進行標注才能進行的機器學習訓練也叫作有監督的機器學習。

『拾』 搜索引擎的排序演算法都有哪些是怎麼實現的

2.1基於詞頻統計——詞位置加權的搜索引擎
利用關鍵詞在文檔中出現的頻率和位置排序是搜索引擎最早期排序的主要思想,其技術發展也最為成熟,是第一階段搜索引擎的主要排序技術,應用非常廣泛,至今仍是許多搜索引擎的核心排序技術。其基本原理是:關鍵詞在文檔中詞頻越高,出現的位置越重要,則被認為和檢索詞的相關性越好。
1)詞頻統計
文檔的詞頻是指查詢關鍵詞在文檔中出現的頻率。查詢關鍵詞詞頻在文檔中出現的頻率越高,其相關度越大。但當關鍵詞為常用詞時,使其對相關性判斷的意義非常小。TF/IDF很好的解決了這個問題。TF/IDF演算法被認為是信息檢索中最重要的發明。TF(Term Frequency):單文本詞彙頻率,用關鍵詞的次數除以網頁的總字數,其商稱為「關鍵詞的頻率」。IDF(Inverse Document Frequency):逆文本頻率指數,其原理是,一個關鍵詞在N個網頁中出現過,那麼N越大,此關鍵詞的權重越小,反之亦然。當關鍵詞為常用詞時,其權重極小,從而解決詞頻統計的缺陷。
2)詞位置加權
在搜索引擎中,主要針對網頁進行詞位置加權。所以,頁面版式信息的分析至關重要。通過對檢索關鍵詞在Web頁面中不同位置和版式,給予不同的權值,從而根據權值來確定所搜索結果與檢索關鍵詞相關程度。可以考慮的版式信息有:是否是標題,是否為關鍵詞,是否是正文,字體大小,是否加粗等等。同時,錨文本的信息也是非常重要的,它一般能精確的描述所指向的頁面的內容。
2.2基於鏈接分析排序的第二代搜索引擎
鏈接分析排序的思想起源於文獻引文索引機制,即論文被引用的次數越多或被越權威的論文引用,其論文就越有價值。鏈接分析排序的思路與其相似,網頁被別的網頁引用的次數越多或被越權威的網頁引用,其價值就越大。被別的網頁引用的次數越多,說明該網頁越受歡迎,被越權威的網頁引用,說明該網頁質量越高。鏈接分析排序演算法大體可以分為以下幾類:基於隨機漫遊模型的,比如PageRank和Repution演算法;基於概率模型的,如SALSA、PHITS;基於Hub和Authority相互加強模型的,如HITS及其變種;基於貝葉斯模型的,如貝葉斯演算法及其簡化版本。所有的演算法在實際應用中都結合傳統的內容分析技術進行了優化。本文主要介紹以下幾種經典排序演算法:
1)PageRank演算法
PageRank演算法由斯坦福大學博士研究生Sergey Brin和Lwraence Page等提出的。PageRank演算法是Google搜索引擎的核心排序演算法,是Google成為全球最成功的搜索引擎的重要因素之一,同時開啟了鏈接分析研究的熱潮。
PageRank演算法的基本思想是:頁面的重要程度用PageRank值來衡量,PageRank值主要體現在兩個方面:引用該頁面的頁面個數和引用該頁面的頁面重要程度。一個頁面P(A)被另一個頁面P(B)引用,可看成P(B)推薦P(A),P(B)將其重要程度(PageRank值)平均的分配P(B)所引用的所有頁面,所以越多頁面引用P(A),則越多的頁面分配PageRank值給P(A),PageRank值也就越高,P(A)越重要。另外,P(B)越重要,它所引用的頁面能分配到的PageRank值就越多,P(A)的PageRank值也就越高,也就越重要。
其計算公式為:

PR(A):頁面A的PageRank值;
d:阻尼系數,由於某些頁面沒有入鏈接或者出鏈接,無法計算PageRank值,為避免這個問題(即LinkSink問題),而提出的。阻尼系數常指定為0.85。
R(Pi):頁面Pi的PageRank值;
C(Pi):頁面鏈出的鏈接數量;
PageRank值的計算初始值相同,為了不忽視被重要網頁鏈接的網頁也是重要的這一重要因素,需要反復迭代運算,據張映海撰文的計算結果,需要進行10次以上的迭代後鏈接評價值趨於穩定,如此經過多次迭代,系統的PR值達到收斂。
PageRank是一個與查詢無關的靜態演算法,因此所有網頁的PageRank值均可以通過離線計算獲得。這樣,減少了用戶檢索時需要的排序時間,極大地降低了查詢響應時間。但是PageRank存在兩個缺陷:首先PageRank演算法嚴重歧視新加入的網頁,因為新的網頁的出鏈接和入鏈接通常都很少,PageRank值非常低。另外PageRank演算法僅僅依靠外部鏈接數量和重要度來進行排名,而忽略了頁面的主題相關性,以至於一些主題不相關的網頁(如廣告頁面)獲得較大的PageRank值,從而影響了搜索結果的准確性。為此,各種主題相關演算法紛紛涌現,其中以以下幾種演算法最為典型。
2)Topic-Sensitive PageRank演算法
由於最初PageRank演算法中是沒有考慮主題相關因素的,斯坦福大學計算機科學系Taher Haveli-wala提出了一種主題敏感(Topic-Sensitive)的PageRank演算法解決了「主題漂流」問題。該演算法考慮到有些頁面在某些領域被認為是重要的,但並不表示它在其它領域也是重要的。
網頁A鏈接網頁B,可以看作網頁A對網頁B的評分,如果網頁A與網頁B屬於相同主題,則可認為A對B的評分更可靠。因為A與B可形象的看作是同行,同行對同行的了解往往比不是同行的要多,所以同行的評分往往比不是同行的評分可靠。遺憾的是TSPR並沒有利用主題的相關性來提高鏈接得分的准確性。
3)HillTop演算法
HillTop是Google的一個工程師Bharat在2001年獲得的專利。HillTop是一種查詢相關性鏈接分析演算法,克服了的PageRank的查詢無關性的缺點。HillTop演算法認為具有相同主題的相關文檔鏈接對於搜索者會有更大的價值。在Hilltop中僅考慮那些用於引導人們瀏覽資源的專家頁面(Export Sources)。Hilltop在收到一個查詢請求時,首先根據查詢的主題計算出一列相關性最強的專家頁面,然後根據指向目標頁面的非從屬專家頁面的數量和相關性來對目標頁面進行排序。
HillTop演算法確定網頁與搜索關鍵詞的匹配程度的基本排序過程取代了過分依靠PageRank的值去尋找那些權威頁面的方法,避免了許多想通過增加許多無效鏈接來提高網頁PageRank值的作弊方法。HillTop演算法通過不同等級的評分確保了評價結果對關鍵詞的相關性,通過不同位置的評分確保了主題(行業)的相關性,通過可區分短語數防止了關鍵詞的堆砌。
但是,專家頁面的搜索和確定對演算法起關鍵作用,專家頁面的質量對演算法的准確性起著決定性作用,也就忽略了大多數非專家頁面的影響。專家頁面在互聯網中占的比例非常低(1.79%),無法代表互聯網全部網頁,所以HillTop存在一定的局限性。同時,不同於PageRank演算法,HillTop演算法的運算是在線運行的,對系統的響應時間產生極大的壓力。
4)HITS
HITS(Hyperlink Inced Topic Search)演算法是Kleinberg在1998年提出的,是基於超鏈接分析排序演算法中另一個最著名的演算法之一。該演算法按照超鏈接的方向,將網頁分成兩種類型的頁面:Authority頁面和Hub頁面。Authority頁面又稱權威頁面,是指與某個查詢關鍵詞和組合最相近的頁面,Hub頁面又稱目錄頁,該頁面的內容主要是大量指向Authority頁面的鏈接,它的主要功能就是把這些Authority頁面聯合在一起。對於Authority頁面P,當指向P的Hub頁面越多,質量越高,P的Authority值就越大;而對於Hub頁面H,當H指向的Authority的頁面越多,Authority頁面質量越高,H的Hub值就越大。對整個Web集合而言,Authority和Hub是相互依賴、相互促進,相互加強的關系。Authority和Hub之間相互優化的關系,即為HITS演算法的基礎。
HITS基本思想是:演算法根據一個網頁的入度(指向此網頁的超鏈接)和出度(從此網頁指向別的網頁)來衡量網頁的重要性。在限定范圍之後根據網頁的出度和入度建立一個矩陣,通過矩陣的迭代運算和定義收斂的閾值不斷對兩個向量Authority和Hub值進行更新直至收斂。
實驗數據表明,HITS的排名准確性要比PageRank高,HITS演算法的設計符合網路用戶評價網路資源質量的普遍標准,因此能夠為用戶更好的利用網路信息檢索工具訪問互聯網資源帶來便利。
但卻存在以下缺陷:首先,HITS演算法只計算主特徵向量,處理不好主題漂移問題;其次,進行窄主題查詢時,可能產生主題泛化問題;第三,HITS演算法可以說一種實驗性質的嘗試。它必須在網路信息檢索系統進行面向內容的檢索操作之後,基於內容檢索的結果頁面及其直接相連的頁面之間的鏈接關系進行計算。盡管有人嘗試通過演算法改進和專門設立鏈接結構計算伺服器(Connectivity Server)等操作,可以實現一定程度的在線實時計算,但其計算代價仍然是不可接受的。
2.3基於智能化排序的第三代搜索引擎
排序演算法在搜索引擎中具有特別重要的地位,目前許多搜索引擎都在進一步研究新的排序方法,來提升用戶的滿意度。但目前第二代搜索引擎有著兩個不足之處,在此背景下,基於智能化排序的第三代搜索引擎也就應運而生。
1)相關性問題
相關性是指檢索詞和頁面的相關程度。由於語言復雜,僅僅通過鏈接分析及網頁的表面特徵來判斷檢索詞與頁面的相關性是片面的。例如:檢索「稻瘟病」,有網頁是介紹水稻病蟲害信息的,但文中沒有「稻瘟病」這個詞,搜索引擎根本無法檢索到。正是以上原因,造成大量的搜索引擎作弊現象無法解決。解決相關性的的方法應該是增加語意理解,分析檢索關鍵詞與網頁的相關程度,相關性分析越精準,用戶的搜索效果就會越好。同時,相關性低的網頁可以剔除,有效地防止搜索引擎作弊現象。檢索關鍵詞和網頁的相關性是在線運行的,會給系統相應時間很大的壓力,可以採用分布式體系結構可以提高系統規模和性能。
2)搜索結果的單一化問題
在搜索引擎上,任何人搜索同一個詞的結果都是一樣。這並不能滿足用戶的需求。不同的用戶對檢索的結果要求是不一樣的。例如:普通的農民檢索「稻瘟病」,只是想得到稻瘟病的相關信息以及防治方法,但農業專家或科技工作者可能會想得到稻瘟病相關的論文。
解決搜索結果單一的方法是提供個性化服務,實現智能搜索。通過Web數據挖掘,建立用戶模型(如用戶背景、興趣、行為、風格),提供個性化服務。

熱點內容
入門c語言設計 發布:2025-05-17 12:08:31 瀏覽:40
c3演算法 發布:2025-05-17 12:04:19 瀏覽:364
phprecv 發布:2025-05-17 11:55:00 瀏覽:610
福建時鍾監控網關伺服器雲主機 發布:2025-05-17 11:54:28 瀏覽:248
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:960
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:958
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:976
我的世界伺服器圈太大了怎麼辦 發布:2025-05-17 11:15:21 瀏覽:614
便宜的免費雲伺服器 發布:2025-05-17 11:08:50 瀏覽:779
中國頂級dhcp解析伺服器地址 發布:2025-05-17 11:06:27 瀏覽:36