Rocchio算法—文本分类
文本表示:其實就是文本的向量化問題。
向量空間模型的思想是把文檔簡化為特征項的權重為分量的向量表示,其中選取詞作為特征項,權重用詞頻表示。
其主要用的是TF-IDF算法來計算:TF(詞頻)是一個詞語出現的次數除以該文件的總詞語數。IDF(文件頻率)的方法是測定有多少文件出現過某個詞,然后除以文件集里的文件數。注意這里IDF用的是逆向文件頻率,即假如“汽車”一詞在100份文件中出現過,總文件數是10000份,這時的逆向文件頻率為log10(10000/100)=2,而得到的TF是0.05,此時的TF-IDF分數為0.05x2=0.1。
也即是,如果某個詞在一篇文章中出現的頻率TF高,并且在其他文章中很少出現,則認為這個詞有很好的類別區分能力,適合用來分類;IDF表示含有該詞匯的文檔,比例越低IDF越大,則說明該詞匯具有良好的類別區分能力。
1. Rocchio算法
Rocchio算法是一種非常直觀的文本分類算法。其核心思路是給每一個文檔的類別都做一個的標準向量(也稱為原型向量),然后用待分類的文檔的向量和這個標準向量對比一下余弦相似度,相似度越高越可能屬于該分類,反之亦然。
例如:在新聞網站中希望構造一個自動的文章分類系統,然后先收集10000個樣本,然后由人給每篇文章劃分類別,然后把每個類別里的每篇文章逐個拿出來做分詞和向量化,這樣每個類別里的每篇文章都有一個非常長的向量模型。再把得到的每個類別的所有文章進行維度的平均(詞頻的平均),得到的這個原型向量稱為“質心”。當有一篇新的文章要分類時也同樣進行分詞和向量化,下面就是余弦相似度的計算了。cos(θ)越接近1說明越相似,越接近0就說明越不相似,這里不存在小于0的情況。
這里要注意的是文本挖掘里的使用的向量和其他的向量使用有所不同,這里的維度數會因文本的不同而不同,而且這里維度的值不是枚舉類型,是0—1的區間內的數。
2. 學習20newsgroups案例
20新聞組數據集是一個接近被2000個新聞組文檔的集合,它是由Ken Lang收集的,也許是為了他的論文:”Newsweeder:學習過濾新聞”,盡管他沒有明確的提到這個數據集.20新聞組集合在機器學習技術中的文本應用實驗中已經成為一個流行的數據集.
數據的采集有兩種方法,這里簡單介紹下:
2.1 scikit-learn:加載本地的原始數據
可以先下載好數據集,然后使用sklearn.datasets.load_files函數加載解壓縮文件夾內的子文件夾。
sklearn.datasets.load_files(container_path, description=None, categories=None,load_content=True, shuffle=True, encoding=None, decode_error='strict', random_state=0)部分參數說明:container_path,load_content=True,encoding=None
- container_path:“container_folder”的路徑。
- load_content=True:是否真的把文件中的內容加載到內存中,選擇true就是了。
- encoding=None:string or None (default is None),是否解碼文件中的內容(主要針對圖片、視頻或其他二進制文件,而非文本內容);如果不是None,那么在load_content=True的情況下,就會解碼文件中的內容。注意,當前文本文件的編碼方式一般為“utf-8”。如果不指明編碼方式(encoding=None),那么文件內容將會按照bytes處理,而不是unicode處理,這樣模塊“sklearn.feature_extraction.tex”中的很多函數就不能用了。
返回值:data : Bunch
值得注意的:
data:原始數據
filenames:每個文件的名字
target:類別標簽(從0開始的整數索引)
target_names:類別標簽(數字)的具體含義(由子文件夾的名字決定)
簡單示例:
這里以加載20個新聞組數據集為例,提前把數據集下載好,放于和運行文件的同一個目錄下。
代碼:
from sklearn import datasets# 讀取訓練集 newsgroups_train = datasets.load_files("20news-bydate-train") pprint(list(newsgroups_train.target_names)) print (len(newsgroups_train.target_names))運行結果:
>>> ==== RESTART: C:\Users\LiLong\Desktop\test_now\naive_bayes_multinomial.py ==== ['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware','comp.windows.x','misc.forsale','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med','sci.space','soc.religion.christian','talk.politics.guns','talk.politics.mideast','talk.politics.misc','talk.religion.misc'] 202.2 在線下載數據集
我們也可以使用scikit-learn自帶的toy example數據集進行測試,介紹一下如何加載自帶的數據集。
可以使用sklearn.datasets的fetch_20newsgroups進行在線的自動下載。
函數原型:
fetch_20newsgroups(data_home=None,subset='train',categories=None,shuffle=True,random_state=42,remove=(),download_if_missing=True)- data_home:指的是數據集的地址,如果默認的話,所有的數據都會在’~/scikit_learn_data’文件夾下.
- subset:就是train,test,all三種可選,分別對應訓練集、測試集和所有樣本。
- categories:是指類別,如果指定類別,就會只提取出目標類,如果是默認,則是提取所有類別出來。
- shuffle:是否打亂樣本順序,如果是相互獨立的話。
- random_state:打亂順序的隨機種子
- remove:是一個元組,用來去除一些停用詞的,例如標題引用之類的。
- download_if_missing: 如果數據缺失,是否去下載。
注意:在線的下載會花費一段時間,如果你擔心程序死掉了,可以打開在線下載文件的保存目錄:C:\Users\lilong\scikit_learn_data\20news_home,這個文件夾下就是在線下載的保存目錄,觀察這個文件夾你會發現文件在一個一個增加,最后下載完成后壓縮包文件和解壓的文件都會被自動刪除,最后只剩下20news-bydate_py3.pkz文件了,這里暫且看作是程序運行后內存可以讀取的文件。
2.3 完整代碼
#coding=utf-8 from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.naive_bayes import MultinomialNB from pprint import pprint# 讀取訓練集newsgroups_train = fetch_20newsgroups(subset='train') pprint(list(newsgroups_train.target_names)) ''' newsgroups_train = datasets.load_files("20news-bydate-train") # 得到20個主題 pprint(list(newsgroups_train.target_names)) print (len(newsgroups_train.target_names))# 這里選取4個主題 categories = ['rec.sport.baseball', 'alt.atheism', 'talk.politics.guns', 'sci.space']# 下載這4個主題 twenty_train = fetch_20newsgroups(subset='train', categories=categories) print ('here..............')# 文件內容在twenty_train這個變量里,現在對內容進行分詞和向量化操作 count_vect = CountVectorizer() X_train_counts = count_vect.fit_transform(twenty_train.data)# 接著對向量化之后的結果做TF-IDF轉換 tfidf_transformer = TfidfTransformer() X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)# Rocchio的示例代碼 from sklearn.neighbors.nearest_centroid import NearestCentroid # 現在把TF-IDF轉換后的結果和每條結果對應的主題編號twenty_train.target放入分類器進行訓練 clf = NearestCentroid().fit(X_train_tfidf, twenty_train.target)# 創建測試集合,這里有2條數據,每條數據一行內容,進行向量化和tf-idf轉換 docs_new = ['God is love', 'OpenGL on the GPU is fast'] X_new_counts = count_vect.transform(docs_new) X_new_tfidf = tfidf_transformer.transform(X_new_counts)# 預測 predicted = clf.predict(X_new_tfidf)# 打印結果 for doc, category in zip(docs_new, predicted):print('%r => %s' % (doc, twenty_train.target_names[category]))運行結果:
>>> ==== RESTART: C:\Users\LiLong\Desktop\test_now\naive_bayes_multinomial.py ==== ['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware','comp.windows.x','misc.forsale','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med','sci.space','soc.religion.christian','talk.politics.guns','talk.politics.mideast','talk.politics.misc','talk.religion.misc'] here.............. 'God is love' => alt.atheism 'OpenGL on the GPU is fast' => sci.space注意這里的Rocchio算法的缺陷是很明顯的,它做了兩個假設,使得它的分類能力大大折扣。
假設一:一個類別的文本僅僅聚集在一個質心的周圍,實際情況往往不是。
假設二:訓練樣本是絕對正確的,因為它沒有任何的定量衡量樣本是否含有噪聲的機制,錯誤的分類會影響質心的位置。
3. 筆記
zip([iterable, …])函數使用:其中iterabl 代表一個或多個迭代器,zip() 函數用于將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。
如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表。
參考:http://www.runoob.com/python/python-func-zip.html
http://blog.csdn.net/mmc2015/article/details/46852963
《白話大數據與機器學習》
總結
以上是生活随笔為你收集整理的Rocchio算法—文本分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁速用是哪家公司的
- 下一篇: 推荐算法基础