數據挖掘 20 大文本特徵!

作者:****塵沙傑少********

20 大文本特徵!

文本特徵和類別特徵會有一些簡單的交集,一些簡單的文本特徵可以直接當做類別特徵處理,例如:

對這些特徵可以直接進行 Label 編碼然後採用類別特徵的技巧對其進行特徵工程。除了把文本特徵當做類別特徵處理,我們在做文本相關的特徵工程時,需要注意非常多的細節,相較於 Label 編碼,就是如何防止文本內的信息丟失問題。文本特徵的處理涉及到非常多的 NLP 技術,此處我們主要介紹一些經常需要注意的地方以及一些技巧,關於最新的方法,大家可以跟進最新的 NLP 相關技術。

針對梯度提升樹模型對文本特徵進行特徵工程,我們需要充分挖掘 Label 編碼丟失的信息,例如上面的名字特徵,內部存在非常強的規律,Mr 等信息,這些信息反映了性別相關的信息,如果直接進行 Label 編碼就會丟失此類信息,所以我們可以通過文本技巧對其進行挖掘。

1.expansion 編碼

expansion 編碼常常出現在一些複雜的字符串中,例如一些帶有版本信息的字符串,很多版本號的信息中涵蓋了時間以及編號等信息,我們需要將其拆分開,形成多個新的特徵列,例如下面的例子:

expansion 編碼類似於一種帶有業務信息的聚類信息, 可以加速樹模型的搜索速度, 也是非常非常不錯的特徵.

import pandas as pd
df = pd.DataFrame()
df['feature']      = ['Apple_iPhone_6', 'Apple_iPhone_6', 'Apple_iPad_3', 'Google_Pixel_3']
df['feature_1st']  = df['feature'].apply(lambda x: x.split('_')[0])
df['feature_2nd']  = df['feature'].apply(lambda x: x.split('_')[1])
df['feature_3rd']  = df['feature'].apply(lambda x: x.split('_')[2])
df

ASpRIj

2.consolidation 編碼

consolidation 編碼常常出現在一些特殊的字符串中,例如:

consolidation 編碼和上面的 expansion 編碼類似,也是一種帶有業務信息的聚類信息, 可以加速樹模型的搜索速度, 也是一類非常不錯的特徵.

  1. 文本長度特徵

文本的長度特徵,可以按照文本的段落,句子,單詞和字母四大粒度進行枚舉式的構建,這些特徵可以反映文本的段落結構,在很多問題中都是非常重要的信息,例如判斷文本的類型,判斷文本是小說還是論文還是其它,此時文本的長度特徵就是非常強的特徵。

1. 段落的個數

顧名思義就是文本中段落的個數。

2. 句子的個數

文本中句子的個數,可以通過計算句號感嘆號等次數來統計。

3. 單詞的個數

文本中單詞的個數,可以通過直接通過將標點符號轉化爲空格,然後計算空格個數的方式來計算。

4. 字母個數

刪除所有的標點之後直接統計所有字母的個數。

5. 平均每個段落的句子個數

平均每個段落的句子個數 = 句子的個數 / 段落的個數

6. 平均每個段落的單詞個數

平均每個段落的句子個數 = 單詞的個數 / 段落的個數

7. 平均每個段落的字母個數

平均每個段落的句子個數 = 文本字母個數 / 段落的個數

8. 平均每個句子的單詞個數

平均每個句子的單詞個數 = 單詞的個數 / 句子的個數

9. 平均每個句子的字母個數

平均每個句子的字母個數 = 文本字母個數 / 句子的個數

10. 平均每個單詞的長度

平均每個單詞的長度 = 文本字母個數 / 文本單詞個數

  1. 標點符號特徵

標點符號也蘊藏有非常重要的信息,例如在情感分類的問題中,感嘆號等信息往往意味着非常強烈的情感表達,對於最終模型的預測可以帶來非常大的幫助。

1. 標點符號的個數

直接計算標點符號出現的次數。

2. 特殊標點符號的個數

統計文本中一些重要的標點符號出現的次數,例如:

3. 其它

