日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rocchio算法—文本分类

發(fā)布時間:2024/9/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rocchio算法—文本分类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文本表示:其實就是文本的向量化問題。
向量空間模型的思想是把文檔簡化為特征項的權(quán)重為分量的向量表示,其中選取詞作為特征項,權(quán)重用詞頻表示。
其主要用的是TF-IDF算法來計算:TF(詞頻)是一個詞語出現(xiàn)的次數(shù)除以該文件的總詞語數(shù)。IDF(文件頻率)的方法是測定有多少文件出現(xiàn)過某個詞,然后除以文件集里的文件數(shù)。注意這里IDF用的是逆向文件頻率,即假如“汽車”一詞在100份文件中出現(xiàn)過,總文件數(shù)是10000份,這時的逆向文件頻率為log10(10000/100)=2,而得到的TF是0.05,此時的TF-IDF分數(shù)為0.05x2=0.1。

也即是,如果某個詞在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認為這個詞有很好的類別區(qū)分能力,適合用來分類;IDF表示含有該詞匯的文檔,比例越低IDF越大,則說明該詞匯具有良好的類別區(qū)分能力。

1. Rocchio算法

Rocchio算法是一種非常直觀的文本分類算法。其核心思路是給每一個文檔的類別都做一個的標準向量(也稱為原型向量),然后用待分類的文檔的向量和這個標準向量對比一下余弦相似度,相似度越高越可能屬于該分類,反之亦然。

例如:在新聞網(wǎng)站中希望構(gòu)造一個自動的文章分類系統(tǒng),然后先收集10000個樣本,然后由人給每篇文章劃分類別,然后把每個類別里的每篇文章逐個拿出來做分詞和向量化,這樣每個類別里的每篇文章都有一個非常長的向量模型。再把得到的每個類別的所有文章進行維度的平均(詞頻的平均),得到的這個原型向量稱為“質(zhì)心”。當(dāng)有一篇新的文章要分類時也同樣進行分詞和向量化,下面就是余弦相似度的計算了。cos(θ)越接近1說明越相似,越接近0就說明越不相似,這里不存在小于0的情況。

這里要注意的是文本挖掘里的使用的向量和其他的向量使用有所不同,這里的維度數(shù)會因文本的不同而不同,而且這里維度的值不是枚舉類型,是0—1的區(qū)間內(nèi)的數(shù)。

2. 學(xué)習(xí)20newsgroups案例

20新聞組數(shù)據(jù)集是一個接近被2000個新聞組文檔的集合,它是由Ken Lang收集的,也許是為了他的論文:”Newsweeder:學(xué)習(xí)過濾新聞”,盡管他沒有明確的提到這個數(shù)據(jù)集.20新聞組集合在機器學(xué)習(xí)技術(shù)中的文本應(yīng)用實驗中已經(jīng)成為一個流行的數(shù)據(jù)集.

數(shù)據(jù)的采集有兩種方法,這里簡單介紹下:

2.1 scikit-learn:加載本地的原始數(shù)據(jù)

可以先下載好數(shù)據(jù)集,然后使用sklearn.datasets.load_files函數(shù)加載解壓縮文件夾內(nèi)的子文件夾。

sklearn.datasets.load_files(container_path, description=None, categories=None,load_content=True, shuffle=True, encoding=None, decode_error='strict', random_state=0)

部分參數(shù)說明:container_path,load_content=True,encoding=None

  • container_path:“container_folder”的路徑。
  • load_content=True:是否真的把文件中的內(nèi)容加載到內(nèi)存中,選擇true就是了。
  • encoding=None:string or None (default is None),是否解碼文件中的內(nèi)容(主要針對圖片、視頻或其他二進制文件,而非文本內(nèi)容);如果不是None,那么在load_content=True的情況下,就會解碼文件中的內(nèi)容。注意,當(dāng)前文本文件的編碼方式一般為“utf-8”。如果不指明編碼方式(encoding=None),那么文件內(nèi)容將會按照bytes處理,而不是unicode處理,這樣模塊“sklearn.feature_extraction.tex”中的很多函數(shù)就不能用了。

返回值:data : Bunch

值得注意的:

data:原始數(shù)據(jù)
filenames:每個文件的名字
target:類別標簽(從0開始的整數(shù)索引)
target_names:類別標簽(數(shù)字)的具體含義(由子文件夾的名字決定)

簡單示例:
這里以加載20個新聞組數(shù)據(jù)集為例,提前把數(shù)據(jù)集下載好,放于和運行文件的同一個目錄下。

