我是群集的新手,需要一些有关如何解决此问题的建议......
我们说我有成千上万的句子,但样本中的一些可能是:
为了将这些最佳方式聚类,我可以采取什么方法?
我使用单词矢量查看k-means,但是当我有数千个句子可能都包含不同的单词时,构建这个大小的矢量是否有效,然后通过每个试图查看哪个句子有那些话?
我还没有找到其他哪些方法?
到目前为止我做了什么:
答案 0 :(得分:6)
这里有两个相关(但技术明确不同)的问题;第一个是关于这个数据的聚类技术的选择。
第二个谓词问题涉及数据模型 - 即,对于原始数据中的每个句子,如何将其转换为适合输入到聚类算法的数据向量。
群集技术
k-means可能是最流行的聚类技术,但有很多更好的技术;考虑k-kmeans如何工作:用户从数据中选择少量数据点(k-means算法中初始迭代的聚类中心,又名 centroids )。接下来,确定每个数据点和质心集之间的距离,并且分配给它的质心的每个数据点都关闭;然后,根据分配给同一群集的数据点的平均值确定新的质心。重复这两个步骤直到达到一些收敛标准(例如,在两次连续迭代之间,质心组合运动低于某个阈值)。
更好的聚类技术不仅仅是移动聚类中心 - 例如, 谱聚类 技术旋转和拉伸/挤压数据以找到单个然后,最大方差轴确定与原始轴和彼此正交的附加轴 - 即,变换的特征空间。 PCA (主成分分析), LDA (线性判别分析)和 kPCA 是该类的所有成员,其定义特征是为原始数据或协方差矩阵中的每个特征计算特征值/特征向量对。 Scikit-learn有一个PCA computation的模块。
数据模型
正如您所观察到的,从非结构化文本数据构建数据模型的常见困境包括整个语料库中每个单词的一个特征(减去停止词)通常会导致数据集的稀疏度非常高(即每个句子)因此,每个数据向量仅包含所有句子中的一小部分,因此每个数据向量都是稀疏的;另一方面,如果修剪语料库以便例如仅将前10%的单词用作特征,则一些/许多句子都有完全无人居住的数据向量。
以下是帮助解决此问题的一种常见技术序列,根据您的数据,这些技术可能特别有效:使用 的通用处理顺序将相关术语合并为单个术语规范化 , 阻止 和 同义词 。
这很直观:例如,
规范化:将所有单词转换为小写(Python字符串的方法较低,所以
REquired.lower()
显然,这会阻止必需,需要和必需在数据向量中包含三个单独的功能,而是将它们折叠为单学期。
Stem :阻止后,必需,需要,需要,折叠为单个令牌, requir
两种最常见的词干分析器是Porter和Lancaster词干分析器(NLTK,下面讨论过,两者都有)。
同义词:流利,能力和熟练等词语,可以根据具体情况而定通过识别共同的同义词列表,将其折叠为单个术语。
优秀的Python NLP库, NLTK (至少)有几个优秀的同义词汇编,或数字同义词库(叙词表?)来帮助您完成所有工作其中三个,以编程方式。
例如,nltk.corpus.reader.lin是一个(只有一个,NLTLK中至少有几个同义词查找器),并且使用起来很简单 - 只需导入此模块并调用同义词通过一个学期。
多个词干分析符在NLTK的stem package中。
答案 1 :(得分:4)
我实际上最近刚刚在Python中整理了一个文档聚类指南。我建议使用k-means和潜在dirichlet分配的组合。看一看,如果我能进一步解释一下,请告诉我:http://brandonrose.org/clustering