丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給高云河
發(fā)送

1

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

本文作者: 高云河 編輯:汪思穎 2018-02-07 14:39
導(dǎo)語:一些馴服非結(jié)構(gòu)化文本信息的傳統(tǒng)策略

雷鋒網(wǎng) AI 研習社按:本文是英特爾數(shù)據(jù)科學家 Dipanjan Sarkar 在 Medium 上發(fā)布的「特征工程」博客續(xù)篇。在本系列的前兩部分中,作者介紹了連續(xù)數(shù)據(jù)的處理方法離散數(shù)據(jù)的處理方法。本文則開始了一個新的主題,非結(jié)構(gòu)化文本數(shù)據(jù)的傳統(tǒng)處理方法。雷鋒網(wǎng) AI 研習社對原文進行了編譯。

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

文本數(shù)據(jù)通常是由表示單詞、句子,或者段落的文本流組成。由于文本數(shù)據(jù)非結(jié)構(gòu)化(并不是整齊的格式化的數(shù)據(jù)表格)的特征和充滿噪聲的本質(zhì),很難直接將機器學習方法應(yīng)用在原始文本數(shù)據(jù)中。在本文中,我們將通過實踐的方法,探索從文本數(shù)據(jù)提取出有意義的特征的一些普遍且有效的策略,提取出的特征極易用來構(gòu)建機器學習或深度學習模型。

研究動機

想要構(gòu)建性能優(yōu)良的機器學習模型,特征工程必不可少。有時候,可能只需要一個優(yōu)秀的特征,你就能贏得 Kaggle 挑戰(zhàn)賽的勝利!對于非結(jié)構(gòu)化的文本數(shù)據(jù)來說,特征工程更加重要,因為我們需要將文本流轉(zhuǎn)化為機器學習算法能理解的數(shù)字表示。即使現(xiàn)在有高級的自動化特征工程,在把它們當作「黑盒子」應(yīng)用之前,我們?nèi)杂斜匾チ私獠煌卣鞴こ滩呗员澈蟮暮诵乃枷搿S肋h記住,「如果有人給了你一套修房子的工具,你應(yīng)該知道什么時候該用電鉆,什么時候該用錘子!」

理解文本數(shù)據(jù)

我們雖然能夠獲得具有結(jié)構(gòu)數(shù)據(jù)屬性的文本數(shù)據(jù),但它們?yōu)榻Y(jié)構(gòu)化數(shù)據(jù),并不在今天的討論范圍之內(nèi)。

在本文中,我們討論以單詞、短語、句子和整個文檔的形式展現(xiàn)的文本流。從本質(zhì)上講,文本確實有一些句法結(jié)構(gòu),比如單詞組成了短語,短語組成了句子,句子又組合成了段落。然而,與結(jié)構(gòu)化數(shù)據(jù)集中固定的數(shù)據(jù)維度相比,文本文檔沒有固定的結(jié)構(gòu),因為單詞有眾多的選擇,每個句子的長度也是可變的。本文就是一個很典型的案例。

特征工程的策略

下面是一些流行且有效的處理文本數(shù)據(jù)的策略,這些方法也能應(yīng)用在下游的機器學習系統(tǒng)中,用于提取有用的特征。大家可以在 GitHub 中查看本文使用的所有代碼。

首先加載一些基本的依賴關(guān)系和設(shè)置:

import pandas as pd
import numpy as np
import re
import nltk
import matplotlib.pyplot as pltpd.options.display.max_colwidth = 200
%matplotlib inline

下面是文檔中的語料庫,本文大部分內(nèi)容都是基于該數(shù)據(jù)集的分析。語料庫通常是屬于一個或多個主題的文檔的集合。

corpus = ['The sky is blue and beautiful.',    

                'Love this blue and beautiful sky!',    

                'The quick brown fox jumps over the lazy dog.',    

                "A king's breakfast has sausages, ham, bacon, eggs, toast and beans",    

                'I love green eggs, ham, sausages and bacon!',    

                'The brown fox is quick and the blue dog is lazy!',    

                'The sky is very blue and the sky is very beautiful today',    

                'The dog is lazy but the brown fox is quick!'        

]    

labels = ['weather', 'weather', 'animals', 'food', 'food', 'animals', 'weather', 'animals']    



corpus = np.array(corpus)    

corpus_df = pd.DataFrame({'Document': corpus,    

                                                'Category': labels})    

