用python處理文本數(shù)據(jù)

Q:這篇文章主要講什么逢慌?

A:
這篇文章主要討論如何用python來做一些簡單的文本處理——文本相似度比較。

談起python的自然語言處理火架,肯定會讓人想起NLTK何鸡。不過上面這兩個任務并不需要NLTK這個庫,只是用到了gensim淆游。由于涉及中文隔盛,所以還用到了jieba來做中文分詞犹菱。

Q:Gensim是什么東西腊脱?

A:
首先說說gensim是個怎樣的python庫吧龙亲。

由于這篇筆記只記錄最簡單的用法悍抑,所以gensim更詳細的介紹搜骡,更強大的功能請到官網(wǎng)閱讀文檔:<a >gensim官網(wǎng)</a>浆兰。不懂英文珊豹?趕緊去補暗瓴琛贩幻!

gensim

Gensim is a free Python library designed to automatically extract semantictopics from documents, as efficiently (computer-wise) and painlessly (human-wise) as possible.

簡單來說丛楚,gensim的主要功能有把文本轉(zhuǎn)為向量(scikit-learn也能做到)趣些,抽取文本中的關鍵詞(jieba也能做到)坏平,比較兩個文本的相似度,甚至是計算一個查詢(本質(zhì)也是一個文本)與一個文檔集合中所有文檔的關聯(lián)程度(這個似乎只有g(shù)ensim能做令境,sklearn和jieba都不能)舔庶。更強大的是惕橙,gensim庫實現(xiàn)了word2vec算法(其實我目前不懂這個算法的原理)孵延!。

gensim有三個主要模塊——

  • corpora:將文本轉(zhuǎn)為向量惶凝,提供存儲文本矩陣的方法。這里生產(chǎn)的向量形式是最基本的思灰,族簡單的洒疚,僅僅是為文檔建立詞典坯屿,然后計數(shù)文檔中每個詞出現(xiàn)的次數(shù)。
  • models:將corpora生產(chǎn)的簡單向量轉(zhuǎn)化為其他各種不同的向量乏德『袄ǎ可以選擇的向量模型有TFIDF, LSI, RP, LDA, HDP等矢棚。用戶可以先用corpora模塊把文本轉(zhuǎn)為簡單向量蒲肋,再用models模塊得到自己需要的向量形式肉津。
  • similarites:提供計算文本相似度方法的模塊。

gensim其他更強大的功能還沒列出,所以想要深入學習就得去官網(wǎng)查閱文檔了距糖。

</br>

Q:如何使用gensim來計算文本相似度悍引?

A:
計算一個查詢(字符串)與文檔集中所有文檔的相似度是搜索引擎的核心功能模塊之一趣斤。gensim計算文本相似度的的套路就是先用copora模塊把文檔轉(zhuǎn)為簡單的稀疏矩陣浓领;然后用models模塊得到符合需要的向量模型漫仆;最后用similarities模塊計算相似度泪幌。下面用一個案例來說明怎樣計算文本相似度祸泪。

假設現(xiàn)在有一個八個文檔組成的文檔集:

texts = [
    '什么是股票没隘?',
    '股票是個什么玩意?',
    '新手怎樣入門炒股升略?',
    '現(xiàn)在股市的風險大嗎微王?',
    'python的自然語言處理',
    'gensim的主要功能有把文本轉(zhuǎn)為向量',
    '提供存儲文本矩陣的方法',
    '這篇文章主要討論如何用python來做一些簡單的文本處理'
]

由于文本轉(zhuǎn)向量算法的原理是統(tǒng)計文本中每個單詞出現(xiàn)的個數(shù),所以我們還要把文檔集里的每個文檔切詞品嚣,也就是說把一個文檔編程一個單詞列表(或者數(shù)組炕倘,或者任何數(shù)據(jù)容器iterable)。西方語言由于先天就用空格把詞分開翰撑,而類似中文的東方語言則需要特定的分詞模塊罩旋。一個常用的中文分詞模塊是jieba分詞——可以分詞、可以做詞性標注眶诈、可以抽取關鍵字的分詞模塊涨醋。詳見官方文檔(當然是中文的)。

