文字の頻度と2-gram, 3-gramくらいまでを特徴量にすれば良いでしょう。あとはグループ分けなので、クラスタリング系のアルゴリズムを使うことになります。
sklearnだけでできると思います。
sklearn.feature_extraction.text.CountVectorizer — scikit-learn 0.20.3 documentation
sklearn.feature_extraction.DictVectorizer — scikit-learn 0.20.3 documentation
sklearn.cluster.KMeans — scikit-learn 0.20.3 documentation
追記
やってみたら鼻歌交じりで五分のコーディングでした。簡単すぎるかも。
python
1import pandas as pd
2from sklearn.feature_extraction.text import CountVectorizer
3from sklearn.cluster import KMeans
4
5def main():
6 data = ["abc-123-S-1",
7 "abc-151521-S1",
8 "acd-321-SF-1",
9 "abc-213-S-1",
10 "abc151512-S1"]
11 cv = CountVectorizer(lowercase=False, analyzer="char",
12 ngram_range=(1, 3))
13 X = cv.fit_transform(data)
14
15 km = KMeans(n_clusters=3)
16 y = km.fit_predict(X)
17 df = pd.DataFrame({"data":data, "cluster":y})
18 for cluster_i, x in df.groupby("cluster"):
19 print("cluster:", cluster_i)
20 print(x)
21
22if __name__ == "__main__":
23 main()
24
25""" =>
26cluster: 0
27 cluster data
282 0 acd-321-SF-1
29cluster: 1
30 cluster data
311 1 abc-151521-S1
324 1 abc151512-S1
33cluster: 2
34 cluster data
350 2 abc-123-S-1
363 2 abc-213-S-1
37"""
38
今思いついた注意点ですが、データ数が1万もあるときっとそれなりに高次元の特徴量になるので、min_df
を指定して削った上でPCAとかで次元を落とさないと速度の面で実用的ではないかもしれません。あとはクラスタリング周りはいろいろ手法やパラメータ(含むクラスタ数)を試行錯誤した上で、結果が出たならその妥当性も何らかの方法で検証するべきでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/18 05:09
2019/03/18 23:47