<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          特征工程實(shí)戰(zhàn)-20大文本特征(下)

          共 8462字,需瀏覽 17分鐘

           ·

          2021-04-29 14:15


          特征工程--文本特征下半篇!

          文本特征-下篇

          針對(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. 先將文本長(zhǎng)度進(jìn)行截?cái)啵笔У难a(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ù),因而我們不需要詞匯表,可以選擇任意長(zhǎng)的固定長(zhǎng)度向量,這對(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

          textlang
          0I love it.sl
          1我喜歡你。zh-cn
          2I think you are great!en
          3OK!en
          4太棒了。zh-cn
          5No 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()

          textsentiment
          0I love it.0.500
          1I hate you.-0.800
          2I think you are great!1.000
          3She is beautiful.0.850
          4Good!0.875
          • 從上面的特征中,我們發(fā)現(xiàn)情感的特征還是相對(duì)靠譜的。

          6.特殊詞匯特征

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

          • 文本情感分類問題

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

          • 代碼病毒檢測(cè)問題

          代碼的關(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 

          txttags
          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嗟?,最常見的就是Kmeans等等,此處我們列舉常見的兩種聚類特征。

          • 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 1Document\Cluster 2DistanceCluster Size
          0120.7365392
          1341.087123
          2051.242924
          import matplotlib.pyplot as plt
          plt.figure(figsize=(83))
          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
          03
          11
          21
          32

          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)的文章自行研究。

          參考文獻(xiàn)
          1. https://blog.socratesk.com/blog/2018/06/17/featuren-engineering-and-extraction
          2. https://datascience.stackexchange.com/questions/10509/how-to-deal-with-categorical-feature-of-very-high-cardinality
          3. KaggleDays SF: 2. Amazon - Unsupervised encoding
          4. Mean (likelihood) encodings: a comprehensive study
          5. http://blog.kaggle.com/2015/06/22/profiling-top-kagglers-owen-zhang-currently-1-in-the-world/
          6. Feature Engineering Techniques
          7. How the Magic Works
          8. Why One-Hot Encode Data in Machine Learning?
          9. Label Encoding in Python Explained
          10. Why does frequency encoding work?
          11. Encoding categorical variables using likelihood estimation
          12. Mean (likelihood) encoding for categorical variables with high cardinality and feature interactions: a comprehensive study with Python
          13. Category Encoders
          14. Leave One Out Encoding for Categorical Feature Variables on Spark
          15. https://github.com/pourya-ir/Medium/tree/master/K-fold-target-enc
          16. How to deal with Features having high cardinality
          17. https://github.com/scikit-learn-contrib/category_encoders
          18. Handling Categorical Data in Python
          19. Here’s All you Need to Know About Encoding Categorical Data (with Python code)
          20. Encodings for Ordered Data
          21. Feature Engineering, Feature Extraction, and Feature Selection
          22. Detailed Text Based Feature Engineering
          23. Extensive Text Data Feature Engineering
          24. 了解一下Sklearn中的文本特征提取
          25. Traditional Methods for Text Data
          26. Feature Extraction from Text (USING PYTHON)
          27. https://spacy.io/usage/linguistic-features
          28. https://github.com/RaRe-Technologies/gensim-data
          29. Text Analysis & Feature Engineering with NLP
          30. Foundations of AI & ML
          31. Feature Engineering Methods for Text Data
          32. HashingVectorizer vs. CountVectorizer
          33. 使用Scikit-Learn提取文本特征

          推薦閱讀:

          理解關(guān)聯(lián)規(guī)則算法

          Python中的高效迭代庫itertools,排列組合隨便求

          萬字長(zhǎng)文詳解|Python庫collections,讓你擊敗99%的Pythoner

          Python初學(xué)者必須吃透這69個(gè)內(nèi)置函數(shù)!

          Python字典詳解-超級(jí)完整版

          全面理解Python集合,17個(gè)方法全解,看完就夠了

          Python正則表達(dá)式入門到入魔


          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久色成人电影 | 约操美女| 靠逼在线观看 | 亚洲狼人久久久精品 | 啪啪免费的网站 |