corpus_df = corpus_df[['Document', 'Category']]    

corpus_df    

                       如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!                            

本文中應(yīng)用的語料庫案例         

可以看到,我們已經(jīng)從語料庫中提取出幾個不同類別的文檔。在討論特征工程之前,一如往常,首先得做數(shù)據(jù)預(yù)處理,刪除一些不必要的字符、符號和標記。

文本預(yù)處理

有很多種對文本數(shù)據(jù)進行清洗和預(yù)處理的方法。下面我將重點介紹在自然語言處理(NLP)流程中大量使用的方法。

  • 刪除標簽:文本中通常會包含一些不必要的內(nèi)容,比如 HTML 標簽,這在分析文本時并沒有太多價值。BeautifulSoup 庫提供了清理標簽的函數(shù)。

  • 清理重音字符:在許多文本語料庫中,特別是在處理英文時,通常會遇到重音字符/字母。因此我們要確保將這些字符轉(zhuǎn)換為標準的 ASCII 字符。一個簡單的例子就是將 é 轉(zhuǎn)換成 e。

  • 拓展縮寫:在英文中,縮寫基本上是單詞或者音節(jié)的縮減版。縮減版通常是刪除某些單詞或者短語中特定的字母和聲音而來。舉例來說,do not 和 don't , I would 和 I'd。將縮寫單詞轉(zhuǎn)換為完整的原始形式有助于文本的標準化。

  • 刪除特殊字符:特殊字符和非字母數(shù)字的符號通常會增加額外噪聲。通常,可以通過簡單的正則表達式來實現(xiàn)這一點。

  • 詞干提取和詞性還原:可以利用詞干創(chuàng)造新的詞匯,例如通過附加前綴和后綴等詞綴來創(chuàng)造新的單詞。這被稱為詞性變化。詞干提取是將這個過程反過來。一個簡單的例子是單詞:WATCHES, WATCHING, 和 WATCHED,這些單詞都把 WATCH 作為詞根。詞性還原與詞干提取很相似,通過移除詞綴以得到單詞的基本形式。然而在詞性還原里,單詞的基本形式是詞根(root word),而不是詞干(root stem)。其不同之處在于詞根(root word)總是字典上正確的詞(即出現(xiàn)在詞典中),但詞干并不是這樣。

  • 去除無用詞:在從文本中構(gòu)建有意義的特征時,沒有意義的詞被稱為無用詞。如果你在一個語料庫中做一個簡單的詞頻分析,這些無用詞通常會以最大的頻率出現(xiàn)。像 a , an 這樣的詞被認為是無用詞。但是實際上并沒有明確通用的無用詞表,我們通常使用 nltk 的標準英語無用詞表。大家也可以根據(jù)特定的需要添加無用詞。

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

除此之外,還可以使用其他的標準操作,比如標記化、刪除多余的空格、文本大寫轉(zhuǎn)換為小寫,以及其他更高級的操作,例如拼寫更正、語法錯誤更正、刪除重復(fù)字符等。

由于本文的重點是特征工程,我們將構(gòu)建一個簡單的文本預(yù)處理程序,其重點是刪除特殊字符、多余的空格、數(shù)字、無用詞以及語料庫的大寫轉(zhuǎn)小寫。

wpt = nltk.WordPunctTokenizer()    

stop_words = nltk.corpus.stopwords.words('english') 


def normalize_document(doc):    

    # lower case and remove special characters\whitespaces    

    doc = re.sub(r'[^a-zA-Z\s]', '', doc, re.I|re.A)    

    doc = doc.lower()    

    doc = doc.strip()    

    # tokenize document    

    tokens = wpt.tokenize(doc)    

    # filter stopwords out of document    

    filtered_tokens = [token for token in tokens if token not in stop_words]    

    # re-create document from filtered tokens    

    doc = ' '.join(filtered_tokens)    

    return doc    


normalize_corpus = np.vectorize(normalize_document)    

一旦搭建好基礎(chǔ)的預(yù)處理流程,我們就可以將它應(yīng)用在語料庫中了。

norm_corpus = normalize_corpus(corpus)
norm_corpus


Output
------
array(['sky blue beautiful', 'love blue beautiful sky',
      'quick brown fox jumps lazy dog',
      'kings breakfast sausages ham bacon eggs toast beans',
      'love green eggs ham sausages bacon',
      'brown fox quick blue dog lazy',
      'sky blue sky beautiful today',
      'dog lazy brown fox quick'],
     dtype='<U51')

