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

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

1

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

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

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

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

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

研究動(dòng)機(jī)

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

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

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

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

特征工程的策略

下面是一些流行且有效的處理文本數(shù)據(jù)的策略,這些方法也能應(yīng)用在下游的機(jī)器學(xué)習(xí)系統(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ù)集的分析。語料庫通常是屬于一個(gè)或多個(gè)主題的文檔的集合。

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    

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

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

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

文本預(yù)處理

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

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

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

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

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

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

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

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

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

由于本文的重點(diǎn)是特征工程,我們將構(gòu)建一個(gè)簡單的文本預(yù)處理程序,其重點(diǎn)是刪除特殊字符、多余的空格、數(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ù)處理之后的樣子。現(xiàn)在我們來開始特征工程吧!

詞袋模型(Bag of Word)

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

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    

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

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

# get all unique words in the corpus    

vocab = cv.get_feature_names()    

# show document feature vectors    

pd.DataFrame(cv_matrix, columns=vocab)    

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

詞袋模型的文檔特征向量

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

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

一個(gè)單詞只是一個(gè)標(biāo)記,通常被稱為單元(unigram)或者一元(1-gram)。我們已經(jīng)知道,詞袋模型不考慮單詞的順序。但是如果我們也想要考慮序列中出現(xiàn)的短語或者詞匯集合呢?N 元模型能夠幫我們實(shí)現(xiàn)這一點(diǎn)。N-Gram 是來自文本文檔的單詞記號(hào)的集合,這些記號(hào)是連續(xù)的,并以序列的形式出現(xiàn)。二元表示階數(shù)為二的 N-Gram,也就是兩個(gè)單詞。同理三元表示三個(gè)單詞。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)    

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

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

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

TF-IDF 模型

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

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

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

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

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)    

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

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

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

文檔相似性

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

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

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

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

from sklearn.metrics.pairwise import cosine_similarity    


similarity_matrix = cosine_similarity(tv_matrix)    

similarity_df = pd.DataFrame(similarity_matrix)    

similarity_df    

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

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

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

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

具有相似特征的文檔聚類

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

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

連接準(zhǔn)則決定了合并策略。常用的連接準(zhǔn)則有 Ward, Complete linkage, Average linkage 等等。這些標(biāo)準(zhǔn)在將一對(duì) cluster 合并在一起(文檔中低層次的類聚類成高層次的)時(shí)是非常有用的,這是通過最優(yōu)化目標(biāo)函數(shù)實(shí)現(xiàn)的。我們選擇 Ward 最小方差作為連接準(zhǔn)則,以最小化總的內(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')    

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

我們語料庫的連接矩陣

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

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

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)    

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

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

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)    

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

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

主題模型

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

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

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

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

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

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

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

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

  3. 按照如下方法迭代

  4. 對(duì)于每個(gè)文檔 D:

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

                   i.對(duì)于主題 T:

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

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

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

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

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

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

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

 使用 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    

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

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

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()   

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

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

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

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

這次我們使用非常流行的基于分區(qū)的聚類方法——K-means 聚類,根據(jù)文檔主題模型特征表示,進(jìn)行聚類或分組。在 K-means 聚類法中,有一個(gè)輸入?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)    

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

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

未來會(huì)涉及到的高級(jí)策略

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

總結(jié)

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

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

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

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

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

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

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

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