文本挖掘——實踐總結(jié)(一)

以下內(nèi)容都是在工作中的一些小實踐攘蔽,代碼部分是參考網(wǎng)上的已有的然后再自行根據(jù)情況修改過的。記載主要是想以后用的時候可以更方便的直接拿過來用粱快。

注:工作所需秩彤,程序是在knime這個數(shù)據(jù)挖掘軟件的python下運行的叔扼,結(jié)果是截圖過來的,可能模糊漫雷,可以自己實踐代碼瓜富。


文章內(nèi)容: jieba分詞(包括分詞、關(guān)鍵詞提取降盹、詞性標記)与柑、word2vec、LDA蓄坏、Kmeans四大模塊算法的理論歸納及簡單實現(xiàn)代碼與果价捧。

完成時間:1個星期左右時間。 其中涡戳,python部分2天左右结蟋,knime部分花費時間較長。

所用軟件:python,? Knime(python腳本完成)渔彰。

所用主要模塊:NLTK嵌屎、 Sklearn、pandas恍涂、Scipy宝惰、numpy、gensim(Word2vec部分)再沧,jieba尼夺。

遇到的主要問題:KNIME軟件python腳本里中文編碼問題、KNIME運行非常慢炒瘸、KNIME的文件流入流出端還不是很熟練淤堵、KNIME其他數(shù)據(jù)預處理結(jié)點還不是很熟練。

后續(xù)計劃:首先什燕,因為之前時間并不多粘勒,所以還未實現(xiàn)其他文本挖掘算法,比如屎即,SVM庙睡、 隨機森林、kNN技俐、CNN(類似其他神經(jīng)網(wǎng)絡算法)乘陪、 NLP其他功能、樸素貝葉斯等雕擂,這些算法在python里很好實現(xiàn)啡邑,在KNIME里需要改進運行效率。其次井赌,希望可以對knime的python腳本運行效率作以改進谤逼,對KNIME數(shù)據(jù)流入流出數(shù)據(jù)庫作以實踐與熟練贵扰,還有就是對模型參數(shù)的多次訓練,比如流部,本文實踐的kmeans算法戚绕,參數(shù)K目前設(shè)置的是3,聚類預測準確率也就在60%左右枝冀,模型還不是很好舞丛,需要時間再調(diào)參訓練。最后果漾,希望對knime其他挖掘軟件及結(jié)點作以實踐球切,比如weka(這個軟件比較熟悉,希望后面多了解)绒障、R吨凑、matlab等。

jieba分詞:

詞性標記代碼部分:

# Copy input to output

output_table_1 = input_table_1.copy()

output_table_2 = input_table_2.copy()

#!/usr/bin/python

import sys

#reload(sys)

#sys.setdefaultencoding('utf-8')

import jieba

import jieba.posseg as pseg #主要用jieba里的pseg做詞性標記

import jieba.analyse

# 對句子進行分詞

def seg_sentence(sentence):

sentence_seged = pseg.cut(sentence.strip())

stopwords = []

for line in output_table_2.values: #遍歷停用詞DataFrame

#print

line[0]

stopwords.append(line[0])

outstr = ''

for word in sentence_seged:

if word not in stopwords: #去除停用詞

if word!='\t':

for word1, flag in

sentence_seged: #遍歷分詞及分詞詞性

#print'%s %s' % (word1,

flag)

outstr

+=word1+'\t'+flag+'\n'

else:

outstr += " "

return outstr

#out_table=DataFrame()

for line in output_table_1.values:

line_seg = seg_sentence(line[0]) # 這里的返回值是字符串

print line_seg

#output_table_1['fenci']=line_seg

詞性標記腳本結(jié)果:

特征詞提取代碼部分(提取了權(quán)重top100的詞):

# Copy input to output

output_table = input_table.copy()

#!/usr/bin/python

import sys

import pandas

from pandas import DataFrame

#reload(sys)

#sys.setdefaultencoding('utf-8')

import jieba

import jieba.posseg as pseg