上面的輸出結(jié)果應(yīng)該能讓大家清楚的了解樣本文檔在預(yù)處理之后的樣子?,F(xiàn)在我們來開始特征工程吧!

詞袋模型(Bag of Word)

這也許是非結(jié)構(gòu)化文本中最簡單的向量空間表示模型。向量空間是表示非結(jié)構(gòu)化文本(或其他任何數(shù)據(jù))的一種簡單數(shù)學模型,向量的每個維度都是特定的特征/屬性。詞袋模型將每個文本文檔表示為數(shù)值向量,其中維度是來自語料庫的一個特定的詞,而該維度的值可以用來表示這個詞在文檔中的出現(xiàn)頻率、是否出現(xiàn)(由 0 和 1 表示),或者加權(quán)值。將這個模型叫做詞袋模型,是因為每個文檔可以看作是裝著單詞的袋子,而無須考慮單詞的順序和語法。

from sklearn.feature_extraction.text import CountVectorizer    


cv = CountVectorizer(min_df=0., max_df=1.)    

cv_matrix = cv.fit_transform(norm_corpus)    

cv_matrix = cv_matrix.toarray()    

cv_matrix    

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

可以看到,文檔已經(jīng)被轉(zhuǎn)換為數(shù)字向量,這樣每個文檔都由上述特征矩陣中的一個向量(行)表示。下面的代碼有助于以一種更易理解的格式來表示這一點。

# get all unique words in the corpus    

vocab = cv.get_feature_names()    

# show document feature vectors    

pd.DataFrame(cv_matrix, columns=vocab)    

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

詞袋模型的文檔特征向量

上面的表格應(yīng)該更能助于理解!可以清楚地看到,特征向量中每個列(維度)都代表一個來自語料庫的單詞,每一行代表一個文檔。單元格中的值表示單詞(由列表示)出現(xiàn)在特定文檔(由行表示)中的次數(shù)。因此,如果一個文檔語料庫是由 N 個單詞組成,那么這個文檔可以由一個 N 維向量表示。

N 元詞袋模型(Bag of N-Gram Model)

一個單詞只是一個標記,通常被稱為單元(unigram)或者一元(1-gram)。我們已經(jīng)知道,詞袋模型不考慮單詞的順序。但是如果我們也想要考慮序列中出現(xiàn)的短語或者詞匯集合呢?N 元模型能夠幫我們實現(xiàn)這一點。N-Gram 是來自文本文檔的單詞記號的集合,這些記號是連續(xù)的,并以序列的形式出現(xiàn)。二元表示階數(shù)為二的 N-Gram,也就是兩個單詞。同理三元表示三個單詞。N 元詞袋模型是普通詞袋模型的一種拓展,使得我們可以利用基于 N 元的特征。下面的示例展示了文檔中二元的特征向量。

# you can set the n-gram range to 1,2 to get unigrams as well as bigrams    

bv = CountVectorizer(ngram_range=(2,2))    

bv_matrix = bv.fit_transform(norm_corpus)   

 

bv_matrix = bv_matrix.toarray()    

vocab = bv.get_feature_names()    

pd.DataFrame(bv_matrix, columns=vocab)    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

使用二元詞袋模型的特征向量

在上面的例子中,每個二元特征由兩個單詞組成,其中的值表示這個二元詞組在文檔中出現(xiàn)的次數(shù)。

TF-IDF 模型

在大型語料庫中使用詞袋模型可能會出現(xiàn)一些潛在的問題。由于特征向量是基于詞的頻率,某些單詞可能會在文檔中頻繁出現(xiàn),這可能會在特征集上掩蓋掉其他單詞。TF-IDF 模型試圖通過縮放或者在計算中使用歸一化因子來解決這個問題。TF-IDF 即 Term Frequency-Inverse Document Frequency,在計算中結(jié)合了兩種度量:詞頻(Term Frequency)逆文檔頻率(Inverse Document Frequency)。這種技術(shù)是為搜索引擎中查詢排序而開發(fā)的,現(xiàn)在它是信息檢索和 NLP 領(lǐng)域中不可或缺的模型。

在數(shù)學上,TF-IDF 可以定義為:tfidf = tf x idf,也可以進一步拓展為下面的表示:

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

