1、 排序去重,經過排序去重後資料從10萬條變為3萬條。
2、 結巴分詞。
3、 特徵提取,使用平滑後的tf-idf作為特徵,為每個使用者問題構建特徵向量,採用了scikit-learn 中的類 tfidfvectorizer。
4、 採用了兩種聚類方法k-means 。
k-means:演算法的優點是收斂速度快,缺點是聚類形狀在空間中是凸的。
github**:
from sklearn.feature_extraction.text import tfidfvectorizer
import jieba
from sklearn.cluster import kmeans
# 輸入輸出檔案
fin =
open
('user_question.txt'
,'r'
)# 需要聚類的語料,每行乙個句子
fout =
open
('result.txt'
,'w'
)# 聚類後的結果,格式:label + '\t' + sentence
# 結巴分詞
user_question =
lines = fin.readlines(
)for line in lines:
line = line.strip(
) words = jieba.cut(line)
' '.join(words)
)print
"fenci over"
# 使用tf-idf提取特徵
vectorizer = tfidfvectorizer(max_df=
0.9,min_df=3)
vector = vectorizer.fit_transform(user_question)
# 使用kmeans演算法聚類,init:初始值選擇的方式,n_init:用不同的初始化質心執行演算法的次數
db = kmeans(n_clusters=
10, init=
'k-means++'
, n_init=10)
db.fit(vector)
labels = db.labels_
# 將結果寫入檔案
for i,line in
zip(labels, lines)
: fout.write(
str(i)
+'\t'
+ line)
for i,line in
zip(labels, lines)
: fout.write(
str(i)
+'\t'
+ line)
# 統計輸出每一類的數量
from collections import counter
counter(labels)
0:積分 804
1:金幣 3862
2:如何…… 915
3:祝福、祝願 552
4:話費 1466
5:較為雜亂,看不出是什麼主題 13729
6:流量 3906
7:怎麼…… 3009
8:心願+希望…574
9:** 2618
觀察了下聚類結果,大概是可接受和可用的,基於聚類語料的性質,名詞型的類別較為可信和可用,比如0,1,3,4,6,8,9這七類是比較靠譜的,而2,5,7這三類則較為雜亂,觀察之後看不出是什麼主題,尤其是第5類,主題不明,而且資料量佔到了總資料量的1/3。
造成以上結果的原因是:使用tf-idf作為特徵,只考慮了詞頻,沒有考慮語義資訊,這一點從聚類結果可以觀察出,可以嘗試使用word2vec方法來提取特徵。
(1)tfidf後使用nmf進行主題提取,再用kmeans聚類。
聚類後的觀察結果:從結果看還不如之前的方法。
0:亂七八糟
1:取消
2:怎麼
3:可以
4:金幣
5:**
6:什麼
7:亂七八糟
8:話費
9:為什麼
(2)countvectorizer後使用lda進行主題提取,再用kmeans聚類。
聚類後的觀察結果:從結果看還不如nmf方法,每個主題都不明確,亂七八糟。
(3)用bert提取每句話的cls特徵,然後用kmeans聚類。
聚類後的觀察結果:從結果看還不如nmf方法,每個主題都不明確,亂七八糟。
(4)限定詞性,比如只保留句子中的名詞,因為我們關心的是名詞性的類別,再使用tfidf提取特徵,最後使用kmeans聚類。這種方法還沒有嘗試。
以上這些方法可能在我的語料中不適用,但不代表在其他語料不適用,大家可以多多嘗試。
文字聚類 用k means對文字進行聚類
coding utf 8 created on thu nov 16 10 08 52 2017 author li pc import jieba from sklearn.feature extraction.text import tfidfvectorizer from sklearn.cl...
python文字聚類 對一列文字進行聚類
1.需求 乙個txt文件,如下圖。大概幾萬行資料,但是沒有歸類,要人工歸類的話耗時耗力,打算用文字聚類的方法對txt裡面的每條資料自動分類。2.參考 主要參考 3.encoding utf 8 import numpy as np import pandas as pd import re impo...
短文本聚類方法
短文本聚類方法 在拿到乙個大規模資料集時,我們不可能對這麼多的問題進行注意打上標記 label 因為這個是非常耗時的。而且,我們還知道文字問題是乙個典型的多標記問題,這個時候打上的標記很多的時候都不會特別的精確,也就是我們通常說的弱標記weak label.這個時候我們就需要乙個聚類的方法,這樣可以...