NLP NO5 文字聚類

2021-09-26 12:41:29 字數 4056 閱讀 6936

語料載入->分詞->去停用詞->抽取詞向量模型特徵->基於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物件獲得 若使用者單擊...