在這里,tfidf(w, D)表示單詞 在文檔 中的 TF-IDF 分數(shù)。Tf(w,D)項表示單詞 在文檔 中的詞頻,這個值可以從詞袋模型中獲得。idf(w,D)項是單詞 的逆文檔頻率,可以由語料庫中所有文檔的總數(shù)量 除以單詞 的文檔頻率 df(w)的 log 值得到,其中文檔頻率是指語料庫中文檔出現(xiàn)單詞 的頻率。這種模型有多種變種,但是給出的最終結(jié)果都很相似。下面在語料庫中使用這個模型吧!

from sklearn.feature_extraction.text import TfidfVectorizer    


tv = TfidfVectorizer(min_df=0., max_df=1., use_idf=True)    

tv_matrix = tv.fit_transform(norm_corpus)    

tv_matrix = tv_matrix.toarray()    


vocab = tv.get_feature_names()    

pd.DataFrame(np.round(tv_matrix, 2), columns=vocab)    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

基于TF-IDF模型的文檔特征向量

基于 TF-IDF 的特征向量與原始的詞袋模型相比,展示出了縮放和歸一化的特性。想要進一步深入了解該模型的讀者可以參考 Text Analytics with Python 的 181 頁。

文檔相似性

文檔相似性是使用從詞袋模型或者 tf-idf 模型中提取出的特征,基于距離或者相似度度量判斷兩個文檔相似程度的過程。

因此,可以使用在上一部分中提到的 tf-idf 模型提取出的特征,用其來生成新的特征。這些特征在搜索引擎、文檔聚類以及信息檢索等領(lǐng)域發(fā)揮著重要作用。

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

語料庫中的配對文檔相似性需要計算語料庫中每兩個文檔對的文檔相似性。因此,如果一個語料庫中有 C 個文檔,那么最終會得到一個 C*C 的矩陣,矩陣中每個值代表了該行和該列的文檔對的相似度分數(shù)??梢杂脦追N相似度和距離度量計算文檔相似度。其中包括余弦距離/相似度、歐式距離、曼哈頓距離、BM25相似度、jaccard 距離等。在我們的分析中,我們將使用最流行和最廣泛使用的相似度度量:余弦相似度,并根據(jù) TF-IDF 特征向量比較文檔對的相似度。

from sklearn.metrics.pairwise import cosine_similarity    


similarity_matrix = cosine_similarity(tv_matrix)    

similarity_df = pd.DataFrame(similarity_matrix)    

similarity_df    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

文檔對的相似性矩陣(余弦相似度)

余弦相似度給出了表示兩個文檔特征向量之間角度的余弦值的度量。兩個文檔特征向量之間的角度越低,兩個文檔的相似度就越高,如下圖所示:如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

仔細觀察相似度矩陣可以清楚地看出,文檔(0,1 和 6),(2,5 和 7)之間非常相似,文檔 3 和 4 略微相似。這表明了這些相似的文檔一定具有一些相似特征。這是分組或聚類的一個很好的案例,可以通過無監(jiān)督的學習方法來解決,特別是當需要處理數(shù)百萬文本文檔的龐大語料庫時。

具有相似特征的文檔聚類

聚類是利用無監(jiān)督學習的方法,將數(shù)據(jù)點(本場景中即文檔)分類到組或者 cluster 中。我們將在這里利用一個無監(jiān)督的層次聚類算法,通過利用我們之前生成的文檔相似性特征,將我們的玩具語料庫中的類似文檔聚合到一起。有兩種類型的層次聚類方法,分別是凝聚方法(agglomerative)和分裂方法(divisive)。這里將會使用凝聚聚類算法,這是一種自下而上(bottom up)的層次聚類算法,最開始每個文檔的單詞都在自己的類中,根據(jù)測量數(shù)據(jù)點之間的距離度量和連接準則(linkage criterion),將相似的類連續(xù)地合并在一起。下圖展示了一個簡單的描述。

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

連接準則決定了合并策略。常用的連接準則有 Ward, Complete linkage, Average linkage 等等。這些標準在將一對 cluster 合并在一起(文檔中低層次的類聚類成高層次的)時是非常有用的,這是通過最優(yōu)化目標函數(shù)實現(xiàn)的。我們選擇 Ward 最小方差作為連接準則,以最小化總的內(nèi)部聚類方差。由于已經(jīng)有了相似特征,我們可以直接在樣本文檔上構(gòu)建連接矩陣。

