【數(shù)據(jù)競賽】Kaggle實(shí)戰(zhàn)之特征工程篇-20大文本特征(下)
特征工程--文本特征下半篇!

這是一個(gè)系列篇,后續(xù)我們會(huì)按照我們第一章中的框架進(jìn)行更新,因?yàn)榇蠹移綍r(shí)都較忙,不會(huì)定期更新,如有興趣歡迎長期關(guān)注我們的公眾號(hào),如有任何建議可以在評(píng)論區(qū)留言,該系列以往的經(jīng)典內(nèi)容可參考下面的篇章。
1. kaggle競賽寶典-競賽框架篇!
2.2 kaggle競賽寶典-回歸相關(guān)指標(biāo)優(yōu)化!
2.3 kaggle競賽寶典-二分類相關(guān)指標(biāo)優(yōu)化!
2.4 kaggle競賽寶典-多分類相關(guān)指標(biāo)優(yōu)化!
3.1 數(shù)據(jù)探索分析-全局?jǐn)?shù)據(jù)探索分析!
3.2 數(shù)據(jù)探索分析-單變量數(shù)據(jù)分析!
4.1 kaggle競賽寶典-樣本篩選篇!
4.2 kaggle競賽寶典-樣本組織篇!
7.3 特征工程-有序類別變量&單數(shù)值變量特征工程!

針對(duì)梯度提升樹模型對(duì)文本特征進(jìn)行特征工程,我們需要充分挖掘Label編碼丟失的信息,例如上面的名字特征,內(nèi)部存在非常強(qiáng)的規(guī)律,Mr等信息,這些信息反映了性別相關(guān)的信息,如果直接進(jìn)行Label編碼就會(huì)丟失此類信息,所以我們可以通過文本技巧對(duì)其進(jìn)行挖掘。在本文中,我們對(duì)現(xiàn)在常用的文本特征進(jìn)行匯總。在上篇中介紹過的此處不在贅述。



1.詞匯屬性特征
每個(gè)詞都有其所屬的屬性,例如是名詞,動(dòng)詞,還是形容詞等等。詞匯屬性特征很多時(shí)候能幫助模型帶來效果上的微弱提升,可以作為一類補(bǔ)充信息。



2.文本向量特征
TDIDF特征可以緩解詞頻特征的高頻詞匯特征帶來的問題,同時(shí)通過N-Gram的策略還可以間接捕捉文本中的詞的關(guān)系,但是這些信息的捕捉還是較差的,而且N-Gram的策略還會(huì)使得字典過大,帶來存儲(chǔ)的問題。但是詞向量特征卻可以很好地緩解這兩個(gè)問題。
詞嵌入模型通過建立所選詞與相鄰前后詞之間的概率分布,將詞映射到某個(gè)維度的向量。這樣我們就僅僅只需要記錄每個(gè)詞對(duì)應(yīng)的向量,而且在實(shí)踐中我們發(fā)現(xiàn)基于詞向量的特征往往能取得更好的效果,這也從側(cè)面說明了詞向量的形式可以更好地捕捉詞與詞之間的關(guān)系。

目前可以通過使用Gensim來抽取詞向量。因?yàn)槲覀兂槿〉氖腔谠~的向量,而不同文本的詞的個(gè)數(shù)是不一樣的,所以最后還需要通過某種轉(zhuǎn)化將我們的的文本特征轉(zhuǎn)化為相同維度的特征。最為常見的就是下面兩種策略:
1. 計(jì)算統(tǒng)計(jì)特征,例如均值、中位數(shù)、方差等等;
2. 先將文本長度進(jìn)行截?cái)?,缺失的補(bǔ)0,然后進(jìn)行PCA,TSNE等轉(zhuǎn)化;
目前可以產(chǎn)出詞向量的策略非常多,例如Word2Vec,Glove等等,還有許多最新預(yù)訓(xùn)練好的包都可以直接拿過來使用。
import gensim.downloader as gensim_api
glove_model = gensim_api.load("glove-wiki-gigaword-300")
word = "love"
glove_model[word]

