特征工程——文本特征
目錄
文本特征
1.expansion編碼
2.consolidation編碼
3.文本長度特征
4.標點符號特征
5.詞匯屬性特征
6.特殊詞匯特征
7.詞頻特征
8.TF-IDF特征
9.LDA特征
注意:
1.?本系列所有的文章主要是梯度提升樹模型展開的,抽取的特征主要為幫助梯度提升樹模型挖掘其挖掘不到的信息,本文介紹的所有特征都可以當做特征直接加入模型,和基于神經網絡的策略有些許差別;
2. 因篇幅過多,本篇文章介紹文本特征的20種不同的特征,后續的文本特征會在后面的文章中更新!
文本特征
文本特征和類別特征會有一些簡單的交集,一些簡單的文本特征可以直接當做類別特征處理,例如:
花的顏色:red,blue,yellow等等;
名字:Mr jack,Mr smith,Mrs will,Mr phil等等。
對這些特征可以直接進行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
2.consolidation編碼
consolidation編碼常常出現在一些特殊的字符串中,例如:
一些帶有地址的字符串,字符串會給出詳細的信息,XX市XX縣XX村XX號等,這時我們可以將市抽取來作為一個全新的特征;
很多產品,例如手機,pad等等,我們可以單獨抽象為蘋果,三星等公司等信息;
consolidation編碼和上面的expansion編碼類似,也是一種帶有業務信息的聚類信息,可以加速樹模型的搜索速度,也是一類非常不錯的特征.
3.文本長度特征
文本的長度特征,可以按照文本的段落,句子,單詞和字母四大粒度進行枚舉式的構建,這些特征可以反映文本的段落結構,在很多問題中都是非常重要的信息,例如判斷文本的類型,判斷文本是小說還是論文還是其它,此時文本的長度特征就是非常強的特征。
1.段落的個數
顧名思義就是文本中段落的個數。
2.句子的個數
文本中句子的個數,可以通過計算句號感嘆號等次數來統計。
3.單詞的個數
文本中單詞的個數,可以通過直接通過將標點符號轉化為空格,然后計算空格個數的方式來計算。
4.字母個數
刪除所有的標點之后直接統計所有字母的個數。
5.平均每個段落的句子個數
平均每個段落的句子個數 = 句子的個數 / 段落的個數
6.平均每個段落的單詞個數
平均每個段落的句子個數 = 單詞的個數 / 段落的個數
7.平均每個段落的字母個數
平均每個段落的句子個數 = 文本字母個數 / 段落的個數
8.平均每個句子的單詞個數
平均每個句子的單詞個數 = 單詞的個數 / 句子的個數
9.平均每個句子的字母個數
平均每個句子的字母個數 = 文本字母個數 / 句子的個數
10.平均每個單詞的長度
平均每個單詞的長度 = 文本字母個數 / 文本單詞個數
4.標點符號特征
標點符號也蘊藏有非常重要的信息,例如在情感分類的問題中,感嘆號等信息往往意味著非常強烈的情感表達,對于最終模型的預測可以帶來非常大的幫助。
1.標點符號的個數
直接計算標點符號出現的次數。
2.特殊標點符號的個數
統計文本中一些重要的標點符號出現的次數,例如:
情感分類問題中,感嘆號出現的次數,問號出現的次數等。
在病毒預測問題中,異常符號出現的次數。
3.其它
此處需要額外注意一點,就是一些奇異的標點符號,例如連續多個感嘆號,"!!!"或者連續多個問號“???”,這種符號的情感表示更為強烈,所以很多時候也需要特別注意。
5.詞匯屬性特征
每個詞都有其所屬的屬性,例如是名詞,動詞,還是形容詞等等。詞匯屬性特征很多時候能幫助模型帶來效果上的微弱提升,可以作為一類補充信息。
?
?
6.特殊詞匯特征
標點符號能從側面反映文本的情感強烈程度等信息,在情感分類,文本分類中有很重要的作用,當然與此同時,特殊詞匯的特征特征則更為重要。
我們可以選擇直接分類別(每一類情感表示一類)統計每個類別中詞匯的出現次數。
7.詞頻特征
上面是一些簡單的文本特征,還有一些文本信息會相對復雜一些,例如是句子等文本。這個時候我們就需要一些常用的文本工具了,而最為常見的就是詞頻統計特征,該特征較為簡單,就是統計文本中每個詞出現的次數,因為每個文本一般都是由單詞所組成的,而每個單詞出現的次數在一定程度上又可以從側面反映該文章的內容,例如在謀篇文章中,"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,最終我們得到的結果也可以拆解為下面兩個核心部分:
document-topic矩陣,這將是我們需要的特征矩陣你在找什么。
一個topic-term矩陣,它幫助我們查看語料庫中的潛在主題。
此處我們使用上面的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
查看主題以及對應的每個詞的貢獻。
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)]
AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。