from scipy.cluster.hierarchy import dendrogram, linkage    


Z = linkage(similarity_matrix, 'ward')    

pd.DataFrame(Z, columns=['Document\Cluster 1', 'Document\Cluster 2',    

                                            'Distance', 'Cluster Size'], dtype='object')    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

我們語料庫的連接矩陣

如果仔細查看連接矩陣,可以看到連接矩陣的每個步驟(行)都告訴了我們哪些數(shù)據(jù)點(或者 cluster)被合并在一起。如果有 n 個數(shù)據(jù)點,那么連接矩陣 Z 將是(n-1)*4 的形狀,其中 Z[i] 表示在步驟 i 合并了哪些 cluster。每行有四個元素,前兩個元素是數(shù)據(jù)點或 cluster 的名稱,第三個元素是前兩個元素(數(shù)據(jù)點或 cluster)之間的距離,最后一個元素是合并完成后 cluster 中元素/數(shù)據(jù)點的總數(shù)。大家可以參考 scipy 文檔,其中有詳細解釋。

下面,把這個矩陣看作一個樹狀圖,以更好地理解元素!

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)    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

可以看到每個數(shù)據(jù)點是如何從一個單獨的簇開始,慢慢與其他數(shù)據(jù)點合并形成集群的。從顏色和樹狀圖的更高層次來看,如果考慮距離度量為 1.0(由虛線表示)或者更小,可以看出模型已經(jīng)正確識別了三個主要的聚類。利用這個距離,我們可以得到集群的標簽。

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'])    

pd.concat([corpus_df, cluster_labels], axis=1)    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

可以清楚地看到,我們的算法已經(jīng)根據(jù)分配給它們的標簽,正確識別了文檔中的三個不同類別。這應(yīng)該能夠給大家一個關(guān)于如何使用 TF-IDF 特征來建立相似度特征的思路。大家可以用這種處理流程來進行聚類。

主題模型

也可以使用一些摘要技術(shù)從文本文檔中提取主題或者基于概念的特征。主題模型圍繞提取關(guān)鍵主題或者概念。每個主題可以表示為文檔語料庫中的一個詞袋或者一組詞??傊?,這些術(shù)語表示特定的話題、主題或概念,憑借這些單詞所表達的語義含義,可以輕松將每個主題與其他主題區(qū)分開來。這些概念可以從簡單的事實、陳述到意見、前景。主題模型在總結(jié)大量文本來提取和描繪關(guān)鍵概念時非常有用。它們也可用于從文本數(shù)據(jù)中捕捉潛在的特征。

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

主題建模有很多種方法,其中大多涉及到某種形式的矩陣分解。比如隱含語義索引(Latent Semantic Indexing, LSI)就使用了奇異值分解。這里將使用另一種技術(shù):隱含狄利克雷分布(Latent Dirichlet Allocation, LDA),它使用了生成概率模型,其中每個文檔由幾個主題組合而成,每個術(shù)語或單詞可以分配給某個主題。這與基于 pLSI(probabilistic LSI)的模型很類似。在 LDA 的情況下,每個隱含主題都包含一個狄利克雷先驗。

這項技術(shù)背后的數(shù)學原理相當復(fù)雜,所以我會試著總結(jié)一下,而不是羅列很多讓人厭倦的細節(jié)。我建議讀者可以看看 Christine Doig 的一個優(yōu)秀的演講,深入了解一下。

 如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

上圖中的黑色框表示利用前面提到的參數(shù),從 M 個文檔中提取 K 個主題的核心算法。下面的步驟是對算法的解釋。

  1. 初始化必要的參數(shù)。

  2. 隨機初始化文檔,將每個單詞分配到 K 個主題中去。

  3. 按照如下方法迭代

  4. 對于每個文檔 D:

           a) 對于文檔中的單詞 W:

                   i.對于主題 T:

                           計算 P(T|D), 表示文檔 D 中單詞分配給 T 主題的比例。

                           計算 P(W|T),表示在所有文檔中,主題 T 包含單詞 W 的比例。

                   ii. 通過計算概率 P(T|D)*P(W|T) 重新分配單詞 W 的主題 T。

運行幾個迭代之后,就能獲得混合了每個文檔的主題,然后就可以根據(jù)指向某個主題的單詞生成文檔的主題。像 gensim 或者 scikit-learn 這樣的框架,使得我們能夠利用 LDA 模型來生成主題。

