这里有两个相关(但在技术方面不同)的问题;第一个是与此数据的聚类技术的选择有关。
第二个谓词问题与数据模型有关——即,对于原始数据中的每个句子,如何将其转换为适合输入到聚类算法的数据向量。
聚类技术
k-means 可能是最流行的聚类技术,但还有很多更好的;考虑 k-kmeans 的工作原理:用户从数据中选择少量数据点(k-means 算法中初始迭代的聚类中心,又名 centroids)。接下来,确定每个数据点与该组质心之间的距离,并将每个数据点分配给它接近的质心;然后根据分配给同一簇的数据点的平均值确定新的质心。重复这两个步骤,直到达到某个收敛标准(例如,在两次连续迭代之间,质心组合移动低于某个阈值)。
更好的聚类技术不仅仅是移动聚类中心——例如,光谱聚类技术旋转和拉伸/压缩数据以找到单个然后,最大方差轴确定与原始轴正交且彼此正交的附加轴 - 即转换后的特征空间。 PCA(主成分分析)、LDA(线性判别分析)和kPCA都是这个类的成员,其定义特征是为原始数据或协方差矩阵中的每个特征计算特征值/特征向量对。 Scikit-learn 有一个PCA computation 的模块。
数据模型
正如您所观察到的,从非结构化文本数据构建数据模型的常见困境是为整个语料库中的每个单词(减去停用词)包含一个特征,这通常会导致数据集(即每个句子仅包含所有句子中总单词的一小部分,因此每个数据向量都是稀疏的;另一方面,如果对语料库进行修剪,例如仅将前 10% 的单词用作特征,那么 some/许多句子具有完全未填充的数据向量。
以下是帮助解决此问题的一种常见技术序列,考虑到您的数据,这可能特别有效:使用 的常见处理序列将相关术语组合成一个术语规范化、词干化和同义化。
这是直观的:例如,
Normalize:将所有单词转换为小写(Python字符串有lower方法,所以
REquired.lower()
显然,这会阻止 Required、REquired 和 required 在您的数据向量中包含三个独立的特征,而是将它们折叠成一个单项。
Stem:在词干提取之后,required、require和requiring,被折叠成一个单一的标记,requir.
两个最常见的词干分析器是 Porter 和 Lancaster 词干分析器(下面讨论的 NLTK 两者都有)。
Synonymize:像 fluent、capable 和 skilled 这样的术语,根据上下文,都可以是通过在一个常见的同义词列表中进行标识,折叠为一个术语。
优秀的 Python NLP 库,NLTK (至少)有几个优秀的同义词汇编,或数字词库(词库?)来帮助你完成所有三个这些,以编程方式。
例如,nltk.corpus.reader.lin 是一个(只有一个,NLTLK 中至少还有几个同义词查找器),并且使用简单——只需导入此模块并调用 同义词 ,传入一个术语。
NLTK 的stem package 中有多个词干分析器。