sklearn 譜聚類與文本挖掘初步(一)

有關雙聚類的論述。
產生雙聚類的數據可以使用函數,
sklearn.datasets.make_biclusters(shape = (row, col), n_clusters, noise, \
shuffle, random_state)
n_clusters 指定聚類數據產生的個數, noise指定使用的Gaussian噪聲的標準差。
其返回的是一個元組,即生成的數據,不同類的行標,不同類的列標。


from sklearn.datasets import sample_generator as sg 
sg.shuffle_執行混亂方法,將原數據進行重排。
從其具體實現上可以看出,下面進行重排代碼的功能是類似的:


def _shuffle(data, random_state=None):
    generator = check_random_state(random_state)
    n_rows, n_cols = data.shape
    row_idx = generator.permutation(n_rows)
    col_idx = generator.permutation(n_cols)
    result = data[row_idx][:, col_idx]
    return result, row_idx, col_idx




sklearn.cluster.bicluster.SpectralCoclustering
實現雙聚類的主要算法,給算法fit後,可以調用model.biclusters得到雙聚類的
相應各類下標元組。
model.row_labels_ 及 model.column_labels_分別返回行列下標,當
對其進行重排時,可以返回幾個按序分割的雙聚類圖片。(np.argsort)


下面是示例代碼:
import numpy as np 
from matplotlib import pyplot as plt 


from sklearn.datasets import make_biclusters 
from sklearn.datasets import samples_generator as sg 
from sklearn.cluster.bicluster import SpectralCoclustering 
from sklearn.metrics import consensus_score


data, rows, columms = make_biclusters(shape = (300, 300), n_clusters = 5, noise = 5, \
shuffle = False, random_state = 0)


plt.matshow(data, cmap = plt.cm.Blues)
plt.title("Original datasets")


data, row_idx, col_idx = sg._shuffle(data, random_state = 0, ) 
plt.matshow(data, cmap = plt.cm.Blues)
plt.title("Shuffled datasets")


model = SpectralCoclustering(n_clusters = 5, random_state = 0)
model.fit(data)
score = consensus_score(model.biclusters_, (rows[:, row_idx], columms[:, col_idx]))


print "consensus_score: {:.3f}".format(score)




fit_data = data[np.argsort(model.row_labels_)]
fit_data = fit_data[:, np.argsort(model.column_labels_)]


plt.matshow(fit_data, cmap = plt.cm.Blues)
plt.title("After biclustering; rearranged to show biclusters")


plt.show()




將上面的n_clusters換爲二維數組所得到的相應結果就是分塊爲非對角線的形式,是更爲
一般化的分類方法。(雖然也屬雙聚類),相關的函數可以參考下面的函數及相關,
較爲容易的方式
SpectralBiclustering




Python默認的正則表達式僅僅能夠匹配ascii編碼所規定的若干字符,要想將其擴展爲更爲一般的
Unicode需要特別聲明,如re.compile(u'(?u)\\b\\w\\w+\\b')
中的(?u)就將相應的字符集擴充爲Unicode字符集。(擴大匹配範圍)
也就是說這個規定是指向Python2的正則表達式的,Python3對於Unicode是默認匹配。


\b用於匹配單詞字符\w i.e.[A-Za-z0-9_]與非單詞字符\W之間的字符,
此正則表達式的作用在於匹配至少要有兩位數字或字符\\w\\w+,對於僅有一位的情況
\w或直接匹配更多位的情況\w+是一種排除。


def number_aware_tokenizer(doc):
token_pattern = re.compile(u'(?u)\\b\\w\\w+\\b')
tokens = token_pattern.findall(doc)
tokens = ["#NUMBER" if token[0] in "0123456789_" else token for token in tokens]


return tokens




該函數完成對於在doc中首字母爲'_'或數字的以 ‘#NUMBER’來替換,否則保持的方法,


這裏有一些一般性的概念,但基本上token可以看做是對於字符串流的一些提取,不要深究。


這裏有一個有關stop_words的相關處理,停詞指沒有意義的詞, 
通過Python包 stop-words可以將英文中常用的停詞取出, 如:
from stop_words import get_stop_words 
get_stop_words("english")
會返回英語中常用的停詞。
這涉及文本挖掘數據預處理中的數據清洗。
下面會考慮上面的算法在文本挖掘中的應用,細節餘後作爲討論。
發佈了28 篇原創文章 · 獲贊 23 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章