此處需要額外注意一點,就是一些奇異的標點符號,例如連續多個感嘆號,"!!!" 或者連續多個問號 “???”,這種符號的情感表示更爲強烈,所以很多時候也需要特別注意。

  1. 詞彙屬性特徵

每個詞都有其所屬的屬性,例如是名詞,動詞,還是形容詞等等。詞彙屬性特徵很多時候能幫助模型帶來效果上的微弱提升,可以作爲一類補充信息。

  1. 特殊詞彙特徵

標點符號能從側面反映文本的情感強烈程度等信息,在情感分類,文本分類中有很重要的作用,當然與此同時,特殊詞彙的特徵特徵則更爲重要。

我們可以選擇直接分類別 (每一類情感表示一類)統計每個類別中詞彙的出現次數。

  1. 詞頻特徵

上面是一些簡單的文本特徵,還有一些文本信息會相對複雜一些,例如是句子等文本。這個時候我們就需要一些常用的文本工具了,而最爲常見的就是詞頻統計特徵,該特徵較爲簡單,就是統計文本中每個詞出現的次數,因爲每個文本一般都是由單詞所組成的,而每個單詞出現的次數在一定程度上又可以從側面反映該文章的內容,例如在謀篇文章中,"love" 這個詞出現的比較多, 也就是說 "love" 對應的詞頻比較大,則我們可以猜測該文章很大可能屬於情感類的文章。所以在處理文本類的信息時,詞頻特徵是非常重要的信息之一。

# 導入工具包
from sklearn.feature_extraction.text import CountVectorizer 
# 初始化,並引入停止詞彙
vectorizer = CountVectorizer(stop_words=set(['the', 'six', 'less', 'being', 'indeed', 'over', 'move', 'anyway', 'four', 'not', 'own', 'through', 'yourselves']))
df = pd.DataFrame()
df['text'] = ["The sky is blue.", "The sun is bright.","The sun in the sky is bright.", "We can see the shining sun, the bright sun."]

 # 獲取詞彙
vectorizer.fit_transform(df['text']).todense()
matrix([[1, 0, 0, 0, 1, 0, 0, 1, 0, 0],
        [0, 1, 0, 0, 1, 0, 0, 0, 1, 0],
        [0, 1, 0, 1, 1, 0, 0, 1, 1, 0],
        [0, 1, 1, 0, 0, 1, 1, 0, 2, 1]])

如果希望知道上面每一列的意思,可以直接觀測文本的字典即可。

vectorizer.vocabulary_
{'sky': 7,
 'is': 4,
 'blue': 0,
 'sun': 8,
 'bright': 1,
 'in': 3,
 'we': 9,
 'can': 2,
 'see': 5,
 'shining': 6}

詞頻特徵簡單易於理解,能夠從宏觀的角度捕獲文本的信息。相較於直接 Label 編碼可以能提取更多有用的信息特徵,從而帶來效果上的提升,但是詞頻特徵往往會受到停止詞彙的影響 (stop words),例如 "the,a" 出現次數往往較多, 這在聚類的時候如果選用了錯誤的聚類距離, 例如 l2 距離等,則往往難以獲得較好的聚類效果, 所以需要細心的進行停止詞彙的刪選; 受文本大小的影響, 如果文章比較長, 則詞彙較多, 文本較短, 詞彙則會較少等問題。

8.TF-IDF 特徵

TF-IDF 特徵是詞頻特徵的一個擴展延伸,詞頻特徵可以從宏觀的方面表示文本的信息,但在詞頻方法因爲將頻繁的詞彙的作用放大了,例如常見的 "I",'the" 等;將稀有的詞彙, 例如 "garden","tiger" 的作用縮減了,而這些單詞卻有着極爲重要的信息量,所以詞頻特徵往往很難捕獲一些出現次數較少但是又非常有效的信息。而 TF-IDF 特徵可以很好地緩解此類問題的方法。TF-IDF 從全局(所有文件)和局部(單個文件)的角度來解決上述問題,TF-IDF 可以更好地給出某個單詞對於某個文件的重要性。

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_model = TfidfVectorizer()
# 獲取詞彙
tfidf_matrix = tfidf_model.fit_transform(df['text']).todense()
tfidf_matrix
matrix([[0.65919112, 0.        , 0.        , 0.        , 0.42075315,
         0.        , 0.        , 0.51971385, 0.        , 0.34399327,
         0.        ],
        [0.        , 0.52210862, 0.        , 0.        , 0.52210862,
         0.        , 0.        , 0.        , 0.52210862, 0.42685801,
         0.        ],
        [0.        , 0.3218464 , 0.        , 0.50423458, 0.3218464 ,
         0.        , 0.        , 0.39754433, 0.3218464 , 0.52626104,
         0.        ],
        [0.        , 0.23910199, 0.37459947, 0.        , 0.        ,
         0.37459947, 0.37459947, 0.        , 0.47820398, 0.39096309,
         0.37459947]])

