天天看點

機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

學習目标

  1. 應用DictVectorizer實作對類别特征進行數值化、離散化
  2. 應用CountVectorizer實作對文本特征進行數值化
  3. 應用TfidfVectorizer實作對文本特征進行數值化
  4. 說出兩種文本特征提取的方式差別

1 特征提取

1.1 定義

特征提取是将任意資料(如文本或圖像)轉換為可用于機器學習的數字特征

注:特征值化是為了計算機更好的去了解資料
  • 字典特征提取(特征離散化)
  • 文本特征提取
  • 圖像特征提取(深度學習)

1.2 特征提取API

sklearn.feature_extraction
           

2 字典特征提取

作用:對字典資料進行特征值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X) X:字典或者包含字典的疊代器,傳回值:傳回sparse矩陣
    • DictVectorizer.inverse_transform(X) X:array數組或者sparse矩陣 傳回值:轉換之前資料格式
    • DictVectorizer.get_feature_names() 傳回類别名稱

2.1 應用

我們對以下資料進行特征提取

[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]
           
機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

2.2 流程分析

  • 執行個體化類DictVectorizer
  • 調用fit_transform方法輸入資料并轉換(注意傳回格式)
def dictvec():
    # 執行個體化dict
    dict = DictVectorizer(sparse=False)
    my_dict_list = [{'city': '北京', 'temperature': 100},
                    {'city': '上海', 'temperature': 60},
                    {'city': '深圳', 'temperature': 30}]
    # 調用 fit_transform方法輸入資料并轉換(注意傳回格式)
    data = dict.fit_transform(my_dict_list)
    # 列印每一個列的名稱
    print(dict.get_feature_names())
    print(data)

    return None           

注意觀察沒有加上sparse=False參數的結果

機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

這個結果并不是我們想要看到的,是以加上參數,得到想要的結果,在這裡我們把這個處理資料的技巧用專業的稱呼"one-hot"編碼。

2.3 總結

對于特征當中存在類别資訊的我們都會做one-hot編碼處理

3 文本特征提取

作用:對文本資料進行特征值化

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    • 傳回詞頻矩陣
  • CountVectorizer.fit_transform(X) X:文本或者包含文本字元串的可疊代對象 傳回值:傳回sparse矩陣
  • CountVectorizer.inverse_transform(X) X:array數組或者sparse矩陣 傳回值:轉換之前資料格
  • CountVectorizer.get_feature_names() 傳回值:單詞清單
  • sklearn.feature_extraction.text.TfidfVectorizer

3.1 應用

我們對以下資料進行特征提取

["life is short,i like python",
"life is too long,i dislike python"]
           
機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

3.2 流程分析

  • 執行個體化類CountVectorizer
  • 調用fit_transform方法輸入資料并轉換 (注意傳回格式,利用toarray()進行sparse矩陣轉換array數組)
def countvec():
    # 執行個體化conunt
    count = CountVectorizer()
    data = count.fit_transform(["life is is short,i like python", "life is too long,i dislike python"])
    # 内容
    print(count.get_feature_names())
    # 利用toarray()進行sparse矩陣轉換array數組
    print(data.toarray())

    return None           

問題:如果我們将資料替換成中文?

"人生苦短,我喜歡Python" "生活太長久,我不喜歡Python"
           

那麼最終得到的結果是

機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

為什麼會得到這樣的結果呢,仔細分析之後會發現英文預設是以空格分開的。其實就達到了一個分詞的效果,是以我們要對中文進行分詞處理

3.3 jieba分詞處理

  • jieba.cut()
    • 傳回詞語組成的生成器

需要安裝下jieba庫

pip install jieba
           

3.4 案例分析

對以下三句話進行特征值化

今天很殘酷,明天更殘酷,後天很美好,
但絕對大部分是死在明天晚上,是以每個人不要放棄今天。

我們看到的從很遠星系來的光是在幾百萬年之前發出的,
這樣當我們看到宇宙時,我們是在看它的過去。

如果隻用一種方式了解某樣事物,你就不會真正了解它。
了解事物真正含義的秘密取決于如何将其與我們所了解的事物相聯系。
           
  • 分析
    • 準備句子,利用jieba.cut進行分詞
    • 執行個體化CountVectorizer
    • 将分詞結果變成字元串當作fit_transform的輸入值
機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取
def cutword():
    # 将三個句子用jieba.cut處理
    contetn1 = jieba.cut("今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,是以每個人不要放棄今天。")
    contetn2 = jieba.cut("我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。")
    contetn3 = jieba.cut("如果隻用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何将其與我們所了解的事物相聯系。")
    # 先将着三個轉換成清單
    c1 = ' '.join(list(contetn1))
    c2 = ' '.join(list(contetn2))
    c3 = ' '.join(list(contetn3))

    return c1, c2, c3


def chvec():
    # 執行個體化conunt
    count = CountVectorizer(stop_words=['不要', '我們', '是以'])
    # 定義一個分詞的函數
    c1, c2, c3 = cutword()
    data = count.fit_transform([c1, c2, c3])
    # 内容
    print(count.get_feature_names())
    print(data.toarray())

    return None
           
問題:該如何處理某個詞或短語在多篇文章中出現的次數高這種情況?

3.5 Tf-idf文本特征提取

  • TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的機率高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類别區分能力,适合用來分類。
  • TF-IDF作用:用以評估一字詞對于一個檔案集或一個語料庫中的其中一份檔案的重要程度。

3.5.1 公式

  • 詞頻(term frequency,tf)指的是某一個給定的詞語在該檔案中出現的頻率
  • 逆向文檔頻率(inverse document frequency,idf)是一個詞語普遍重要性的度量。某一特定詞語的idf,可以由總檔案數目除以包含該詞語之檔案的數目,再将得到的商取以10為底的對數得到
機器學習 - 特征提取學習目标1 特征提取2 字典特征提取3 文本特征提取

最終得出結果可以了解為重要程度。

注:假如一篇檔案的總詞語數是100個,而詞語"非常"出現了5次,那麼"非常"一詞在該檔案中的詞頻就是5/100=0.05。而計算檔案頻率(IDF)的方法是以檔案集的檔案總數,除以出現"非常"一詞的檔案數。是以,如果"非常"一詞在1,000份檔案出現過,而檔案總數是10,000,000份的話,其逆向檔案頻率就是lg(10,000,000 / 1,0000)=3。最後"非常"對于這篇文檔的tf-idf的分數為0.05 * 3=0.15

3.5.2 案例

def tfidfvec():

    # 執行個體化conunt
    tfidf = TfidfVectorizer()
    # 定義一個分詞的函數
    c1, c2, c3 = cutword()
    data = tfidf.fit_transform([c1, c2, c3])
    # 内容
    print(tfidf.get_feature_names())
    print(data.toarray())

    return None
           

3.6 Tf-idf的重要性

分類機器學習算法進行文章分類中前期資料處理方式

繼續閱讀