0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一種文本挖掘方法稱為主題建模,什么時候會用到主題建模?

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-10-10 09:01 ? 次閱讀

你曾經(jīng)是否去過一家管理良好的圖書館?我常常被圖書館有秩序的書籍管理震驚到,他們可以根據(jù)書名、內(nèi)容或者其他主題把所有書排列整齊。但是如果你給圖書館提供了幾千本書,讓他們根據(jù)每本書的種類進行管理,他們一定會累到吐血。

但如果你有這些書的電子格式,做起來似乎就簡單的多了,無需手動操作,幾秒鐘可能就完成了。NLP萬歲!

請看下面一小段話:

從三種顏色的高亮處我們得知,這里有三種主題(或者概念)。一個好的主題模型可以分辨出相似的單詞,并把它們歸到一個群組中。在上面這段話中,最主要的主題就是綠色的主題2,通過它我們可以了解到這段話的主要意思是有關(guān)假視頻的。

在這篇文章中,我們將學(xué)習(xí)一種文本挖掘方法,稱為主題建模(topic modeling)。這是提取主題的一種非常有用的技術(shù),在NLP問題中會經(jīng)常用到。

注:在閱讀這篇文章前,我強烈推薦我們此前的另一篇文章:《12種降維方法終極指南(含Python代碼)》,從中可以了解SVD、UMAP等概念,這些概念會在本文出現(xiàn)。

什么是主題模型?

主題模型可以看作是一種無監(jiān)督技術(shù),用于在多個文本文件中發(fā)現(xiàn)主題。但這些主題在自然中是抽象的,而且一段文本中可能含有多種主題。就目前來說,我們暫且將主題模型理解成一個黑箱,如下圖所示:

黑箱(主題模型)將很多相似相關(guān)的詞語聚集起來,稱為主題。這些主題在文本中有特定的分布形態(tài),每種主題都是通過它包含的不同單詞比例確定的。

什么時候會用到主題建模?

回到我們開頭說到的圖書館的例子,現(xiàn)在假設(shè)你要對幾個數(shù)字化文本進行管理,如果數(shù)量不多,完全可以手動完成,但如果電子文本數(shù)量很大該怎么辦?

這就需要用到NLP技術(shù),對于這項任務(wù),主題建模是必須用到的。

主題建??梢詭椭褂谜咛幚泶罅课谋緮?shù)據(jù),找到文本中相似的多個詞語,確定抽象的主題。除此之外,主題模型還可以用于搜索引擎,讓搜索結(jié)果與搜索字符相匹配。

隱藏語義分析(LSA)概覽

所有語言都有自己細小的特征,機器難以分辨(有時連人類都會認錯)。比如有時不同的單詞卻表達相同含義,或者同一個單詞卻表達不同意思。

例如,看以下兩個句子:

I liked his lastnovelquite a lot.

We would like to go for anovelmarketing campaign.

在第一句話中,“novel”指的是一本書、小說,而在第二句話中它是形容詞,意為“新的”。

我們可以輕易地分辨二者,因為我們理解了“novel”前后詞語的意思。但是,機器無法理解這些概念,所以也不能理解詞語所處的語境。這就需要用到隱藏語義分析(LSA)了,它通過分析詞語周圍的語境捕捉其中的隱藏概念,即主題。

所以,僅僅將詞語映射到文本中并不能起到太大幫助,我們真正要做的是弄清楚詞語背后隱藏的概念或主題,這就是LSA的目的。

實施LSA的步驟

假設(shè)我們有m個文本文檔,總共有n個不同的詞語,我們想從文檔中所有文本數(shù)據(jù)中提取出k個主題,而k是由用戶決定的。

生成一個文本-單詞矩陣,計算TF-IDF分數(shù)。

之后,我們會將上述矩陣的維度降至k,利用奇異值分解(SVD)。

SVD將一個矩陣分解成三個其他的矩陣,假設(shè)我們想用SVD分解矩陣A,它就會將其分成矩陣U、S和VT(矩陣V的轉(zhuǎn)置矩陣)。

矩陣UK的每一行都是對應(yīng)文本的向量表示,這些向量的長度是k,即目標(biāo)主題的數(shù)量。我們數(shù)據(jù)中的詞語的向量表示可以在矩陣VK中找到。

通過SVD,我們得到了我們的數(shù)據(jù)中每個文本和詞語的向量表示,然后用這些向量,我們可以找到相似的單詞,利用余弦相似性找到相似的文本。

用Python實現(xiàn)LSA

