クラスタリングの概要
実装根拠は以下を参照してください。
K-means++
K-means
英語ですけど日本語のページより情報量が多くまた厳密性があると思います。
scikit-learn の概要
Python で機械学習のあれこれをできる超便利なライブラリです。この辺を読んでください。
前提
入力ファイルとして文字列ごとに改行で区切られたテキストファイルを想定します。
使い方としては python clustering.py input.txt output.txt のように引数に入出力ファイルを指定します。
途中 print() で途中結果を表示しています。
出力ファイルにクラスタリング後のデータが出力されます。
ぜひ適当なテキストファイルを用意して実際に動かしてみてください。
実装
コード全体は以下の通りです。
クラスタを生成するメソッドのみを引用します。
clustering.py
def make_cluster(self):
""" クラスタを生成して返す
"""
# 処理対象の文字列によるリストを生成する
texts = self._read_from_file()
print("texts are %(texts)s" %locals() )
# TF-IDF ベクトルを生成する
vectorizer = TfidfVectorizer(
max_df=self.max_df,
max_features=self.max_features,
stop_words='english'
)
X = vectorizer.fit_transform(texts)
print("X values are %(X)s" %locals() )
# KMeans インスタンスを生成しクラスタリングする
# パラメータはデータの量や特性に応じて適切なものを与えるようにする
km = MiniBatchKMeans(
n_clusters=self.num_clusters,
init='k-means++', batch_size=1000,
n_init=10, max_no_improvement=10,
verbose=True
)
km.fit(X)
labels = km.labels_
# 属するクラスタとその距離を計算する
transformed = km.transform(X)
dists = np.zeros(labels.shape)
for i in range(len(labels)):
dists[i] = transformed[i, labels[i]]
clusters = []
for i in range(self.num_clusters):
cluster = []
ii = np.where(labels==i)[0]
dd = dists[ii]
di = np.vstack([dd,ii]).transpose().tolist()
di.sort()
for d, j in di:
cluster.append(texts[int(j)])
clusters.append(cluster)
# 生成したクラスタを返す
return clusters
考察
scikit-learn を利用することにより、きわめて簡素なコードでクラスタリングができることがわかりますね。
多種多様なパラメータが随所で利用されます。
実アプリケーションの利用ではデータの特性にあわせてこれらをチューニングしていくことが求められます。