Machine learning 从文本到K-均值向量输入

Machine learning 从文本到K-均值向量输入,machine-learning,scikit-learn,data-mining,k-means,feature-extraction,Machine Learning,Scikit Learn,Data Mining,K Means,Feature Extraction,我刚刚开始钻研机器学习,特别是集群。(我正在使用Python,但这与此无关) 我的目标是,从一组关于时尚世界的推文(100K)开始,在他们的文本上执行KMeans 到现在为止,我已经过滤了文本,截断了停止词,无用的术语,标点符号;完成柠檬化(利用词性标记获得更好的结果) 我向用户展示了最常用的术语、hashtag、bigram、trigram……9gram,以便用户可以改进预处理,将单词添加到无用的术语中 我最初的想法是使用前n(1K)个术语作为特征, 创建固定大小n(1K)的foreach t

我刚刚开始钻研机器学习,特别是集群。(我正在使用Python,但这与此无关) 我的目标是,从一组关于时尚世界的推文(100K)开始,在他们的文本上执行KMeans

到现在为止,我已经过滤了文本,截断了停止词,无用的术语,标点符号;完成柠檬化(利用词性标记获得更好的结果)

我向用户展示了最常用的术语、hashtag、bigram、trigram……9gram,以便用户可以改进预处理,将单词添加到无用的术语中

我最初的想法是使用前n(1K)个术语作为特征, 创建固定大小n(1K)的foreach tweet向量 如果(此单元格的)顶部项出现在此tweet中,则将单元格设置为值(可能使用TFIDF计算单元格的值)

我是否遗漏了什么(将考虑0值)?我能以某种方式利用n-gram吗

这是相当笼统的,我不完全理解

(LSA降维有用吗?还是手动减少特征数量(因此向量降维)更好?

这包含文本k均值聚类的示例

但要解决您的一些具体问题:

我最初的想法是使用前n(1K)项作为特征,为每条tweet创建一个固定大小n(1K)的向量,如果(此单元格的)顶项出现在该tweet中,则将单元格设置为一个值(可能使用TFIDF计算单元格的值)

实现这一点的标准方法是使用sklearn并使用参数
min_df

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(min_df=10)
X = cv.fit_transform(texts)
上述代码将一系列文本转换为功能X。设置
min_df=10
将忽略出现次数少于10次的所有单词(据我所知,没有直接的方法说“取前1000个”,但这是等效的)

我能以某种方式利用n-gram吗

是的,CountVectorizer可以处理n-gram。<代码> ngracyLange参数指定要考虑的NGM的范围(开始n),结束n。比如说,

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)
将基于双字符而不是单个单词(单字符)构建功能。用于混合单图和双图

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
然后,可以用TfIdfVectorizer替换CountVectorizer,TfIdfVectorizer将字数转换为更具信息性的字数

LSA降维有用吗?还是手动减少特征数量(因此向量降维)更好

简而言之,这取决于你的目的。我上面提到的链接中的示例确实首先应用了LSA。但是,根据我的经验,像LSA或NMF这样的“主题模型”方法可以被认为是潜在语义主题的聚类。比如说,

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)
这将把特征X转换为20维的投影特征向量mu。每个维度d都可以解释为主题d中文本的分数。通过将每个样本分配给具有最大分数的维度,这也可以解释为聚类

这包含文本k-均值聚类的示例

但要解决您的一些具体问题:

我最初的想法是使用前n(1K)项作为特征,为每条tweet创建一个固定大小n(1K)的向量,如果(此单元格的)顶项出现在该tweet中,则将单元格设置为一个值(可能使用TFIDF计算单元格的值)

实现这一点的标准方法是使用sklearn并使用参数
min_df

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(min_df=10)
X = cv.fit_transform(texts)
上述代码将一系列文本转换为功能X。设置
min_df=10
将忽略出现次数少于10次的所有单词(据我所知,没有直接的方法说“取前1000个”,但这是等效的)

我能以某种方式利用n-gram吗

是的,CountVectorizer可以处理n-gram。<代码> ngracyLange参数指定要考虑的NGM的范围(开始n),结束n。比如说,

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)
将基于双字符而不是单个单词(单字符)构建功能。用于混合单图和双图

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
然后,可以用TfIdfVectorizer替换CountVectorizer,TfIdfVectorizer将字数转换为更具信息性的字数

LSA降维有用吗?还是手动减少特征数量(因此向量降维)更好

简而言之,这取决于你的目的。我上面提到的链接中的示例确实首先应用了LSA。但是,根据我的经验,像LSA或NMF这样的“主题模型”方法可以被认为是潜在语义主题的聚类。比如说,

cv = CountVectorizer(min_df=10, ngram_range=(2,2))
from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)
这将把特征X转换为20维的投影特征向量mu。每个维度d都可以解释为主题d中文本的分数。通过将每个样本分配给具有最大分数的维度,这也可以解释为聚类