1. 程式人生 > >【Scikit-Learn 中文文件】處理文字資料

【Scikit-Learn 中文文件】處理文字資料

載入這20個新聞組的資料集

該資料集名為 “Twenty Newsgroups”. 下面就是這個資料集的介紹, 來源於 網站:

20 個新聞組資料集是一個近 包括了20,000 個新聞組檔案的彙編,(幾乎)平均分成了 20 個不同新聞組. 據我們所知,這最初是由 Ken Lang 收集的 ,很可能是為了他的論文 “Newsweeder: Learning to filter netnews,” 儘管他沒有明確提及這個彙編. 這20 個新聞組彙編已成為一個流行的資料集,用於機器學習中的文字應用的試驗中,如文字分類和文字聚類.

接下來我們會使用 scikit-learn 中的這個內建資料集載入器來載入這20個新聞組. 或者, 也可以手動從網站上下載資料集,然後通過指向未壓縮的資料夾下的 20news-bydate-train

 子資料夾來使用函式 sklearn.datasets.load_files .

為了在第一個示例中節約時間,我們將使用部分資料:從20類別中選出4個:

>>>
>>> categories = ['alt.atheism', 'soc.religion.christian',
...               'comp.graphics', 'sci.med']

如下所示,我們現在能夠載入包含對應類別的檔案的列表:

>>>
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty_train = fetch_20newsgroups(subset='train', ... categories=categories, shuffle=True, random_state=42)

返回的資料型別是一個 scikit-learn “bunch”: 一個簡單的包含多個 “field” 的儲存物件 , 方便使python 中的 dict keys 或 object 中屬性來讀取, 比如 target_names 包含了所要求的類別名稱:

>>>
>>> twenty_train.target_names
['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']

這些檔案本身被讀進記憶體的 data 屬性中. 另外,這些檔名稱也可以容易獲取到:

>>>
>>> len(twenty_train.data)
2257
>>> len(twenty_train.filenames)
2257

讓我們打印出所載入的第一個檔案的前幾行:

>>>
>>> print("\n".join(twenty_train.data[0].split("\n")[:3]))
From: [email protected] (Michael Collier)
Subject: Converting images to HP LaserJet III?
Nntp-Posting-Host: hampton

>>> print(twenty_train.target_names[twenty_train.target[0]])
comp.graphics

監督學習需要讓訓練集中的每個文件對應一個類別標籤. 在這個例子中,類別是每個新聞組的名稱,也剛好是每個儲存文字檔案的資料夾的名稱.

由於速度和空間上效率的原因 scikit-learn 載入目標屬性為一個整型數列, 它與 target_names 列表中類別名稱的 index(索引)相對應. 每個樣本的類別的整數型 id 存放在 target 屬性中:

>>>
>>> twenty_train.target[:10]
array([1, 1, 3, 3, 3, 3, 3, 2, 2, 2])

也可以通過如下方式取得類別名稱:

>>>
>>> for t in twenty_train.target[:10]:
...     print(twenty_train.target_names[t])
...
comp.graphics
comp.graphics
soc.religion.christian
soc.religion.christian
soc.religion.christian
soc.religion.christian
soc.religion.christian
sci.med
sci.med
sci.med

你可以發現所有的樣本都被隨機打亂(使用了修正的 RNG 種子): 當你在訓練進行整個資料集之前,你只要選取前幾個樣本來快速訓練一個模型的時候以及獲得初步結果.這是非常有用的.