1. 程式人生 > >CountVectorizer與TfidfVectorizer 對文字特徵的特徵抽取

CountVectorizer與TfidfVectorizer 對文字特徵的特徵抽取

對新聞文字資料使用CountVectorizer與TfidfVectorizer  抽取特徵,使用樸素貝葉斯進行分類。

# -*- coding:utf-8 -*-
if __name__ == '__main__':
    print "hello"
    # 從sklearn.datasets裡匯入20類新聞文字資料抓取器。
    from sklearn.datasets import fetch_20newsgroups
    # 從網際網路上即時下載新聞樣本,subset='all'引數代表下載全部近2萬條文字儲存在變數news中。
    news = fetch_20newsgroups(subset='all',download_if_missing=False)
    # news = fetch_20newsgroups(subset='all')

    # 從sklearn.cross_validation匯入train_test_split模組用於分割資料集。
    from sklearn.model_selection import train_test_split
    # 對news中的資料data進行分割,25%的文字用作測試集;75%作為訓練集。
    X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=33)

    # 從sklearn.feature_extraction.text裡匯入CountVectorizer
    from sklearn.feature_extraction.text import CountVectorizer
    # 採用預設的配置對CountVectorizer進行初始化(預設配置不去除英文停用詞),並且賦值給變數count_vec。
    count_vec = CountVectorizer()

    # 只使用詞頻統計的方式將原始訓練和測試文字轉化為特徵向量。
    X_count_train = count_vec.fit_transform(X_train)
    X_count_test = count_vec.transform(X_test)

    # 從sklearn.naive_bayes裡匯入樸素貝葉斯分類器。
    from sklearn.naive_bayes import MultinomialNB
    # 使用預設的配置對分類器進行初始化。先驗概率假設為多項式
    mnb_count = MultinomialNB()
    # 使用樸素貝葉斯分類器,對CountVectorizer(不去除停用詞)後的訓練樣本進行引數學習。
    mnb_count.fit(X_count_train, y_train)

    # 輸出模型準確性結果。
    print 'The accuracy of classifying 20newsgroups using Naive Bayes (CountVectorizer without filtering stopwords):', mnb_count.score(X_count_test, y_test)
    # 將分類預測的結果儲存在變數y_count_predict中。
    y_count_predict = mnb_count.predict(X_count_test)
    # 從sklearn.metrics 匯入 classification_report。
    from sklearn.metrics import classification_report
    # 輸出更加詳細的其他評價分類效能的指標。
    print classification_report(y_test, y_count_predict, target_names = news.target_names)



    # 從sklearn.feature_extraction.text裡分別匯入TfidfVectorizer。
    from sklearn.feature_extraction.text import TfidfVectorizer

    # 採用預設的配置對TfidfVectorizer進行初始化(預設配置不去除英文停用詞),並且賦值給變數tfidf_vec。
    tfidf_vec = TfidfVectorizer()

    # 使用tfidf的方式,將原始訓練和測試文字轉化為特徵向量。
    X_tfidf_train = tfidf_vec.fit_transform(X_train)
    X_tfidf_test = tfidf_vec.transform(X_test)

    # 依然使用預設配置的樸素貝葉斯分類器,在相同的訓練和測試資料上,對新的特徵量化方式進行效能評估。
    mnb_tfidf = MultinomialNB()
    mnb_tfidf.fit(X_tfidf_train, y_train)
    print 'The accuracy of classifying 20newsgroups with Naive Bayes (TfidfVectorizer without filtering stopwords):', mnb_tfidf.score(
        X_tfidf_test, y_test)
    y_tfidf_predict = mnb_tfidf.predict(X_tfidf_test)
    print classification_report(y_test, y_tfidf_predict, target_names=news.target_names)