3.HashVector
不管是CounterVector,TfidfVectorizer還是Word2Vector等詞向量的方式抽取的特征我們都需要存儲(chǔ)一個(gè)映射表,這會(huì)帶來非常大的內(nèi)存壓力,但我們?nèi)匀恍枰獙⑽臋n編碼為向量,這個(gè)時(shí)候我們就需要用到HashVector,HashingVectorizer不存儲(chǔ)結(jié)果詞匯表,該方法使用單向哈希方法將單詞轉(zhuǎn)化成整數(shù),因而我們不需要詞匯表,可以選擇任意長的固定長度向量,這對(duì)于大型數(shù)據(jù)集非常有效。缺點(diǎn)是哈希量化是單向的,因此無法將編碼轉(zhuǎn)換回單詞,在很多有監(jiān)督學(xué)習(xí)中是不影響的。
因?yàn)槲覀兪褂玫氖荋ashVector就自然會(huì)存在散列沖突的問題(如果矩陣大小太小,則必然會(huì)發(fā)生這種情況),在計(jì)算資源達(dá)到最大值的情況下,HashVector是非常好的特征。
from sklearn.feature_extraction.text import HashingVectorizer
text = ["The quick brown fox jumped over the lazy dog."]
vectorizer = HashingVectorizer(n_features=20)
vector = vectorizer.transform(text)
print(vector.shape)
print(vector.toarray())
(1, 20)
[[ 0. 0. 0. 0. 0. 0.33333333
0. -0.33333333 0.33333333 0. 0. 0.33333333
0. 0. 0. -0.33333333 0. 0.
-0.66666667 0. ]]

4.文本語言信息
在很多問題中,并不是所有的文本都是同一種語言,這個(gè)時(shí)候我們需要對(duì)不同的文本進(jìn)行分類,判斷其是哪一種類型的語言。

import pandas as pd
import langdetect
df = pd.DataFrame()
df['text'] = ['I love it.', '我喜歡你。', 'I think you are great!', 'OK!', '太棒了。', 'No pro.']
df['lang'] = df["text"].apply(lambda x: langdetect.detect(x) if
x.strip() != "" else "")
df
| text | lang | |
|---|---|---|
| 0 | I love it. | sl |
| 1 | 我喜歡你。 | zh-cn |
| 2 | I think you are great! | en |
| 3 | OK! | en |
| 4 | 太棒了。 | zh-cn |
| 5 | No pro. | pt |


5.語意特征
情感分析是通過數(shù)字或類來表達(dá)文本數(shù)據(jù)的主觀情感,在非常多的問題中都至關(guān)重要。目前情感分析是自然語言處理中最困難的任務(wù)之一,需要處理自然語言的歧義等問題,但是如果我們能很好地挖掘出文本的情感,那么對(duì)于我們模型的幫助是非常巨大的。
但是一個(gè)好的語言模型的訓(xùn)練是非常耗費(fèi)時(shí)間的,如果沒有足夠的時(shí)間或數(shù)據(jù)時(shí),我們可以使用預(yù)先訓(xùn)練好的模型,比如Textblob和Vader。Textblob建立在NLTK之上,是最流行的語言之一,它可以給單詞分配極性,并將整個(gè)文本的情感作為一個(gè)平均值進(jìn)行估計(jì)。Vader是一個(gè)基于規(guī)則的模型,目前在社交媒體的數(shù)據(jù)上使用較多。
import pandas as pd
from textblob import TextBlob
df = pd.DataFrame()
df['text'] = ['I love it.', 'I hate you.', 'I think you are great!', 'She is beautiful.', 'Good!', 'No problem.']
df["sentiment"] = df['text'].apply(lambda x: TextBlob(x).sentiment.polarity)
df.head()
| text | sentiment | |
|---|---|---|
| 0 | I love it. | 0.500 |
| 1 | I hate you. | -0.800 |
| 2 | I think you are great! | 1.000 |
| 3 | She is beautiful. | 0.850 |
| 4 | Good! | 0.875 |
從上面的特征中,我們發(fā)現(xiàn)情感的特征還是相對(duì)靠譜的。