如果希望知道上面每一列的意思,可以直接觀測文本的字典即可。

tfidf_model.vocabulary_
{'the': 9,
 'sky': 7,
 'is': 4,
 'blue': 0,
 'sun': 8,
 'bright': 1,
 'in': 3,
 'we': 10,
 'can': 2,
 'see': 5,
 'shining': 6}
tfidf_model.idf_
array([1.91629073, 1.22314355, 1.91629073, 1.91629073, 1.22314355,
       1.91629073, 1.91629073, 1.51082562, 1.22314355, 1.        ,
       1.91629073])

TDIDF 忽略了文章的內容,詞彙之間的聯繫, 雖然可以通過 N-Gram 的方式進行緩解, 但其實依然沒有從本質上解決該問題。

9.LDA 特徵

基於詞頻的特徵和基於 TFIDF 的特徵都是向量形式的,因而我們可以採用基於向量抽取特徵的方式對其抽取新特徵,而最爲典型的就是主題模型。主題模型的思想是圍繞從以主題表示的文檔語料庫中提取關鍵主題或概念的過程爲中心。每個主題都可以表示爲一個包或從文檔語料庫收集單詞 / 術語。這些術語共同表示特定的主題、主題或概念,每個主題都可以通過這些術語所傳達的語義意義與其他主題進行區分。這些概念可以從簡單的事實和陳述到觀點和觀點。主題模型在總結大量文本文檔來提取和描述關鍵概念方面非常有用。它們還可以從捕獲數據中潛在模式的文本數據中提取特徵。

因爲主題模型涉及的數學等概念較多,此處我們僅僅介紹其使用方案,有興趣的朋友可以去閱讀論文等資料。

一般我們會在 TF-IDF 或者詞頻等矩陣上使用 LDA,最終我們得到的結果也可以拆解爲下面兩個核心部分:

此處我們使用上面的 TDIDF 矩陣並設置主題爲 2 個進行試驗。

from sklearn.decomposition import LatentDirichletAllocation

lda       = LatentDirichletAllocation(n_components=2, max_iter=10000, random_state=0)
dt_matrix = lda.fit_transform(tfidf_matrix)
features  = pd.DataFrame(dt_matrix, columns=['T1', 'T2'])
features

RU14rW

tt_matrix = lda.components_
vocab = tfidf_model.get_feature_names()
for topic_weights in tt_matrix:
    topic = [(token, weight) for token, weight in zip(vocab, topic_weights)]
    topic = sorted(topic, key=lambda x: -x[1])
    topic = [item for item in topic if item[1] > 0.2]
    print(topic)
    print()
[('the', 2.1446092537000254), ('sun', 1.7781565358915534), ('is', 1.7250615399950295), ('bright', 1.5425619519080085), ('sky', 1.3771748032988098), ('blue', 1.116020185537514), ('in', 0.9734645258594571), ('can', 0.828463031801155), ('see', 0.828463031801155), ('shining', 0.828463031801155), ('we', 0.828463031801155)]

[('can', 0.5461364394229279), ('see', 0.5461364394229279), ('shining', 0.5461364394229279), ('we', 0.5461364394229279), ('sun', 0.5440024650128295), ('the', 0.5434661558382532), ('blue', 0.5431709323301609), ('bright', 0.5404950589213404), ('sky', 0.5400833776748659), ('is', 0.539646632403921), ('in', 0.5307700509960934)]
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6clPKhE6byozqTMjS1M5BA