首先下載所需要的庫。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

pd.set_option("display.max_colwidth", 200)

在這篇文章中,我們會用到sklearn中的“20 Newsgroup”,下載地址:archive.ics.uci.edu/ml/datasets/Twenty+Newsgroups。代碼如下:

from sklearn.datasets import fetch_20newsgroups

dataset = fetch_20newsgroups(shuffle=True, random_state=1, remove=('headers', 'footers', 'quotes'))

documents = dataset.data

len(documents)

輸出:11314。

dataset.target_names

['alt.atheism',

'comp.graphics',

'comp.os.ms-windows.misc',

'comp.sys.ibm.pc.hardware',

'comp.sys.mac.hardware',

'comp.windows.x',

'misc.forsale',

'rec.autos',

'rec.motorcycles',

'rec.sport.baseball',

'rec.sport.hockey',

'sci.crypt',

'sci.electronics',

'sci.med',

'sci.space',

'soc.religion.christian',

'talk.politics.guns',

'talk.politics.mideast',

'talk.politics.misc',

'talk.religion.misc']

數(shù)據(jù)及共有11314個文本文檔,分布在20各不同的newsgroup中。

數(shù)據(jù)預(yù)處理

開始之前,我們先嘗試著清理文本數(shù)據(jù)。主要思想就是清除其中的標(biāo)點、數(shù)字和特殊字符。之后,我們需要刪除較短的單詞,因為通常它們不會包含什么有用的信息。最后,我們將文本變?yōu)椴粎^(qū)分大小寫。

news_df = pd.DataFrame({'document':documents})

# removing everything except alphabets`

news_df['clean_doc'] = news_df['document'].str.replace("[^a-zA-Z#]", " ")

# removing short words

news_df['clean_doc'] = news_df['clean_doc'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>3]))

# make all text lowercase

news_df['clean_doc'] = news_df['clean_doc'].apply(lambda x: x.lower())

之后我們要刪除沒有特別意義的停止詞,例如“it”、“they”、“am”、“been”、“about”、“because”、“while”等等。為了實現(xiàn)這一目的,我們要對文本進行標(biāo)記化,也就是將一串文本分割成獨立的標(biāo)記或單詞。刪除停止詞之后,再把這些標(biāo)記組合在一起。

from nltk.corpus import stopwords

stop_words = stopwords.words('english')

# tokenization

tokenized_doc = news_df['clean_doc'].apply(lambda x: x.split())

# remove stop-words

tokenized_doc = tokenized_doc.apply(lambda x: [item for item in x if item notin stop_words])

# de-tokenization

detokenized_doc = []

for i in range(len(news_df)):

t = ' '.join(tokenized_doc[i])

detokenized_doc.append(t)

news_df['clean_doc'] = detokenized_doc

文本-詞語矩陣

這是通向主題建模的第一步。我們要用sklearn的TfidfVectorizer給1000個詞語創(chuàng)造一個文本-詞語矩陣。如果你有足夠的計算力,可以增加更多數(shù)據(jù)。

from sklearn.feature_extraction.text importTfidfVectorizer

vectorizer = TfidfVectorizer(stop_words='english',

max_features= 1000, # keep top 1000 terms

max_df = 0.5,

smooth_idf=True)

X = vectorizer.fit_transform(news_df['clean_doc'])

X.shape # check shape of the document-term matrix

(11314, 1000)

主題建模

下一步是將每個詞語和文本用向量表示,我們會用到文本-詞語矩陣并對他們降維。這里會用到TruncatedSVD執(zhí)行矩陣的分解。

由于數(shù)據(jù)來自20個不同的分組,我們就假設(shè)文本數(shù)據(jù)有20個不同主題。

from sklearn.decomposition importTruncatedSVD

# SVD represent documents and terms in vectors

svd_model = TruncatedSVD(n_components=20, algorithm='randomized', n_iter=100, random_state=122)

svd_model.fit(X)

len(svd_model.components_)

20

svdmodel中的元素就是我們的主題,我們可以用svdmodel.components_查看。最后,在20個主題中輸入幾個重要單詞,看模型會做出什么反應(yīng)。

terms = vectorizer.get_feature_names()

for i, comp in enumerate(svd_model.components_):

terms_comp = zip(terms, comp)

sorted_terms = sorted(terms_comp, key= lambda x:x[1], reverse=True)[:7]

print("Topic "+str(i)+": ")

for t in sorted_terms:

print(t[0])

print(" ")

Topic0: like know people think good time thanks