docs = [jieba.lcut_for_search(i) for i in texts] #返回一個包含著很多單詞列表的列表逝撬。
In [4]: print docs
[[u'\u4ec0\u4e48', u'\u662f', u'\u80a1\u7968', u'\uff1f'], [u'\u80a1\u7968', u'\u662f', u'\u4e2a', u'\u4ec0\u4e48', u'\u73a9\u610f', u'\uff1f'], [u'\u65b0\u624b', u'\u600e\u6837', u'\u5165\u95e8', u'\u7092\u80a1', u'\uff1f'], [u'\u73b0\u5728', u'\u80a1\u5e02', u'\u7684', u'\u98ce\u9669', u'\u5927', u'\u5417', u'\uff1f'], [u'python', u'\u7684', u'\u81ea\u7136', u'\u8bed\u8a00', u'\u81ea\u7136\u8bed\u8a00', u'\u5904\u7406'], [u'gensim', u'\u7684', u'\u4e3b\u8981', u'\u529f\u80fd', u'\u6709', u'\u628a', u'\u6587\u672c', u'\u8f6c\u4e3a', u'\u5411\u91cf'], [u'\u63d0\u4f9b', u'\u5b58\u50a8', u'\u6587\u672c', u'\u77e9\u9635', u'\u7684', u'\u65b9\u6cd5'], [u'\u8fd9', u'\u6587\u7ae0', u'\u7bc7\u6587\u7ae0', u'\u4e3b\u8981', u'\u8ba8\u8bba', u'\u5982\u4f55', u'\u7528', u'python', u'\u6765', u'\u505a', u'\u4e00\u4e9b', u'\u7b80\u5355', u'\u7684', u'\u6587\u672c', u'\u672c\u5904', u'\u5904\u7406', u'\u6587\u672c\u5904\u7406']]
#原諒我的機器在打印整個列表時,所有中文會變成unicode編碼

下一步是構(gòu)建文檔集(單詞列表集)的詞典溯警,然后利用詞典來用向量表示文檔

In [10]: dic = corpora.Dictionary(docs)

In [11]: print dic  #這個詞典給文檔集中每個單詞編號
Dictionary(45 unique tokens: [u'\u98ce\u9669', u'\u672c\u5904', u'\u7684', u'\u5904\u7406', u'\u4ec0\u4e48']...)

In [12]: corpus = [dic.doc2bow(i) for i in docs]

In [13]: print corpus 
[[(0, 1), (1, 1), (2, 1), (3, 1)], [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)], [(3, 1), (6, 1), (7, 1), (8, 1), (9, 1)], [(3, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], [(12, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1)], [(12, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 1), (27, 1), (28, 1)], [(12, 1), (25, 1), (29, 1), (30, 1), (31, 1), (32, 1)], [(12, 1), (16, 1), (17, 1), (24, 1), (25, 1), (33, 1), (34, 1), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1), (44, 1)]]

#這是稀疏矩陣的一種形式,每個列表的每個括號表示(詞編號伊诵,詞的出現(xiàn)次數(shù))

這樣一來,文本就轉(zhuǎn)換成矩陣了份氧。不過這個矩陣的向量模型非常簡單,我們要用一個高級一點的LSI(潛語義分析)向量模型來做相似度計算。應用models模塊的可以做到向量模型的轉(zhuǎn)換湘捎。

In [14]: lsi = models.LsiModel(corpus, id2word=dic, num_topics=2)

向量模型轉(zhuǎn)換完成活翩,下面開始進行計算相似度的工作。為了方便和明顯拉宗,我們計算一下“股票”這個詞和“文本”這兩個查詢與文檔集中八個文檔的相似度络它。如果沒有意外点楼,按照我們的直覺换怖,我們會看到“股票”這個查詢和文檔集中前四個文檔比較相似悦污,“文本”這個查詢和文檔集中后四個文檔比較相似彻坛。

In [21]: qurey1 = "股票"      #首先把這兩個查詢也變成向量
    ...: qurey2 = '文本'
    ...: vec_query1 = dic.doc2bow([qurey1])
    ...: vec_query2 = dic.doc2bow([qurey2])

In [22]: index = similarities.MatrixSimilarity(lsi[corpus])
#然后建立索引(估計是倒排詞表茵瀑,下面的就不怎么懂了)

In [23]: sims1 = index[lsi[vec_query1]]
    ...: sims2 = index[lsi[vec_query2]]
#得到了查詢語句與哥哥文檔的相似度

In [24]: sims_result1 = sorted(enumerate(sims1), key=lambda item: -item[1])
    ...: sims_result2 = sorted(enumerate(sims2), key=lambda item: -item[1])
#給結(jié)果排一下序    

In [25]: print sims_result1
[(1, 0.99990207), (0, 0.99984658), (2, 0.99941468), (3, 0.93057805), (6, 0.31655648), (5, 0.27374423), (4, 0.12518336), (7, -0.11772308)]

In [27]: print sims_result2
[(4, 0.99776512), (7, 0.98443955), (5, 0.97619325), (6, 0.96549642), (3, 0.4200055), (2, 0.092727646), (0, 0.076089963), (1, 0.07257086)]

很明顯的看到“股票”這個查詢和文檔集中前四個文檔比較相似偏陪,“文本”這個查詢和文檔集中后四個文檔比較相似抱虐,這也是符合我們的常識的灶轰。

完整代碼:

#coding: utf-8
import sys, jieba
from gensim import corpora, models, similarities
reload(sys)
sys.setdefaultencoding('utf8')

texts = [
    '什么是股票?',
    '股票是個什么玩意阱缓?',
    '新手怎樣入門炒股颁糟?',
    '現(xiàn)在股市的風險大嗎?',
    'python的自然語言處理',
    'gensim的主要功能有把文本轉(zhuǎn)為向量',
    '提供存儲文本矩陣的方法',
    '這篇文章主要討論如何用python來做一些簡單的文本處理'
]
docs = [jieba.lcut_for_search(i) for i in texts]

dic = corpora.Dictionary(docs)
corpus = [dic.doc2bow(i) for i in docs]

lsi = models.LsiModel(corpus, id2word=dic, num_topics=2)

qurey1 = "股票"
qurey2 = '文本'
vec_query1 = dic.doc2bow([qurey1])
vec_query2 = dic.doc2bow([qurey2])

index = similarities.MatrixSimilarity(lsi[corpus])

sims1 = index[lsi[vec_query1]]
sims2 = index[lsi[vec_query2]]
sims_result1 = sorted(enumerate(sims1), key=lambda item: -item[1])
sims_result2 = sorted(enumerate(sims2), key=lambda item: -item[1])
print sims_result1
print sims_result2

由于作者對于文本處理和gensim的原理還不太懂起惕,如有不當之處,歡迎高手指點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薄湿,一起剝皮案震驚了整個濱河市坐求,隨后出現(xiàn)的幾起案子派任,更是在濱河造成了極大的恐慌豆混,老刑警劉巖奠滑,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏屯,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機荧呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侦高,“玉大人危尿,你說我怎么就攤上這事。” “怎么了呐萨?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長礼患。 經(jīng)常有香客問我厨相,道長单刁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮邻遏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滞项。我一直安慰自己疚宇,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布物蝙。 她就那樣靜靜地躺著册赛,像睡著了一般震嫉。 火紅的嫁衣襯著肌膚如雪措伐。 梳的紋絲不亂的頭發(fā)上侥加,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天提前,我揣著相機與錄音,去河邊找鬼。 笑死哨苛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的则拷。 我是一名探鬼主播贡蓖,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼曹鸠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摩梧?” 一聲冷哼從身側(cè)響起物延,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仅父,沒想到半個月后叛薯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡笙纤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年耗溜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片省容。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡抖拴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腥椒,到底是詐尸還是另有隱情阿宅,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布笼蛛,位于F島的核電站洒放,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滨砍。R本人自食惡果不足惜往湿,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惋戏。 院中可真熱鬧领追,春花似錦、人聲如沸响逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龄句。三九已至回论,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分歇,已是汗流浹背傀蓉。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留职抡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谱净,于是被迫代替她去往敵國和親窑邦。 傳聞我的和親對象是個殘疾皇子壕探,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容