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

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

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

一種文本挖掘方法稱為主題建模,什么時(shí)候會(huì)用到主題建模?

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

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

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

請看下面一小段話:

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

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

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

什么是主題模型?

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

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

什么時(shí)候會(huì)用到主題建模?

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

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

主題建模可以幫助使用者處理大量文本數(shù)據(jù),找到文本中相似的多個(gè)詞語,確定抽象的主題。除此之外,主題模型還可以用于搜索引擎,讓搜索結(jié)果與搜索字符相匹配。

隱藏語義分析(LSA)概覽

所有語言都有自己細(xì)小的特征,機(jī)器難以分辨(有時(shí)連人類都會(huì)認(rèn)錯(cuò))。比如有時(shí)不同的單詞卻表達(dá)相同含義,或者同一個(gè)單詞卻表達(dá)不同意思。

例如,看以下兩個(gè)句子:

I liked his lastnovelquite a lot.

We would like to go for anovelmarketing campaign.

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

我們可以輕易地分辨二者,因?yàn)槲覀兝斫饬恕皀ovel”前后詞語的意思。但是,機(jī)器無法理解這些概念,所以也不能理解詞語所處的語境。這就需要用到隱藏語義分析(LSA)了,它通過分析詞語周圍的語境捕捉其中的隱藏概念,即主題。

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

實(shí)施LSA的步驟

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

生成一個(gè)文本-單詞矩陣,計(jì)算TF-IDF分?jǐn)?shù)。

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

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

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

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

用Python實(shí)現(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)

在這篇文章中,我們會(huì)用到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個(gè)文本文檔,分布在20各不同的newsgroup中。

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

開始之前,我們先嘗試著清理文本數(shù)據(jù)。主要思想就是清除其中的標(biāo)點(diǎn)、數(shù)字和特殊字符。之后,我們需要?jiǎng)h除較短的單詞,因?yàn)橥ǔK鼈儾粫?huì)包含什么有用的信息。最后,我們將文本變?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())

之后我們要?jiǎng)h除沒有特別意義的停止詞,例如“it”、“they”、“am”、“been”、“about”、“because”、“while”等等。為了實(shí)現(xiàn)這一目的,我們要對(duì)文本進(jìn)行標(biāo)記化,也就是將一串文本分割成獨(dú)立的標(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個(gè)詞語創(chuàng)造一個(gè)文本-詞語矩陣。如果你有足夠的計(jì)算力,可以增加更多數(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)

主題建模

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

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

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個(gè)主題中輸入幾個(gè)重要單詞,看模型會(huì)做出什么反應(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)該對(duì)其可視化。當(dāng)然,可是話不能大于三維,但是PCA或t-SNE等技術(shù)可以幫我們將高維數(shù)據(jù)降成低維進(jìn)行可視化。這里,我們用另一種相對(duì)較新的技術(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é)果非常明顯,每個(gè)點(diǎn)代表一段文本,不同的顏色表示20個(gè)分組。

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

LSA的優(yōu)缺點(diǎn)

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

優(yōu)點(diǎn):

LSA非???,并且易于實(shí)施。

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

缺點(diǎn):

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

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

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

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

    關(guān)注

    1

    文章

    3032

    瀏覽量

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

    關(guān)注

    0

    文章

    21

    瀏覽量

    12137

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

    cad如何進(jìn)行三維建模

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

    arma-garch模型的建模步驟

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

    rup是一種什么模型

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

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

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

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

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

    介紹三建模方式

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

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

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

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

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

    機(jī)器人建模方法和組成

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

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

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

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

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

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

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