6.特殊詞匯特征
標(biāo)點(diǎn)符號(hào)能從側(cè)面反映文本的情感強(qiáng)烈程度等信息,在情感分類,文本分類中有很重要的作用,當(dāng)然與此同時(shí),特殊詞匯的特征特征則更為重要。特殊詞匯依據(jù)問題的不同,會(huì)有非常大的不同,我們舉幾個(gè)簡單的例子:
文本情感分類問題

我們可以選擇直接分類別(每一類情感表示一類)統(tǒng)計(jì)每個(gè)類別中詞匯的出現(xiàn)次數(shù)。
代碼病毒檢測問題

代碼的關(guān)鍵詞信息都尤為重要,例如截圖,聯(lián)網(wǎng),發(fā)送等特殊詞匯會(huì)為我們判斷該代碼文件是否含有病毒提供重要的依據(jù)。


7.NER特征
命名實(shí)體識(shí)別(Named entity recognition,NER)是用預(yù)定義的類別(如人名、地點(diǎn)、組織等)標(biāo)記非結(jié)構(gòu)化文本中提到的命名實(shí)體的過程。這些重要的命名實(shí)體在非常多的問題中都很有用。例如判斷某用戶點(diǎn)擊某廣告的概率等,可以通過NER識(shí)別出廣告中的代言人,依據(jù)代言人與用戶的喜好來判定用戶點(diǎn)擊某條廣告的概率。目前使用較多的NER工具包是SpaCy,關(guān)于NER目前能處理多少不同的命名實(shí)體,有興趣的朋友可以看一下Spacy工具包

除了可與直接抽取我們想要的NER特征,SpaCy還可以對(duì)其進(jìn)行標(biāo)亮,如下所示。
import spacy
import pandas as pd
# !pip install zh_core_web_sm-3.0.0-py3-none-any.whl
ner = spacy.load("zh_core_web_sm")
df = pd.DataFrame()
df['txt'] = ['','我喜歡四川。','成都的女孩喜歡吃辣。']
df["tags"] = df["txt"].apply(lambda x: [(tag.text, tag.label_) for tag in ner(x).ents] )
df
| txt | tags | |
|---|---|---|
| 0 | 在無錫車站,我遇見了來自南京的你。 | [(無錫車站, FAC), (南京, GPE)] |
| 1 | 我喜歡四川。 | [(四川, GPE)] |
| 2 | 成都的女孩喜歡吃辣。 | [(成都, GPE)] |
txt = '在無錫車站,我遇見了來自南京的你。但沒想到你那么喜歡吃四川的火鍋。'
doc = ner(txt)
## display result
spacy.displacy.render(doc, style="ent")
在無錫車站 FAC,我遇見了來自南京 GPE的你。但沒想到你那么喜歡吃四川 GPE的火鍋。


8.K近鄰特征
除了LDA主題模型,我們基于向量做的最多的衍生特征就是相似度特征。我們找到距離每個(gè)文本最近的N個(gè)文本,并將最近的N個(gè)文本對(duì)應(yīng)的ID以及其與當(dāng)前文本的距離作為我們新的特征。

距離的計(jì)算方式可以是歐幾里得,cosine等等,依據(jù)距離的不同,文本相似度特征可以有非常多。
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(tfidf_matrix)
similarity_matrix
array([[1. , 0.36651513, 0.52305744, 0.13448867],
[0.36651513, 1. , 0.72875508, 0.54139736],
[0.52305744, 0.72875508, 1. , 0.43661098],
[0.13448867, 0.54139736, 0.43661098, 1. ]])

