文字資料分析——主題提取+詞向量化

sljwy發表於2020-10-20

使用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®
# 分詞+選詞
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




相關文章