1. 程式人生 > >python學習-文字資料分析1(主題提取+詞向量化)

python學習-文字資料分析1(主題提取+詞向量化)

原文地址:

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