9.聚類特征
和K近鄰特征經(jīng)常一起使用的就是聚類特征。同樣地,因?yàn)榫垲愄卣鞯姆绞绞欠浅6嗟模畛R姷木褪荎means等等,此處我們列舉常見的兩種聚類特征。

Kmeans聚類
from sklearn.cluster import KMeans
km = KMeans(n_clusters=2)
km.fit_predict(tfidf_matrix)
array([0, 1, 1, 1], dtype=int32)
hierarchy聚類
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(tfidf_matrix, 'ward')
pd.DataFrame(Z, columns=['Document\Cluster 1', 'Document\Cluster 2',
'Distance', 'Cluster Size'], dtype='object')
| Document\Cluster 1 | Document\Cluster 2 | Distance | Cluster Size | |
|---|---|---|---|---|
| 0 | 1 | 2 | 0.736539 | 2 |
| 1 | 3 | 4 | 1.08712 | 3 |
| 2 | 0 | 5 | 1.24292 | 4 |
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 3))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Data point')
plt.ylabel('Distance')
dendrogram(Z)
plt.axhline(y=1.0, c='k', ls='--', lw=0.5)
<matplotlib.lines.Line2D at 0x7ff7d99f0580>from scipy.cluster.hierarchy import fcluster
max_dist = 1.0
cluster_labels = fcluster(Z, max_dist, criterion='distance')
cluster_labels = pd.DataFrame(cluster_labels, columns=['ClusterLabel'])
cluster_labels
| ClusterLabel | |
|---|---|
| 0 | 3 |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |


10.小結(jié)
目前文本相關(guān)的問題都是以DeepLearning為主的方案,但上述的許多特征都是非常重要的,可以作為神經(jīng)網(wǎng)絡(luò)的Dense側(cè)特征加入模型訓(xùn)練或者直接抽取放入梯度提升樹模型進(jìn)行訓(xùn)練,往往都可以帶來不錯(cuò)的提升,因?yàn)楸鞠盗形覀冎攸c(diǎn)是梯度提升樹模型的建模,關(guān)于DeepLearning的很多訓(xùn)練等策略有興趣的可以閱讀相關(guān)的文章自行研究。

https://blog.socratesk.com/blog/2018/06/17/featuren-engineering-and-extraction https://datascience.stackexchange.com/questions/10509/how-to-deal-with-categorical-feature-of-very-high-cardinality KaggleDays SF: 2. Amazon - Unsupervised encoding Mean (likelihood) encodings: a comprehensive study http://blog.kaggle.com/2015/06/22/profiling-top-kagglers-owen-zhang-currently-1-in-the-world/ Feature Engineering Techniques How the Magic Works Why One-Hot Encode Data in Machine Learning? Label Encoding in Python Explained Why does frequency encoding work? Encoding categorical variables using likelihood estimation Mean (likelihood) encoding for categorical variables with high cardinality and feature interactions: a comprehensive study with Python Category Encoders Leave One Out Encoding for Categorical Feature Variables on Spark https://github.com/pourya-ir/Medium/tree/master/K-fold-target-enc How to deal with Features having high cardinality https://github.com/scikit-learn-contrib/category_encoders Handling Categorical Data in Python Here’s All you Need to Know About Encoding Categorical Data (with Python code) Encodings for Ordered Data Feature Engineering, Feature Extraction, and Feature Selection Detailed Text Based Feature Engineering Extensive Text Data Feature Engineering 了解一下Sklearn中的文本特征提取 Traditional Methods for Text Data Feature Extraction from Text (USING PYTHON) https://spacy.io/usage/linguistic-features https://github.com/RaRe-Technologies/gensim-data Text Analysis & Feature Engineering with NLP Foundations of AI & ML Feature Engineering Methods for Text Data HashingVectorizer vs. CountVectorizer 使用Scikit-Learn提取文本特征
往期精彩回顧
本站qq群851320808,加入微信群請(qǐng)掃碼:
