python學習-文字資料分析1(主題提取+詞向量化)
阿新 • • 發佈:2019-01-03
原文地址:
http://blog.sina.com.cn/s/blog_727a704c0102vn44.html
使用Python 進行簡單文字類資料分析,包括:
1. 分詞
2. 生成語料庫,tfidf加權
3. lda主題提取模型
4. 詞向量化word2vec
參考:
http://zhuanlan.zhihu.com/textmining-experience/1963076
#!/usr/bin/env python # -*- coding:utf-8 -*- import MySQLdb import pandas as pd import pandas.io.sql as sql import jieba import nltk import jieba.posseg as pseg from gensim import corpora, models, similarities import re # import logging # logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INGO) # reload(sys) # sys.setdefaultencoding('utf-8') if __name__ == '__main__': #使用者詞典匯入 jieba.load_userdict("F:\userdict.txt") #1. 讀取資料 conn = MySQLdb.connect(host='', port=3306, charset='utf8',user='', passwd='', db='') df = sql.read_sql('select * from test',conn) conn.close() cont = df['commcont'] #示例資料(電商評論): 0 標籤:洗衣機不錯操作簡單全自動不錯心得:洗衣機很滿意!洗寶寶衣服的~!小巧方便~!! 1 標籤:洗衣時間短脫水聲音小脫水很好噪音很小操作簡單心得:比超市便宜,挺好用的,床單也可以洗。 2 標籤:脫水很好脫水聲音小洗衣效果好心得:質量、設計都非常好,外觀也很漂亮。很滿意。要注意這款... 3 標籤:洗衣乾淨動力足洗衣效果好心得:比較小巧,非常不錯,大品牌有保障!!! 4 心得:很適合家庭使用小件的衣物及時就洗出來了方便 5 標籤:洗衣機不錯操作簡單心得:非常不錯的洗衣機,價格也還不錯,支援京東! 6 標籤:脫水很好操作簡單心得:給兒子買的脫水用,還不錯~~~~~~~~~ 7 心得:很好的烘乾機,已經用了 8 標籤:操作簡單心得:說是防纏繞,不知道是怎麼個防纏繞法,脫水聲音超大,像是在撞牆一樣版本:6... 9 標籤:全自動不錯心得:買來送長輩的,還沒用,看起來還可以版本:6.5公斤 # 2. 簡單過濾某些特定詞 pattern = ur'標籤|心得' regx = re.compile(pattern) r = lambda x: regx.sub('',x) filtercont = cont.map(r) # 分詞+選詞 nwordall = [] for t in cont: words =pseg.cut(t) nword = [''] for w in words: if((w.flag == 'n'or w.flag == 'v' or w.flag == 'a') and len(w.word)>1): nword.append(w.word) nwordall.append(nword) # 3. 選擇後的詞生成字典 dictionary = corpora.Dictionary(nwordall) #print dictionary.token2id # 生成語料庫 corpus = [dictionary.doc2bow(text) for text in nwordall] #tfidf加權 tfidf = models.TfidfModel(corpus) # print tfidf.dfsx # print tfidf.idf corpus_tfidf = tfidf[corpus] # for doc in corpus_tfidf: # print doc # 4. 主題模型lda,可用於降維 #lda流式資料建模計算,每塊10000條記錄,提取50個主題 lda = models.ldamodel.LdaModel(corpus=corpus_tfidf, id2word=dictionary, num_topics=50, update_every=1, chunksize=10000, passes=1) for i in range(0,3): print lda.print_topics(i)[0] #lda全部資料建模,提取100個主題 #lda = models.ldamodel.LdaModel(corpus=corpus_tfidf, id2word=dictionary, num_topics=100, update_every=0, passes=20) #利用原模型預測新文字主題 # doc_lda = lda[corpus_tfidf] #提取出的前3個主題的結果: 0.028*算輕 + 0.028*操作 + 0.027*噪音 + 0.026*不久 + 0.025*送貨 + 0.025*很好 + 0.024*牌子 + 0.022*簡單 + 0.021*很小 + 0.020*評價 0.047*脫水 + 0.035*聲音 + 0.034*價效比 + 0.031*起來 + 0.026*經典 + 0.025*不錯 + 0.024*希望 + 0.022*知道 + 0.020*喜歡 + 0.020*問題 0.056*不用 + 0.032*代買 + 0.029*次數 + 0.024*凍手 + 0.023*稍差 + 0.022*優點 + 0.022*地方 + 0.021*缺點 + 0.020*面板 + 0.019*送貨 #5. word2vec 詞向量化,可用於比較詞相似度,尋找對應關係,詞聚類 #sentences = models.word2vec.LineSentence(nwordall) #size為詞向量維度數,windows視窗範圍,min_count頻數小於5的詞忽略,workers是執行緒數 model = models.word2vec.Word2Vec(nwordall, size=100, window=5, min_count=5, workers=4) #model.save("F:\word2vecmodels") 建模速度慢,建議儲存,後續直接呼叫 #model = models.word2vec.Word2Vec.load("F:\word2vecmodels") print model[u'洗衣'] #向量表示 sim = model.most_similar(positive=[u'洗衣', u'方便']) #相近詞 for s in sim: print "word:%s,similar:%s " %(s[0],s[1]) #找到“洗衣”和”方便“相似度高的詞 word:容量,similar:0.949171900749 word:動力,similar:0.946333944798 word:時間,similar:0.939984798431 word:乾淨,similar:0.918717443943 word:滾筒,similar:0.90215164423 word:外觀,similar:0.886778771877 word:功能,similar:0.882432937622 word:效果,similar:0.880518734455 word:聲音,similar:0.878705024719 word:電機,similar:0.878492772579