我正在尝试使用k-means聚类来分类文本文档。是否有可能采取一组文件来对它们进行矢量化并执行计算,然后添加更多要分类的文档?
这是我到目前为止所拥有的
true_k = 4
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
model.fit(X)
我如何向X添加更多文档?因为我想腌制X并保存它。
答案 0 :(得分:2)
实际上这很简单(对接受的答案有所设想,这表明这很复杂 - 事实并非如此)。只需连接您的数据,并重复使用相同的矢量化工具(如果您创建新的数据库,或者按照接受的答案中的建议重新设置旧数据,它将更改其估算值和因此你将得到不同的特征空间),因此你也必须腌制它
true_k = 4
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
model.fit(X)
现在您获得新数据,文档2并且只需
X2 = vectorizer.transform(documents2)
X = np.vstack((X, X2))
model.fit(X) # optimally you would start from the previous solution, but sklearn does not yet support it
但是,请记住,这假设您的第一批文档已经代表整个数据集。换句话说,您将自己限制在第一个文档中的单词,并且不会重新设置idf规范化。您实际上可以删除这两个限制,但您必须实现自己的 - 在线tfidf矢量化器,它可以更新其估计值。这并不难,但你必须(在每批新文件之后)也更新以前的文件(因为idf部分会改变)。更简单的解决方案是只保留计数器并更新它,并计算" idf"独立地部分并将其应用于顶部(就在kmeans之前)。
答案 1 :(得分:0)
问题在于X
形状为[n_docs, n_features
的{{1}}特征矩阵。因此,如果使用新文档创建新的要素矩阵,则必须确保新要素矩阵(X2
)具有与X
完全相同的要素。我无法在可行的情况下对应用程序进行成像。
但是如果您知道两者具有相同的功能空间,则可以使用scipy.sparse.vstack
将新文档附加到您的要素矩阵中:
from scipy.sparse import vstack
X = vstack((X, X2))
编辑:要确保X2
中的相同功能空间,您可以使用vocabulary
中的TfidfVectorizer
关键字参数,例如:
vectorizer = TfidfVectorizer(stop_words='english')
vectorizer = vectorizer.fit(documents)
X = vectorizer.transform(documents)
# do whatever with X
new_vectorizer = TfidfVectorizer(stop_words='english', vocabulary=vectorizer.vocabulary_)
X2 = vectorizer.fit_transform(new_documents)
X = vstack((X, X2))
这意味着,除了保存X
之外,您还需要存储vectorizer.vocabulary_
。