代碼:

from sklearn import datasets# 讀取訓(xùn)練集 newsgroups_train = datasets.load_files("20news-bydate-train") pprint(list(newsgroups_train.target_names)) print (len(newsgroups_train.target_names))

運行結(jié)果:

>>> ==== 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'] 20

2.2 在線下載數(shù)據(jù)集

我們也可以使用scikit-learn自帶的toy example數(shù)據(jù)集進行測試,介紹一下如何加載自帶的數(shù)據(jù)集。

可以使用sklearn.datasets的fetch_20newsgroups進行在線的自動下載。

函數(shù)原型:

fetch_20newsgroups(data_home=None,subset='train',categories=None,shuffle=True,random_state=42,remove=(),download_if_missing=True)
  • data_home:指的是數(shù)據(jù)集的地址,如果默認的話,所有的數(shù)據(jù)都會在’~/scikit_learn_data’文件夾下.
  • subset:就是train,test,all三種可選,分別對應(yīng)訓(xùn)練集、測試集和所有樣本。
  • categories:是指類別,如果指定類別,就會只提取出目標類,如果是默認,則是提取所有類別出來。
  • shuffle:是否打亂樣本順序,如果是相互獨立的話。
  • random_state:打亂順序的隨機種子
  • remove:是一個元組,用來去除一些停用詞的,例如標題引用之類的。
  • download_if_missing: 如果數(shù)據(jù)缺失,是否去下載。

注意:在線的下載會花費一段時間,如果你擔(dān)心程序死掉了,可以打開在線下載文件的保存目錄:C:\Users\lilong\scikit_learn_data\20news_home,這個文件夾下就是在線下載的保存目錄,觀察這個文件夾你會發(fā)現(xiàn)文件在一個一個增加,最后下載完成后壓縮包文件和解壓的文件都會被自動刪除,最后只剩下20news-bydate_py3.pkz文件了,這里暫且看作是程序運行后內(nèi)存可以讀取的文件。

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# 讀取訓(xùn)練集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..............')# 文件內(nèi)容在twenty_train這個變量里,現(xiàn)在對內(nèi)容進行分詞和向量化操作 count_vect = CountVectorizer() X_train_counts = count_vect.fit_transform(twenty_train.data)# 接著對向量化之后的結(jié)果做TF-IDF轉(zhuǎn)換 tfidf_transformer = TfidfTransformer() X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)# Rocchio的示例代碼 from sklearn.neighbors.nearest_centroid import NearestCentroid # 現(xiàn)在把TF-IDF轉(zhuǎn)換后的結(jié)果和每條結(jié)果對應(yīng)的主題編號twenty_train.target放入分類器進行訓(xùn)練 clf = NearestCentroid().fit(X_train_tfidf, twenty_train.target)# 創(chuàng)建測試集合,這里有2條數(shù)據(jù),每條數(shù)據(jù)一行內(nèi)容,進行向量化和tf-idf轉(zhuǎn)換 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)# 預(yù)測 predicted = clf.predict(X_new_tfidf)# 打印結(jié)果 for doc, category in zip(docs_new, predicted):print('%r => %s' % (doc, twenty_train.target_names[category]))

運行結(jié)果:

>>> ==== 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算法的缺陷是很明顯的,它做了兩個假設(shè),使得它的分類能力大大折扣。
假設(shè)一:一個類別的文本僅僅聚集在一個質(zhì)心的周圍,實際情況往往不是。
假設(shè)二:訓(xùn)練樣本是絕對正確的,因為它沒有任何的定量衡量樣本是否含有噪聲的機制,錯誤的分類會影響質(zhì)心的位置。

3. 筆記

zip([iterable, …])函數(shù)使用:其中iterabl 代表一個或多個迭代器,zip() 函數(shù)用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。
如果各個迭代器的元素個數(shù)不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表。

>>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = zip(a,b) # 打包為元組的列表 [(1, 4), (2, 5), (3, 6)] >>> zip(a,c) # 元素個數(shù)與最短的列表一致 [(1, 4), (2, 5), (3, 6)] >>> zip(*zipped) # 與 zip 相反,可理解為解壓,返回二維矩陣式 [(1, 2, 3), (4, 5, 6)]

參考:http://www.runoob.com/python/python-func-zip.html
http://blog.csdn.net/mmc2015/article/details/46852963
《白話大數(shù)據(jù)與機器學(xué)習(xí)》

總結(jié)

以上是生活随笔為你收集整理的Rocchio算法—文本分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。