大家應(yīng)該記住,當 LDA 應(yīng)用于文檔-單詞矩陣(TF-IDF 或者詞袋特征矩陣)時,它會被分解為兩個主要部分:

  • 文檔-主題矩陣,也就是我們要找的特征矩陣

  • 主題-單詞矩陣,能夠幫助我們查看語料庫中潛在的主題

 使用 scikit-learn 可以得到如下的文檔-主題矩陣。

from sklearn.decomposition import LatentDirichletAllocation 


lda = LatentDirichletAllocation(n_topics=3, max_iter=10000, random_state=0)    

dt_matrix = lda.fit_transform(cv_matrix)    

features = pd.DataFrame(dt_matrix, columns=['T1', 'T2', 'T3'])    

features    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

可以清楚地看到哪些文檔對上述輸出中的三個主題貢獻最大,可以通過如下的方式查看主題及其組成部分。

tt_matrix = lda.components_    

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.6]    

        print(topic)    

        print()   

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

可以看到,由于組成術(shù)語不同,很容易區(qū)分這三個主題。第一個在討論天氣,第二個關(guān)于食物,最后一個關(guān)于動物。主題建模的主題數(shù)量選擇是一門完整的課題,既是一門藝術(shù),也是一門科學。獲得最優(yōu)主題數(shù)量的方法有很多,這些技術(shù)既復(fù)雜又繁瑣,這里就不展開討論了。

使用主題模型特征的文檔聚類

這里使用 LDA 法從詞袋模型特征構(gòu)建主題模型特征?,F(xiàn)在,我們可以利用獲得的文檔單詞矩陣,使用無監(jiān)督的聚類算法,對文檔進行聚類,這與我們之前使用的相似度特征進行聚類類似。

這次我們使用非常流行的基于分區(qū)的聚類方法——K-means 聚類,根據(jù)文檔主題模型特征表示,進行聚類或分組。在 K-means 聚類法中,有一個輸入?yún)?shù) K,它制定了使用文檔特征輸出的聚類數(shù)量。這種聚類方法是一種基于中心的聚類方法,試圖將這些文檔聚類為等方差的類。這種方法通過最小化類內(nèi)平方和來創(chuàng)建聚類。選擇出最優(yōu)的 K 的方法有很多,比如誤差平方和度量,輪廓系數(shù)(Silhouette Coefficients)和 Elbow method。

from sklearn.cluster import KMeans  

  

km = KMeans(n_clusters=3, random_state=0)    

km.fit_transform(features)    

cluster_labels = km.labels_    

cluster_labels = pd.DataFrame(cluster_labels, columns=['ClusterLabel'])    

pd.concat([corpus_df, cluster_labels], axis=1)    

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

從上面的輸出中可以看到,文檔的聚類分配完全正確。

未來會涉及到的高級策略

在這篇文章沒有涉及近期出現(xiàn)的一些關(guān)于文本數(shù)據(jù)特征工程的高級方法,包括利用深度學習模型來提取單詞特征的方法。我們將在本系列的下一部分中深入探討這些模型,并詳細介紹 Word2Vec 和 GloVe 等流行的單詞嵌入模型,敬請期待!

總結(jié)

這些例子應(yīng)該能有助于大家理解文本數(shù)據(jù)特征工程的一些通用策略。本文中介紹的是基于數(shù)學概念、信息檢索和自然語言處理的傳統(tǒng)策略,這些久經(jīng)考驗的方法在各種數(shù)據(jù)集和問題上都表現(xiàn)優(yōu)異。在下一篇文章中,我將詳細介紹如何利用深度學習模型進行文本數(shù)據(jù)特征工程。

對連續(xù)數(shù)據(jù)特征工程感興趣的讀者,請查看本系列第一部分!

對離散數(shù)據(jù)特征工程感興趣的讀者,請查看本系列第二部分!

本文中所使用的所有代碼和數(shù)據(jù)集都可以從 GitHub 中訪問。代碼也可以作為 Jupyter 筆記本使用。

Via towardsdatascience.com 雷鋒網(wǎng) AI 研習社編譯整理。

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

如何對非結(jié)構(gòu)化文本數(shù)據(jù)進行特征工程操作?這里有妙招!

分享:
相關(guān)文章
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說