import jieba.analyse #主要用到jieba里的analyse做特征詞提取

#finename='C:\\Users\\AAS-1413\\Desktop\\r.txt'

words = ''

#f = open("goods11.txt",

"w")

#with open(finename,'r') as f1:

for line in input_table['Col0']:

#print

line

words+=line

#print

words

#f2=f1.readlines()

tags = jieba.analyse.extract_tags(words,

topK=100, withWeight=True, allowPOS=()) #特征詞提取關(guān)鍵部分端盆,該函數(shù)里的參數(shù)可以自行修改怀骤,allowPOS參數(shù)可以自行設(shè)置提取詞的詞性

for wd, weight in tags:

print

wd, weight

#output_table['fe']=wd

#output_table['f']=weight

#f.close()

特征詞提取腳本結(jié)果:

jieba分詞:

# Copy input to output

output_table_1 = input_table_1.copy()

output_table_2 = input_table_2.copy()

#!/usr/bin/python

import sys

#(sys)

#sys.setdefaultencoding('utf-8')

import jieba #該部分主要用jieba

import jieba.posseg as pseg

import jieba.analyse

# 對句子進行分詞

def seg_sentence(sentence):

sentence_seged = jieba.cut(sentence.strip())

stopwords = []

for line in output_table_2.values:

#print

line[0]

stopwords.append(line[0])

outstr = ''

for word in sentence_seged:

if word not in stopwords:

if word != '\t':

outstr +='/'+word

else:

outstr += " "

return outstr

#out_table=DataFrame()

for line in output_table_1.values:

line_seg = seg_sentence(line[0])

print line_seg

分詞腳本結(jié)果:

word2vec:

word2vev是一個淺層的神經(jīng)網(wǎng)絡算法费封。本文主要是利用python模塊下gensim框架來調(diào)用word2vec實現(xiàn)先對文本分詞焕妙,再對分詞結(jié)果訓練word2vec模型(word2vec模型訓練過程中的參數(shù)可以修改),然后利用訓練好的word2vec模型來做了簡單的應用弓摘,比如焚鹊,計算兩個詞的相似度,計算與一個詞相關(guān)的所有其他詞韧献,尋找詞語之間的對應關(guān)系末患,在一堆詞語里尋找出不合群的詞語。該模型目前大多用于對詞語的分析挖掘中锤窑,所以對拿到的文本首先要做分詞璧针。

對文檔分詞腳本結(jié)果:

訓練word2vec模型及簡單應用代碼:

import pandas

import numpy

# Copy input to output

output_table = input_table.copy()

from gensim.models import word2vec

sentences=word2vec.Text8Corpus(u'C:\\Python27\\fenci_result.txt')

model=word2vec.Word2Vec(sentences,

size=100) #訓練模型,很多默認參數(shù)在此省略

#計算兩個詞的相似度/相關(guān)程度

y1=model.similarity(u"包裝",

u"物流")

print "包裝和物流的相似度為:", y1

print "-------------\n"

# 計算某個詞的相關(guān)詞列表

y2 = model.most_similar(u"不錯",

topn=10) # 10個最相關(guān)的

#rint u"和【配置】最相關(guān)的詞有:\n"

for item in y2:

print item[0], item[1]

print"--------------\n"

# 尋找對應關(guān)系

print u"包裝-可以渊啰,物流-"

y3 =model.most_similar([u'包裝', u'可以'], [u'物流'],

topn=10)

for item in y3:

print item[0], item[1]

print

"--------------------------\n"

# 尋找不合群的詞

y4 =model.doesnt_match(u"包裝 細心 可以 精美 不錯 喜歡 很好".split())

print u"不合群的詞:", y4

print"--------------------------------\n"

計算兩個詞的相似度/相關(guān)程度腳本結(jié)果:

計算某個詞的相關(guān)詞列表腳本結(jié)果:

尋找對應關(guān)系腳本結(jié)果:

尋找不合群的詞腳本結(jié)果:

LDA模型部分:

