文字聚類學習過程簡述

2021-09-19 09:11:56 字數 3701 閱讀 3589

1.去空格,換行符,去停用詞

def delstopwordslist(classsstr):

stopwords = [line.strip() for line in open('stop.txt', encoding='utf-8').readlines()]

outstr = ''

classsstr=classsstr.split(' ')

for word in classsstr:

if word not in stopwords:

outstr += word

outstr += ' '

return outstr

2.jieba分詞

for i in filenames:

single_text_content = ''

with open(path+'/'+i,"r",encoding='utf-8') as f:

for centence in f.readlines():

centence = centence.strip().replace(' ', '').replace(' ', '') #去除每一句中的空格等

single_text_content += centence

text = ' '.join(jieba.cut(single_text_content)) #分詞

# jieba.cut會返回乙個# '空格'.join(generator物件) 將generator物件以空格連線生成乙個新的字串

注意:在文字處理時,需要先分詞,再去停用詞。

1.counter()方法

import collections

sorted_words_dict = collections.counter(seg_list)

2.自定義函式

def count_word(classstr):    

result={}

for word in classstr.split():

if word not in result:

result[word]=0

result[word]+=1

return result

1.python自帶sorted函式

result=sorted(字典名.items(),key=lambda k:k[1],reverse=true)
2.collections庫counter方法

import collectionssorted_words_dict = collections.counter(字典名)   #統計詞頻

result = sorted_words_dict.most_common(100)

#前100出現頻率最高的元素以及他們的次數,返回型別是列表裡面巢狀元組

3.pythom堆排序模組heapq

import heapq

result=heapq.nlargest(100,字典名.items(),key=lambda k:k[1])

其排序速度都差不多,但推薦使用和掌握counter方法

1.統計每個大類(假設分為3類)的文字的詞+詞頻(前20),將3類文字詞頻求並集(獲得其詞袋模型)(假設求並集後長度為55)(求並集方法:set(字典x).union(字典y)),之後存入乙個1*55列表1中。

2.統計每篇文字的詞+詞頻(比如前60),並為每篇文字構建乙個1*60列表2,將每篇文字中提取的詞頻前60的詞存入。

3.得到每篇文字中的與每個大類匹配的1*55列表3

可以這樣想,如果乙個屬於體育類的文字特徵構建的列表,它與全文本特徵中體育大類特徵匹配就會高,則所得到的列表3在體育類的20個列中值就較其他而言更大

例如:

或者(僅求取詞的權重方式不同):

詳細講解見 機器學習sklearn19.0聚類演算法——kmeans演算法

假設輸入t個樣本矩陣,將其分為n類,其步驟為:

1.選擇初始化n個類別中心a1,a2…an;

2.計算每個樣本矩陣與每個類別中心的距離,將樣本矩陣標記為距離最近的類別中心的類別

距離計算方式:閔科夫斯距離 標準化歐式距離 夾角余弦相似度 kl距離 傑卡德相關係數 pearson相關係數

3.更新n個類別中心點為 被標記為該類別樣本的平均值

4.重複2,3步驟,直到達到某些終止條件

過程如圖所示:

簡單來說kmeans會按我們設定的類別,將所有樣本(矩陣)相似度高的歸為一類,最後返回標記的矩陣

例如:

或者具體的k-means庫的各種方法,引數大家就自己了解咯

但是,這樣資料得到的效果總是不太理想,因為我們僅依靠詞頻來獲取每篇文章/每類文章的特徵的方式,得到的結果是不太準確的

比如我們通過詞頻獲取一篇體育類文字的特徵時:

這其中會有很多沒有區別意義的詞和一些單字

如何獲取更為具有特徵意義的詞,便成為了關鍵

tf即詞頻,反應了乙個詞在該文字**現的頻率

idf即逆文字頻率,反應了乙個詞在所有文字**現的頻率,如果乙個詞很多的文字**現,那麼它的idf值就會偏低

將tf x idf,即得到乙個詞真正的重要性,這排除了許多沒有特徵性卻頻率高的詞

統計每篇文字的tf-idf高的詞,和每個大類中tf-idf高的詞(具體使用方式大家就自己了解咯)

from sklearn.feature_extraction.text import tfidftransformer

from sklearn.feature_extraction.text import countvectorizer

vectorizer=countvectorizer() #生成該類會將文字中的詞語轉化為詞頻矩陣

tranceformer=tfidftransformer() #該類能計算每個詞語的t-idf值

tfidf=tranceformer.fit_transform(vectorizer.fit_transform(文字list))

word=vectorizer.get_feature_names() #獲取所有詞語的列表

#print(type(word))=list

weight=tfidf.toarray() #獲取詞語的權重列表

通過tf-idf得到的一篇體育類文字的特徵詞如下:

之後,通過kmeans聚類,就能得到極好的效果

聚類簡述 機器學習

k均值演算法 k means algorithm 用 1,2,k 來表示聚類中心 用c i i 1,m 來儲存與第 i 個樣本資料x i 最近的聚類中心的索引 先隨機初始化聚類中心 演算法的兩個重要迴圈 第乙個for迴圈,計算每個樣本資料x i 距離哪乙個聚類中心近,即 對於每個樣本資料x i 計算...

聚類 簡述高維資料聚類

concept 聚類其實就是講乙個物件的集合分為由相似物件組成的多個類的過程。聚類與分類的區別在於,聚類劃分的類是不確定的,需要自身進行相似性比較,並且確定劃分的類。一般而言,對於聚類演算法的要求還是比較高的。而對於高維資料聚類的聚類演算法主要有兩種 子空間聚類 subspace clusterin...

文字聚類 用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...