Topic1: thanks windows card drive mail file advance

Topic2: game team year games season players good

Topic3: drive scsi disk hard card drives problem

Topic4: windows file window files program using problem

Topic5: government chip mail space information encryption data

Topic6: like bike know chip sounds looks look

Topic7: card sale video offer monitor price jesus

Topic8: know card chip video government people clipper

Topic9: good know time bike jesus problem work

Topic10: think chip good thanks clipper need encryption

Topic11: thanks right problem good bike time window

Topic12: good people windows know file sale files

Topic13: space think know nasa problem year israel

Topic14: space good card people time nasa thanks

Topic15: people problem window time game want bike

Topic16: time bike right windows file need really

Topic17: time problem file think israel long mail

Topic18: file need card files problem right good

Topic19: problem file thanks used space chip sale

主題可視化

為了更方便地探索主題,我們應(yīng)該對其可視化。當(dāng)然,可是話不能大于三維,但是PCA或t-SNE等技術(shù)可以幫我們將高維數(shù)據(jù)降成低維進行可視化。這里,我們用另一種相對較新的技術(shù),稱作UMAP(Uniform Manifold Approximation and Projection)。

import umap

X_topics = svd_model.fit_transform(X)

embedding = umap.UMAP(n_neighbors=150, min_dist=0.5, random_state=12).fit_transform(X_topics)

plt.figure(figsize=(7,5))

plt.scatter(embedding[:, 0], embedding[:, 1],

c = dataset.target,

s = 10, # size

edgecolor='none'

)

plt.show()

如上所示,結(jié)果非常明顯,每個點代表一段文本,不同的顏色表示20個分組。

完整代碼地址:github.com/prateekjoshi565/latentsemanticanalysis

LSA的優(yōu)缺點

如上所示,隱藏語義分析非常有用,但是它也有自己的缺點。在使用它之前,還需要了解它的優(yōu)缺點。

優(yōu)點:

LSA非???,并且易于實施。

結(jié)果很清晰,比單一的向量空間模型好得多。

缺點:

由于它是一個線性模型,可能在非線性數(shù)據(jù)集上表現(xiàn)的不是很好。

LSA假設(shè)文本中的詞語是高斯分布,可能不適用于所有問題。

LSA中涉及SVD,可能在出現(xiàn)新數(shù)據(jù)或更新時需要大量計算力。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3073

    瀏覽量

    48586
  • SVD
    SVD
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    12146