LDA模型主要應用于對很多文檔的主題分析上探橱。關(guān)鍵部分是建立各個文檔與詞干的矩陣向量,該部分可以有很多方法绘证,比如用tfidf或者本文用的doc2bow等隧膏。

本LDA模型建立步驟:導入文檔——清洗文檔——分詞——去除停用詞——詞干提取——創(chuàng)建 document-term matrix矩陣(算法主旨部分)——訓練LDA——應用LDA

LDA腳本代碼:

import sys

# Copy input to output

output_table = input_table.copy()

#print input_table.values

#!/usr/bin/env python

import nltk

from nltk.tokenize import RegexpTokenizer

from stop_words import get_stop_words

from nltk.stem.porter import PorterStemmer

from gensim import corpora, models

import gensim

import jieba

# 創(chuàng)建詞干

p_stemmer = PorterStemmer()

# 創(chuàng)建簡單文檔

doc_a = "活動非常不錯,本來準備讓美國同學帶的嚷那,一合計還不如旗艦店買劃算胞枕。我膝關(guān)節(jié)滑膜炎自己吃保健用的。"

doc_b = "價格鉅惠魏宽,家人腰椎間盤滑脫隨時腳麻腐泻,希望吃了有效果决乎,有效果來追加評價通過掃碼查了下,的確是美國進口派桩,相信旗艦店的品質(zhì)瑞驱!"

doc_c = "前半小時包稅,結(jié)果我過了3分鐘窄坦,沒包成稅唤反,多花了70多,老人家長期吃長期需要買鸭津,看來要收藏好隨時關(guān)注活動彤侍!"

doc_d = "聽別人說這種保健品很有效,老人膝蓋很疼逆趋,希望吃了會有效果盏阶。貨物發(fā)自保稅倉,驗證碼很麻煩闻书,就沒有試名斟。吃過再追評。"

doc_e = "有時會覺得膝蓋活動不那么靈活魄眉,關(guān)鍵才三十多歲砰盐,在網(wǎng)上看到大家評價不錯,先買兩瓶試試坑律。"

#簡單文檔列表

doc_set = [doc_a, doc_b, doc_c, doc_d,

doc_e]

# 對文檔列表作循環(huán)

texts=[]

for i in doc_set:

#

clean and tokenize document string

tokens = jieba.cut(i)

stopped_tokens = [i for i in tokens if not i in input_table.values]

stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]

texts.append(stemmed_tokens)

#print texts

#print stemmed_tokens

# 創(chuàng)建字典

dictionary = corpora.Dictionary(texts)

#print dictionary

#print dictionary.token2id#不重復的詞的ID

# 創(chuàng)建 詞-文檔 矩陣

corpus = [dictionary.doc2bow(text) for text

in texts]

print corpus[0]#詞向量

# 應用LDA模型

ldamodel =

gensim.models.ldamodel.LdaModel(corpus, num_topics=2, id2word = dictionary,

passes=20) #訓練模型岩梳,該部分參數(shù)可自行修改

print ldamodel.print_topics(num_topics=2,

num_words=8)#應用LDA模型,該處自行設(shè)置2個主題晃择,8個分詞

t=''

for i in

ldamodel.print_topics(num_topics=2, num_words=8): #2個主題冀值,8個分詞

for

w in i:

t+=str(w)+'\n'

print t

主題生成腳本結(jié)果:

應用模型結(jié)果解釋:打印出的corpus[0]([0]表示第一文檔)就是截圖結(jié)果里的第一行的向量部分,該部分的每個向量第一個數(shù)字表示詞干ID,第二個數(shù)字表示該詞干在第一個文檔里出現(xiàn)的次數(shù)宫屠。打印出的 ldamodel.print_topics(num_topics=2, num_words=8)列疗,就是最下面的8個隨機詞干組成的兩個主題,每個詞干前對應該詞干的權(quán)重浪蹂。打印出的中間部分編碼暫時有點問題抵栈。

Kmeans:

聚類算法

from __future__ import print_function

from sklearn.feature_extraction.text import

