語料載入->分詞->去停用詞->抽取詞向量模型特徵->基於tf-idf和word2vec進行kmeans中文文字聚類
import random
import jieba
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import tfidftransformer
import matplotlib.pyplot as plt
from sklearn.decomposition import pca
from sklearn.cluster import kmeans
import gensim
from gensim.models import word2vec
from sklearn.preprocessing import scale
import multiprocessing
#載入停用詞,txt內容可以隨專案進行改變
stopwords = pd.read_csv(
'stopword.txt'
,index_col=
false
,quoting=
3,sep=
'\t'
,names=
['stopwords'
],encoding=
'utf-8'
)stopwords = stopwords[
'stopwords'
].values
#載入語料庫
data = pd.read_csv(
'data.csv'
,encoding=
'utf-8'
,seq=
',')
data.dropna(inplace=
true
)data = data.segment.values.tolist(
)#dataframe轉為list
#分詞、去停用詞
defpreprocess
(data)
:for line in data:
try:
segs = jieba.lcut(line)
#分詞 segs =
[v for v in segs if
notstr
(v).isdigit()]
#取數字
segs =
list
(filter
(lambda x:x.strip(
),segs)
)#去左右空格
segs =
list
(filter
(lambda x:
len(x)
>
1,segs)
)#去掉長度為1的字元
segs =
list
(filter
(lambda x:x not
in stopwords,segs)
)#去掉停用詞
"".join(segs)
)except exception:
print
(line)
continue
return sentences
sentences = preprocess(data)
#抽取詞向量特徵,tf-idf
#將文字中的詞語轉換為詞頻矩陣 矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
vectorizer = tfidfvectorizer(sublinear_tf=
true
, max_df=
0.5)
#統計每個詞語的tf-idf權值
transformer = tfidftransformer(
)# 第乙個fit_transform是計算tf-idf 第二個fit_transform是將文字轉為詞頻矩陣
tfidf = transformer.fit_transform(vectorizer.fit_transform(sentences)
)# 獲取詞袋模型中的所有詞語
word = vectorizer.get_feature_names(
)# 將tf-idf矩陣抽取出來,元素w[i][j]表示j詞在i類文字中的tf-idf權重
weight = tfidf.toarray(
)#檢視特徵大小
print
('features length: '
+str
(len
(word)))
#基於tf-idf進行kmeans聚類,也可以使用基於密度的dbscan和層次聚類等演算法
numclass=
4#聚類分幾簇
clf = kmeans(n_clusters=numclass, max_iter=
10000
, init=
"k-means++"
, tol=1e-
6) pca = pca(n_components=10)
# 降維
tnewdata = pca.fit_transform(weight)
# 載入n維
s = clf.fit(tnewdata)
#視覺化聚類結果
defplot_cluster
(result,newdata,numclass)
: plt.figure(2)
lab =[[
]for i in
range
(numclass)
] index =
0for labi in result:
lab[labi]
index +=
1 color =
['oy'
,'ob'
,'og'
,'cs'
,'ms'
,'bs'
,'ks'
,'ys'
,'yv'
,'mv'
,'bv'
,'kv'
,'**'
,'y^'
,'m^'
,'b^'
,'k^'
,'g^']*
3for i in
range
(numclass)
: x1 =
y1 =
for ind1 in newdata[lab[i]]:
# print ind1
try:1]
)0])
except
:pass
plt.plot(x1, y1, color[i]
)#繪製初始中心點
x1 =
y1 =
for ind1 in clf.cluster_centers_:
try:1]
)0])
except
:pass
plt.plot(x1, y1,
"rv"
)#繪製中心
plt.show(
)#對資料降到2維,為了更好的表達和獲取更具代表性的資訊,在視覺化的時候一般先用pca進行降維,再使用tsne進行降維
pca = pca(n_components=4)
# 輸出兩維
newdata = pca.fit_transform(weight)
# 載入n維
from sklearn.manifold import tsne
newdata =tsne(2)
.fit_transform(newdata)
result =
list
(clf.predict(newdata)
)plot_cluster(result,newdata,numclass)
5文字溢位
文字溢位 overflow visible 預設值 hidden 超出隱藏 scroll 顯示滾動條 auto 自適應檢視 inherit 繼承父元素overflow值文字換行 white space normal 預設值 pre 原格式輸出,空白會被瀏覽器保留 pre wrap 文字不會換行,文字...
R語言做文字挖掘 Part3文字聚類
part3文字聚類 分類演算法 聚類演算法 文字分類聚類會要用到這些演算法去實現,暫時不用深究演算法細節,r中已經有成熟的可以直接呼叫的這些演算法了。大概說下分類和聚類的差異,照我的理解,分類演算法和聚類演算法最後實現的效果是相同的,都是給乙個集合劃分成幾個類別。不同的是分類演算法是根據已知的確定類...
Qt5 文字列印
列印的 如下 void imageprocessor showprinttext 注釋 if printdialog.exec 判斷列印對話方塊顯示後使用者是否單擊 列印 按鈕,若單擊 列印 按鈕,則相關列印屬性將可以通過建立qpringdialog物件時使用的qprinter物件獲得 若使用者單擊...