歡迎訪問集智主站:集智,通向智能時代的引擎html
在使用機器學習方法解決實際問題的時候,每每咱們所獲得的並非純粹的數據文件,它們有多是圖片、文本、視頻等包含有效信息的複雜數據,這時候就須要咱們從這些數據中提取數字特徵,以便於咱們以後的分析和訓練過程。本節將介紹Scikit-learn中可用於文本分類的一些功能,它們包括bash
關於具體的使用文本特徵進行模型訓練、評估和優化過程,咱們將在下一節的文章中進行討論。網絡
首先來了解咱們所要用到的數據集。本文所用到的數據集被稱爲「20種新聞組」,是一個常常被用來進行機器學習和天然語言處理的數據集。它包含20種新聞類別的近20000篇新聞,其官方簡介可參見 http://qwone.com/~jason/20Newsgroups/ 。數據結構
咱們有多種方式來獲取這個數據集,一種簡單的方法是使用sclearn的自帶函數sklearn.datasets.fetch_20newsgroups
。這個函數能自動從網上下載「20種新聞組」的數據並進行讀取,示例以下。爲了節省計算和處理的時間,咱們僅選取20種分類中的四種進行以後的分析工做。dom
注意:因爲數據包體積較大且數據源地址在國外,下述示例運行將比較緩慢,所以不提供運行。機器學習
from sklearn.datasets import fetch_20newsgroups
# 選取須要下載的新聞分類
categories = ["alt.atheism", "soc.religion.christian",
"comp.graphics", "sci.med"]
# 下載並獲取訓練數據
twenty_train = fetch_20newsgroups(subset="train",
categories=categories, shuffle=True, random_state=42)
# 顯示訓練數據的分類
twenty_train.target_names
複製代碼
固然,咱們更經常使用的方法是直接從網絡下載咱們所須要的數據。咱們能夠用Python所提供的urllib庫來完成數據包的下載工做,並解壓。從網絡下載文件可使用urllib.request.urlretrieve
這個函數。一般,咱們下載到的數據包都是壓縮文件,這時候咱們可使用tarfile
這個庫來完成,以下面的例子所示。函數
# 從網絡下載數據包
from urllib import request
request.urlretrieve("http://jizhi-10061919.cos.myqcloud.com/sklearn/20news-bydate.tar.gz", "data.tar.gz")
# 解壓下載的數據包
import tarfile
tar = tarfile.open("data.tar.gz", "r:gz")
tar.extractall()
tar.close()
# 選取須要下載的新聞分類
categories = ['alt.atheism','soc.religion.christian',
'comp.graphics', 'sci.med']
# 從硬盤獲取訓練數據
from sklearn.datasets import load_files
twenty_train = load_files('20news-bydate/20news-bydate-train',
categories=categories,
load_content = True,
encoding='latin1',
decode_error='strict',
shuffle=True,random_state=42)
# 顯示訓練數據的分類
print(twenty_train.target_names)
複製代碼
如上所示,數據包下載完成後,咱們可使用sklearn.datasets.load_files
來獲取數據。咱們一樣只採集四種分類的文本數據用於分析,並檢查所讀取文本數據的一些信息以肯定數據已被讀取。post
不管是什麼機器學習方法,都只能針對向量特徵(也就是一系列的數字組合)進行分析,所以在讀取文本以後,咱們要將文本轉化爲數字化的特徵向量。學習
提取文本特徵最經常使用的一種方法就是使用詞袋模型,其具體表述以下: 爲訓練集文檔中全部出現的詞語給予一個固定的數字ID(也就是爲全部的詞語創建一個由整數進行索引的字典) 對於每一篇文檔#i
,計算每一個詞語w
出現的次數並將其記錄在X[i, j]
中做爲特徵#j
的值,j
表明詞語w在字典中的位置fetch
詞袋模型假設每一個數據集中存在n_features
個不一樣的單詞,而這個數字一般會超過100000。這會帶來什麼問題呢?考慮一下,若是採樣數(也就是文檔的個數)爲10000,特徵以32位浮點數存儲,則總的文本特徵須要,而這4GB必須所有存儲在計算機內存中,這對於如今的計算機而言幾乎是不可能的。
幸運的是,上述方法獲得的特徵數據中大部分特徵數值都會是零值,這是由於每篇文檔實際上僅使用了幾百個不一樣的詞彙。因爲這個緣由,咱們將詞袋模型稱之爲高維度稀疏數據集。咱們能夠經過僅存儲非零特徵來大幅節省內存使用量。
scipy.sparse
模型正是處理這個過程的一系列數據結構,而它們也獲得了scikit-learn
的支持。
一個高效的數據處理模塊會包含文本與處理、標記和停詞(stopwords,指對句意無影響的虛詞,如「的」、「地」等等)過濾等功能,這些功能可以幫助咱們將文本數據轉換爲特徵向量,從而創建起數據的特徵字典。
CountVectorizer
就是一個支持文本中詞語計數的函數庫,咱們可使用其中的函數來分析文本數據來獲得特徵向量字典,字典中每個項目的值表明該詞語在所有數據中出現的次數,以下面的例子所示。
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
# 打印特徵相關信息
print("訓練數據共有{0}篇, 詞彙計數爲{1}個".format(X_train_counts.shape[0], X_train_counts.shape[1]))
# 查看某個詞語的計數
count = count_vect.vocabulary_.get(u'algorithm')
print("algorithm的出現次數爲{0}".format(count))
複製代碼
統計詞語的出現次數是個很好的嘗試,但這也一樣存在一個問題,那就是對於一個詞語而言,它在較長篇幅的文章出現的機率每每會比短文章高得多,即使是這兩篇文章討論的是同一個話題,這個現象一樣存在。
爲了解決這些潛在的差別,咱們能夠嘗試用每一個詞語在某個文檔中出現的次數除以這個文檔中總共的詞語數目,這樣獲得的新的特徵咱們能夠稱之爲tf
,也就是詞頻(Term Frequencies)。
在tf
基礎上的另一種優化方案是爲某些不過重要的詞語下降權重,這些詞語每每會在不少文檔中出現,相對於那些僅在一小部分文檔中出現的詞語而言,它們對於分類的影響會更細微。
咱們把這種詞頻+權重模型稱之爲tf-idf
,也就是「Term Frequency times Inverse Document Frequency」。下面咱們簡要介紹它們的數學意義。
tf
,即詞頻,指的是一個詞語在某篇文檔中中出現的機率,它能夠用以下的公式計算:
[math]$$$\textrm{tf}_{i,j}=\frac{n_{i,j}}{\sum_kn_{k,j}}$$$[/math]
其中指詞語在文件中出現的次數,而[math]$\sum_kn_{k,j}$[/math]
指文件中全部詞語的出現次數。
idf
,即逆向文件頻率,指的是一個詞語廣泛重要性的度量,表示該詞語信息量的大小。IDF能夠由總文件數目除以包含該詞語的文件的數目而後取對數獲得:
其中表示數據中的文件總數,表示包含詞語的文件數目。
最後則有:
[math]$$$\textrm{tfidf}_{i,j}= \textrm{tf}_{i,j}\times \textrm{idf}_i$$$[/math]
tf
與tf-idf
都可以經過如下的方式獲得計算。
from sklearn.feature_extraction.text import TfidfTransformer
# 使用TF-IDF提取文本特徵
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
# 查看特徵結果
X_train_tf.shape
複製代碼
在上述的代碼中,咱們首先使用了fit(..)
方法來處理原始文本數據而後使用transform(..)
方法來將詞彙統計數據轉換爲tf-idf
模型。這兩部其實能夠合併到一塊兒以節省計算過程,咱們可使用以下所示的fit_transform(..)
方法來實現這一點。
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
# 查看特徵結果
X_train_tfidf.shape
複製代碼
至此咱們就完成了使用tf-idf
模型從文本數據提取數據特徵的所有過程,咱們將在下一節討論如何使用這些數據特徵進行文本分類模型訓練、評估和優化過程。
(本篇課程內容來自於Scikit-Learn - Working With Text Data,轉載請註明來源。)