TfidfVectorizer

from sklearn.feature_extraction.text import

HashingVectorizer

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans,

MiniBatchKMeans

import os

# Copy input to output

output_table = input_table.copy()

def loadDataset():

'''導入文本數(shù)據(jù)集'''

#FindPath = 'C:\\Users\\AAS-1413\\Desktop\\tokens\\pos\\'

#

FileNames = os.listdir(FindPath)

dataset=[]

for line in input_table['Col0']:

#print (line)

dataset.append(line)

return dataset

def transform(dataset,n_features=1000):

vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features,

min_df=2,use_idf=True)

X

= vectorizer.fit_transform(dataset)

return X,vectorizer

def train(X,vectorizer,true_k=3,minibatch =

False,showLable = False):

#使用采樣數(shù)據(jù)還是原始數(shù)據(jù)訓練k-means,

if minibatch:

km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,

init_size=1000,

batch_size=1000, verbose=False)

else:

km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,

verbose=False)

km.fit(X)

if showLable:

print (u"聚類結(jié)果主要詞條:")#

top terms per cluster

order_centroids = km.cluster_centers_.argsort()[:, ::-1]

terms = vectorizer.get_feature_names()

#print (vectorizer.get_stop_words())

for i in range(true_k):

print("\n Cluster %d:\n" % i, end='')

for ind in order_centroids[i, :10]:

print(' %s' % terms[ind], end='')

#print

result = list(km.predict(X))

#print('\n----------------------------------------------------------')

print (u'\n\n類分配:')#Cluster distribution

print (dict([(i, result.count(i)) for i in result]))

return -km.score(X)

def test():

'''測試選擇最優(yōu)參數(shù)'''

dataset = loadDataset()

print("%d documents" % len(dataset))

X,vectorizer = transform(dataset,n_features=500)

true_ks = []

scores = []

for i in xrange(3,80,1):

score = train(X,vectorizer,true_k=i)/len(dataset)

print (i,score)

true_ks.append(i)

scores.append(score)

plt.figure(figsize=(8,4))

plt.plot(true_ks,scores,label="error",color="red",linewidth=1)

plt.xlabel("n_features")

plt.ylabel("error")

plt.legend()

plt.show()

def out():

'''在最優(yōu)參數(shù)下輸出聚類結(jié)果'''

dataset = loadDataset()

X,vectorizer = transform(dataset,n_features=500)

score = train(X,vectorizer,true_k=3,showLable=True)/len(dataset)

#print('\n----------------------------------------------------------')

print (u'\n聚類預測準確率:')

print (score)

#test()

out()

聚類結(jié)果:

結(jié)果解釋: 本模型設(shè)置k參數(shù)為3乌逐,聚成3類竭讳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浙踢,隨后出現(xiàn)的幾起案子绢慢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胰舆,死亡現(xiàn)場離奇詭異骚露,居然都是意外死亡,警方通過查閱死者的電腦和手機缚窿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門棘幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倦零,你說我怎么就攤上這事误续。” “怎么了扫茅?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵蹋嵌,是天一觀的道長。 經(jīng)常有香客問我葫隙,道長栽烂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任恋脚,我火速辦了婚禮腺办,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糟描。我一直安慰自己怀喉,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布蚓挤。 她就那樣靜靜地躺著磺送,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灿意。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天崇呵,我揣著相機與錄音缤剧,去河邊找鬼。 笑死域慷,一個胖子當著我的面吹牛荒辕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犹褒,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抵窒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叠骑?” 一聲冷哼從身側(cè)響起李皇,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宙枷,沒想到半個月后掉房,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茧跋,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年卓囚,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘾杭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哪亿,死狀恐怖粥烁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝇棉,我是刑警寧澤页徐,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站银萍,受9級特大地震影響变勇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴唇,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一搀绣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戳气,春花似錦链患、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呀袱,卻和暖如春贸毕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夜赵。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工明棍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寇僧。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓摊腋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘁傀。 傳聞我的和親對象是個殘疾皇子兴蒸,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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