【发布时间】:2017-08-07 03:07:28
【问题描述】:
我有一个 非常小 的 短字符串 列表,我想要 (1) 进行聚类并 (2) 使用该模型来预测新字符串属于哪个聚类.
运行第一部分工作正常,获得新字符串的预测则不行。
第一部分
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
# List of
documents_lst = ['a small, narrow river',
'a continuous flow of liquid, air, or gas',
'a continuous flow of data or instructions, typically one having a constant or predictable rate.',
'a group in which schoolchildren of the same age and ability are taught',
'(of liquid, air, gas, etc.) run or flow in a continuous current in a specified direction',
'transmit or receive (data, especially video and audio material) over the Internet as a steady, continuous flow.',
'put (schoolchildren) in groups of the same age and ability to be taught together',
'a natural body of running water flowing on or under the earth']
# 1. Vectorize the text
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(documents_lst)
print('tfidf_matrix.shape: ', tfidf_matrix.shape)
# 2. Get the number of clusters to make .. (find a better way than random)
num_clusters = 3
# 3. Cluster the defintions
km = KMeans(n_clusters=num_clusters, init='k-means++').fit(tfidf_matrix)
clusters = km.labels_.tolist()
print(clusters)
返回:
tfidf_matrix.shape: (8, 39)
[0, 1, 0, 2, 1, 0, 2, 0]
第二部分
失败的部分:
predict_doc = ['A stream is a body of water with a current, confined within a bed and banks.']
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(predict_doc)
print('tfidf_matrix.shape: ', tfidf_matrix.shape)
km.predict(tfidf_matrix)
错误:
ValueError: Incorrect number of features. Got 7 features, expected 39
FWIW:我有点理解,训练和预测在矢量化后具有不同数量的特征......
我对任何解决方案持开放态度,包括从 kmeans 更改为更适合短文本聚类的算法。
提前致谢
【问题讨论】:
-
您正在为预测任务训练一个新的 tfidfvectorizer。因此它会生成一组不同的特征。您应该使用原始的 tfidf_vectorizer
-
@VivekKumar 当然:)。呃。这就说得通了。 [stackoverflow.com/a/26943563/6041010]
标签: python-3.x scikit-learn nlp k-means