原文標(biāo)題:用隱藏語義分析(LSA)進行主題建模(附Python代碼)

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    高速PCB信號和電源完整性問題的建模方法研究

    高速PCB信號和電源完整性問題的建模方法研究
    發(fā)表于 09-21 14:13 ?0次下載

    LIDAR激光雷達逆向建模用到revit當(dāng)中嗎

    信息模型(BIM)軟件,可以用于建筑設(shè)計、施工和運營管理。那么,LIDAR激光雷達逆向建模能否用到Revit中呢? LIDAR激光雷達技術(shù)簡介 LIDAR(Light Detection and Ranging,激光探測與測距)是一種
    的頭像 發(fā)表于 08-29 17:23 ?348次閱讀

    Python建模算法與應(yīng)用

    Python作為一種功能強大、免費、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡潔的語法、對動態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python在多個平臺
    的頭像 發(fā)表于 07-24 10:41 ?373次閱讀

    cad如何進行三維建模

    三維建模是計算機輔助設(shè)計(CAD)中的項重要技術(shù),它可以幫助設(shè)計師在計算機上創(chuàng)建和編輯三維模型。本文將介紹如何使用CAD軟件進行三維建模,包括建模的基本步驟、
    的頭像 發(fā)表于 07-09 10:23 ?585次閱讀

    arma-garch模型的建模步驟

    ARMA-GARCH模型是一種常用于金融市場時間序列數(shù)據(jù)的建模方法,它結(jié)合了自回歸移動平均(ARMA)模型和廣義自回歸條件異方差(GARCH)模型的優(yōu)點。以下是ARMA-GARCH模型建模
    的頭像 發(fā)表于 07-09 10:20 ?395次閱讀

    rup是一種什么模型

    RUP(Rational Unified Process,統(tǒng)建模語言)是一種軟件開發(fā)過程模型,它是一種迭代和增量的軟件開發(fā)方法。RUP是由
    的頭像 發(fā)表于 07-09 10:13 ?999次閱讀

    神經(jīng)網(wǎng)絡(luò)在數(shù)學(xué)建模中的應(yīng)用

    數(shù)學(xué)建模一種利用數(shù)學(xué)方法和工具來描述和分析現(xiàn)實世界問題的過程。神經(jīng)網(wǎng)絡(luò)是一種模擬人腦神經(jīng)元結(jié)構(gòu)和功能的計算模型,可以用于解決各種復(fù)雜問題。在數(shù)學(xué)
    的頭像 發(fā)表于 07-02 11:29 ?709次閱讀

    隧道BIM如何設(shè)計和建模

    隧道BIM (Building Information Modeling)是一種在隧道設(shè)計、建造和管理過程中使用數(shù)字化模型的方法。通過BIM技術(shù),設(shè)計師、工程師和建造者可以在個統(tǒng)
    的頭像 發(fā)表于 06-04 15:54 ?315次閱讀

    介紹三建模方式

    據(jù)量大,而是指樣本的完備性。還有就是大數(shù)據(jù)或者AI被專業(yè)學(xué)者或者行業(yè)工程師所詬病的就是,純粹的數(shù)據(jù)驅(qū)動搞不出所以然出來,需要領(lǐng)域知識(即Domain Knowledge)的協(xié)助。此外,還有第三建模方式就是混合驅(qū)動,即基礎(chǔ)物理模型加上數(shù)據(jù)驅(qū)動的方式。下文詳細介紹
    的頭像 發(fā)表于 01-23 10:48 ?1278次閱讀

    SaberRD狀態(tài)機建模工具介紹()什么是狀態(tài)機建模

    狀態(tài)機建模是使用狀態(tài)圖和方程式的手段,創(chuàng)建基于混合信號的有限狀態(tài)機模型的一種建模工具。
    的頭像 發(fā)表于 12-05 09:51 ?1454次閱讀
    SaberRD狀態(tài)機<b class='flag-5'>建模</b>工具介紹(<b class='flag-5'>一</b>)什么是狀態(tài)機<b class='flag-5'>建模</b>

    基于PMSM 控制系統(tǒng)仿真建模的新方法

    電子發(fā)燒友網(wǎng)站提供《基于PMSM 控制系統(tǒng)仿真建模的新方法.pdf》資料免費下載
    發(fā)表于 11-29 11:22 ?1次下載
    基于PMSM 控制系統(tǒng)仿真<b class='flag-5'>建模</b>的新<b class='flag-5'>方法</b>

    機器人建模方法和組成

    URDF:機器人建模方法 ROS是機器人操作系統(tǒng),當(dāng)然要給機器人使用啦,不過在使用之前,還得讓ROS認識下我們使用的機器人,如何把個機器人介紹給ROS呢? 為此,ROS專門提供了一種
    的頭像 發(fā)表于 11-22 16:30 ?812次閱讀
    機器人<b class='flag-5'>建模</b><b class='flag-5'>方法</b>和組成

    一種基于決策樹的飛機級故障診斷建模方法研究

    、預(yù)測和管理飛機的運行狀態(tài)。鑒于此,將機器學(xué)習(xí)中的決策樹算法應(yīng)用到故障診斷技術(shù)中,建立了復(fù)雜的數(shù)學(xué)模型,提出了一種基于飛機狀態(tài)參數(shù)構(gòu)成的決策樹的飛機級故障診斷建模方法,對飛機健康管理應(yīng)
    的頭像 發(fā)表于 11-16 16:40 ?918次閱讀
    <b class='flag-5'>一種</b>基于決策樹的飛機級故障診斷<b class='flag-5'>建模</b><b class='flag-5'>方法</b>研究

    ESL事務(wù)級建模語言簡介

    任何系統(tǒng)級建模語言,都需要具備在較高層次的抽象能力和對不同來源的IP的集成能力。建模方法的選擇通?;谡Z言熟悉程度、建模支持、模型可用性和簡單性。 在各種軟硬件描述語言中,Verilo
    的頭像 發(fā)表于 11-02 15:10 ?627次閱讀

    ESL設(shè)計中事務(wù)級建模般理論

    在更詳細地描述事務(wù)級建模之前,首先介紹在事務(wù)級建模用到些術(shù)語。首先事務(wù)表示數(shù)據(jù)和事件的交換過程。各個連續(xù)的事務(wù)可以是不同大小的數(shù)據(jù)傳輸,也可以是在系統(tǒng)同步時用來調(diào)整或管理模塊之間
    的頭像 發(fā)表于 11-02 14:48 ?532次閱讀