2018-05-04 python實(shí)現(xiàn)brich文本層次聚類

利用brich實(shí)現(xiàn)文本層次聚類,將文本內(nèi)容分類

將相似的文本進(jìn)行聚類 然后選出同類中最具有代表的一條數(shù)據(jù)
輸入數(shù)據(jù):


data.png
  • 2.運(yùn)行結(jié)果如下,聚類前數(shù)據(jù)有9條 聚類后6條;
    字典key為類別,value是表示同一類別的index(text.dat中的行,從0開始) {0: [0, 1, 2], 1: [3, 4], 2: [5], 3: [6], 4: [7], 5: [8]}
    0,1,2被聚為一類 輸出了該類的中心點(diǎn)"吳亦凡陳偉霆“互懟“酷狗賽道TOP1學(xué)員壓軸來襲"。
    修改Birch(threshold=0.7,n_clusters=None)中的threshold參數(shù)可調(diào)整聚類效果


    result.png

參考:
https://blog.csdn.net/Eastmount/article/details/50473675?fps=1&locationNum=4

源碼:
https://github.com/codingMrHu/test_cluster

# coding=utf-8
import sys
import jieba
import numpy as np
from sklearn import feature_extraction    
from sklearn.feature_extraction.text import TfidfTransformer    
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import Birch
reload(sys)  
sys.setdefaultencoding('utf-8')

''' 
sklearn里面的TF-IDF主要用到了兩個函數(shù):CountVectorizer()和TfidfTransformer()砾跃。 
    CountVectorizer是通過fit_transform函數(shù)將文本中的詞語轉(zhuǎn)換為詞頻矩陣挺据。 
    矩陣元素weight[i][j] 表示j詞在第i個文本下的詞頻盐茎,即各個詞語出現(xiàn)的次數(shù)涧衙。 
    通過get_feature_names()可看到所有文本的關(guān)鍵字唤殴,通過toarray()可看到詞頻矩陣的結(jié)果哺窄。 
    TfidfTransformer也有個fit_transform函數(shù)捐下,它的作用是計(jì)算tf-idf值。 
'''

class Cluster():
    def init_data(self):
        # corpus = [] #文檔預(yù)料 空格連接
        corpus = []
        # f_write = open("jieba_result.dat","w")
        self.title_dict = {}
        with open('text.dat','r') as f:
            index = 0
            for line in f:
                title = line.strip()
                self.title_dict[index] = title
                seglist = jieba.cut(title,cut_all=False)  #精確模式  
                output = ' '.join(['%s'%x for x in list(seglist)]).encode('utf-8')       #空格拼接
                # print index,output
                index +=1
                corpus.append(output.strip())

        #將文本中的詞語轉(zhuǎn)換為詞頻矩陣 矩陣元素a[i][j] 表示j詞在i類文本下的詞頻  
        vectorizer = CountVectorizer()  
        #該類會統(tǒng)計(jì)每個詞語的tf-idf權(quán)值  
        transformer = TfidfTransformer()  
        #第一個fit_transform是計(jì)算tf-idf 第二個fit_transform是將文本轉(zhuǎn)為詞頻矩陣  
        tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  
        #獲取詞袋模型中的所有詞語    
        word = vectorizer.get_feature_names()
        #將tf-idf矩陣抽取出來萌业,元素w[i][j]表示j詞在i類文本中的tf-idf權(quán)重  
        self.weight = tfidf.toarray()
        # print self.weight

    def birch_cluster(self):
        print ('start cluster Birch -------------------' )
        self.cluster = Birch(threshold=0.6,n_clusters=None)
        self.cluster.fit_predict(self.weight)

        
    def get_title(self):
        # self.cluster.labels_ 為聚類后corpus中文本index 對應(yīng) 類別 {index: 類別} 類別值int值 相同值代表同一類
        cluster_dict = {}
        # cluster_dict key為Birch聚類后的每個類坷襟,value為 title對應(yīng)的index
        for index,value in enumerate(self.cluster.labels_):
            if value not in cluster_dict:
                cluster_dict[value] = [index]
            else:
                cluster_dict[value].append(index)
        print cluster_dict

        print ("-----before cluster Birch count title:",len(self.title_dict))
        # result_dict key為Birch聚類后距離中心點(diǎn)最近的title,value為sum_similar求和
        
        result_dict = {}
        for indexs in cluster_dict.values():
            latest_index = indexs[0]
            similar_num = len(indexs)
            if len(indexs)>=2:
                min_s = np.sqrt(np.sum(np.square(self.weight[indexs[0]]-self.cluster.subcluster_centers_[self.cluster.labels_[indexs[0]]])))
                for index in indexs:
                    s = np.sqrt(np.sum(np.square(self.weight[index]-self.cluster.subcluster_centers_[self.cluster.labels_[index]])))
                    if s<min_s:
                        min_s = s
                        latest_index = index

            title = self.title_dict[latest_index]

            result_dict[title] = similar_num
        print ("-----after cluster Birch count title:",len(result_dict))
        for title in result_dict:
            print title,result_dict[title]
        return result_dict
    
    def run(self):
        self.init_data()
        self.birch_cluster()
        self.get_title()

if __name__=='__main__':
    cluster = Cluster()
    cluster.run()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末生年,一起剝皮案震驚了整個濱河市婴程,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抱婉,老刑警劉巖档叔,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒸绩,居然都是意外死亡衙四,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門患亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來传蹈,“玉大人,你說我怎么就攤上這事〉虢纾” “怎么了挑格?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沾歪。 經(jīng)常有香客問我恕齐,道長,這世上最難降的妖魔是什么瞬逊? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任显歧,我火速辦了婚禮,結(jié)果婚禮上确镊,老公的妹妹穿的比我還像新娘士骤。我一直安慰自己,他們只是感情好蕾域,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布拷肌。 她就那樣靜靜地躺著,像睡著了一般旨巷。 火紅的嫁衣襯著肌膚如雪巨缘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天采呐,我揣著相機(jī)與錄音若锁,去河邊找鬼。 笑死斧吐,一個胖子當(dāng)著我的面吹牛又固,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播煤率,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼仰冠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝶糯?” 一聲冷哼從身側(cè)響起洋只,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昼捍,沒想到半個月后识虚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡端三,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年舷礼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊闯。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出团赁,到底是詐尸還是另有隱情育拨,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布欢摄,位于F島的核電站熬丧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怀挠。R本人自食惡果不足惜析蝴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绿淋。 院中可真熱鬧闷畸,春花似錦、人聲如沸吞滞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裁赠。三九已至殿漠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佩捞,已是汗流浹背绞幌。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留一忱,地道東北人啊奄。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像掀潮,于是被迫代替她去往敵國和親菇夸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359