基于改进LSA的文档聚类算法
- 格式:pdf
- 大小:203.05 KB
- 文档页数:4
基于文本相似度计算的文本聚类算法研究与实现文本聚类是一种将文本数据分组为相似群体的机器学习方法。
在本文中,我们将研究和实现一种基于文本相似度计算的文本聚类算法。
这个算法将根据文本之间的相似性将文本数据分成多个群体,并且可以应用于多个领域,如文本分类、信息检索和推荐系统。
一、文本相似度计算最简单的方法是使用词袋模型。
我们将所有文本中的词语构建一个词表,然后对文本进行向量化,其中向量中的每个元素表示对应词语的出现次数。
然后,我们可以使用余弦相似度计算两个文本向量之间的相似性。
二、文本聚类算法1.数据预处理:首先,我们需要对原始文本数据进行预处理,包括去除无用的标点符号、停用词和数字。
我们还可以进行词干提取或词形还原,以减少特征数量和词语形态的差异。
2. 特征提取:在该步骤中,我们将每个文本转化为向量表示。
我们可以使用词袋模型,或者更高级的词嵌入模型(如Word2Vec或BERT)来提取有意义的特征。
3.相似度计算:使用选择的文本相似度度量方法计算每个文本对之间的相似度。
我们可以通过计算所有文本对的相似度矩阵来加快计算过程。
4.聚类算法:在此步骤中,我们将使用聚类算法将相似文本分组到不同的簇中。
常见的聚类算法包括层次聚类、K均值聚类和谱聚类。
我们可以根据应用场景和数据特点选择适合的聚类算法。
5. 聚类评估:在文本聚类过程中,我们需要评估聚类的质量。
常见的评估指标包括轮廓系数、互信息和F-measure。
三、算法实现我们可以使用Python中的机器学习库进行文本聚类算法的实现。
首先,我们可以使用NLTK或Spacy等工具进行文本的预处理工作。
接下来,我们可以使用sklearn库来实现特征提取、相似度计算和聚类算法。
最后,我们可以使用scikit-learn库中的评估指标来评估聚类的质量。
在实际应用中,我们可以通过调整预处理、特征提取和聚类算法的参数来优化文本聚类的性能。
我们还可以选择合适的聚类算法和相似度度量方法来适应不同的数据特点和领域。
一种改进的基于潜在语义索引的文本聚类算法侯泽民;巨筱【期刊名称】《计算机与现代化》【年(卷),期】2014(000)007【摘要】提出一种改进的基于潜在语义索引的文本聚类算法。
算法引入潜在语义索引理论,改进传统的SOM算法。
用潜在语义索引理论表示文本特征向量,挖掘文本中词与词之间隐藏的语义结构关系,从而消除词语之间的相关性,实现特征向量的降维。
改进传统的SOM算法的局限性,准确给出聚类类别数目的值。
实验结果表明,本算法的聚类效果更好,聚类时间更少。
%This paper presents an improved text clustering algorithm based on latent semantic indexing .This algorithm introduces the theory of latent semantic index , improves the traditional SOM algorithm .By using the latent semantic indexing text feature vector representation theory , we mine the semantic structure relationships hidden among the words in text , thereby eliminating the correlation among words , to reduce the feature vector dimension .The limitations of the traditional SOM algorithm are improved to accurately give the number of clustering classes .Experimental results show that the clustering effect of this algorithm is better , and the clustering time is less .【总页数】4页(P24-27)【作者】侯泽民;巨筱【作者单位】郑州科技学院信息工程学院,河南郑州 450064;郑州科技学院信息工程学院,河南郑州 450064【正文语种】中文【中图分类】TP182【相关文献】1.基于潜在语义索引的SVM文本分类模型 [J], 郭武斌;周宽久;张世荣2.一种基于本体论和潜在语义索引的文本语义处理方法 [J], 秦春秀;刘怀亮;赵捧未3.改进的概率潜在语义分析下的文本聚类算法 [J], 张玉芳;朱俊;熊忠阳4.基于潜在语义索引的文本特征词权重计算方法 [J], 李媛媛;马永强5.使用基于SVM的局部潜在语义索引进行文本分类 [J], 张秋余;刘洋因版权原因,仅展示原文概要,查看原文内容请购买。
自然语言处理(NLP)是一门涉及计算机和人类语言之间交互的领域。
在NLP 中,文本聚类算法被广泛应用于文本分类、信息检索、情感分析等任务中。
文本聚类算法旨在将文本数据按照其语义和主题进行分组,以便对大量文本数据进行有效的管理和分析。
一、K均值聚类算法K均值聚类是一种常见的文本聚类算法,其核心思想是将文本数据分为K个不重叠的簇。
首先随机选择K个点作为初始的簇中心,然后将每个文本样本分配到最近的簇中心。
接着重新计算每个簇的中心点,直到簇中心不再发生变化或者达到预定的迭代次数。
K均值算法的优点是简单易实现,但在处理大规模文本数据时,对初始点的选择十分敏感,容易陷入局部最优解。
二、层次聚类算法层次聚类是一种基于树状结构的聚类方法,它不需要事先确定簇的数量。
层次聚类算法将文本数据进行逐层划分,直至达到指定的停止条件。
其中,自底向上的凝聚层次聚类算法将每个文本样本视为一个单独的簇,然后逐步合并最相似的簇,直至所有样本被合并为一个簇。
相比于K均值算法,层次聚类算法能够更好地处理噪声和异常值,但其计算复杂度较高,不适用于大规模数据集。
三、基于密度的聚类算法基于密度的聚类算法是一种根据样本的密度来划分簇的方法,常见的算法包括DBSCAN和OPTICS。
这类算法不需要预先指定簇的数量,能够有效地处理噪声和异常值,适用于非凸形状的簇。
DBSCAN算法通过定义一定的领域半径和最小样本数来划分簇,而OPTICS算法则是基于样本之间的可及性距离来建立聚类结构。
四、模型驱动的聚类算法模型驱动的聚类算法是一种基于概率模型的聚类方法,常见的算法包括高斯混合模型(GMM)和潜在狄利克雷分配(LDA)。
GMM将每个簇视为一个高斯分布,通过最大化样本的似然函数来估计参数。
而LDA则是一种基于概率图模型的文本主题建模方法,能够发现文本数据中的隐藏主题结构。
在实际应用中,不同的文本聚类算法各有优缺点,需要根据具体的任务和数据特点进行选择。
LSA内部测试题一、背景介绍LSA(Latent Semantic Analysis)是一种基于统计和语义分析的自然语言处理技术,主要用于计算机对大量文本的处理和分析。
在进行LSA内部测试之前,我们需要了解LSA的基本原理和应用领域。
二、LSA原理1. 向量空间模型LSA的核心思想是将文本表示为向量空间模型。
将每篇文档表示为一个向量,并将每个词语表示为向量中的一个维度。
通过计算文档间的相似性,可以实现文本的聚类、检索等功能。
2. 降维LSA通过奇异值分解(Singular Value Decomposition,SVD)将高维的词向量空间降维,去除噪音和冗余信息,提取出文本的隐含语义。
三、LSA的应用1. 文本分类LSA可以通过计算不同文档间的相似度,将文本进行分类。
例如,可以使用LSA对新闻文章进行分类,将相似主题的文章归为一类。
2. 文本检索LSA可以根据用户查询关键词,在大量的文本中进行检索和排序。
通过计算查询词与文档之间的相似度,可以帮助用户快速找到相关的文档。
3. 信息推荐LSA可以根据用户的兴趣和历史行为,推荐相关的文档或信息。
通过计算用户与文档之间的相似度,可以为用户提供更有针对性的推荐。
四、LSA内部测试1. 测试目的LSA内部测试旨在评估LSA模型在不同任务上的性能表现,如文本分类、文本检索和信息推荐等。
通过内部测试,可以了解LSA在不同场景下的优势和不足,进一步对算法进行改进和优化。
2. 测试方法为了准确评估LSA模型的性能,可以采用交叉验证的方法。
将原始数据集分为训练集和测试集,使用训练集进行模型训练,再利用测试集评估模型在不同任务上的表现。
3. 测试指标针对不同任务,可以选择不同的评价指标来评估LSA模型的性能。
如文本分类任务可以使用准确率、召回率和F1值等指标,文本检索任务可以使用平均准确率和平均召回率等指标,信息推荐任务可以使用推荐准确率和覆盖率等指标。
4. 测试结果分析通过对测试结果的分析,可以对LSA模型的优缺点有更深入的认识。
8类lsa作用随着科技的发展,自然语言处理领域中的一项重要技术被广泛应用,那就是LSA(Latent Semantic Analysis)。
LSA是一种基于向量空间模型的语义分析方法,它能够自动地对大量的文本进行降维和语义表示。
下面我们将介绍一下LSA的八种主要作用。
1. 文本分类:LSA通过将文本映射到一个低维语义空间,可以在不依赖特定词汇的情况下进行文本分类任务。
通过计算文档之间的相似性,可以将文本分为具有相似语义的不同类别。
2. 信息检索:LSA可以有效提高信息检索的准确性和效率。
它能够根据查询词和文档的语义相似性进行匹配,找到最相关的文档。
3. 问答系统:LSA可以用于问答系统中的问题解析和答案生成。
通过将问题和文档映射到语义空间,可以根据问题的语义匹配找到最相关的答案。
4. 文本摘要:LSA可以根据文档中的重要语义信息自动提取关键句子或关键词,从而生成简洁准确的文本摘要。
5. 情感分析:LSA可以通过计算情感词汇在语义空间的分布来进行情感分析。
通过判断文本在情感空间中的位置,可以确定文本的积极或消极倾向。
6. 语义相似度计算:LSA可以计算两个文本之间的语义相似度。
通过比较文本在语义空间中的距离,可以量化文本的相似程度。
7. 信息聚类:LSA可以将具有相似语义的文本聚类在一起。
通过计算文本之间的相似性,可以自动将文本分成不同的主题或类别。
8. 自动文本生成:LSA可以根据已有文本的语义信息生成新的文本。
通过学习文本的语义模式,可以自动生成符合语义结构的新文本。
LSA作为一种强大的自然语言处理技术,具有广泛的应用前景。
它能够帮助我们更好地理解和分析海量的文本数据,从而实现更智能化的信息处理和应用。
5lsa产生条件-回复LSA(Latent Semantic Analysis)是一种文本分析方法,通过分析文本中词语的隐含语义关系,将文本表示为向量形式,实现文本的语义理解和相似度计算。
在进行LSA分析时,需要满足几个条件才能得到较好的结果。
首先,数据的预处理非常重要。
LSA算法对文本的质量和数量有一定要求,因此,在进行LSA分析之前,必须确保文本数据的质量,并进行合适的数据清洗和预处理。
预处理过程包括去除停用词、标点符号和特殊字符,对文本进行分词、词干化和词形还原等操作,以便将文本转换为合适的向量表示。
其次,需要构建文本-词语矩阵。
LSA算法通过构建文本-词语矩阵来实现文本的向量表示。
该矩阵的行表示文本,列表示词语,每个元素表示该词语在文本中的出现次数或权重。
构建文本-词语矩阵时需要考虑词语的选择和权重的计算方式。
词语选择可以根据文本的主题和目标来确定,可以使用TF-IDF等方法计算词语的权重,以减少常见词语的干扰。
然后,进行SVD(Singular Value Decomposition,奇异值分解)分解。
LSA算法利用SVD对文本-词语矩阵进行分解,将其分解为三个矩阵的乘积:U矩阵、S矩阵和V矩阵。
U矩阵表示文本-概念矩阵,每行表示一个文本在概念空间中的向量表示;S矩阵是一个对角矩阵,其中对角线上的元素称为奇异值,表示概念的重要程度;V矩阵表示词语-概念矩阵,每行表示一个词语在概念空间中的向量表示。
通过SVD分解,LSA算法将文本从词语级别转换到概念级别,实现了对文本的语义理解和表示。
最后,进行概念之间的相似度计算。
LSA算法通过计算文本向量之间的余弦相似度,来衡量文本之间的语义相似度。
余弦相似度计算公式为:similarity = (u1 * u2) / ( u1 * u2 ),其中u1和u2分别表示两个文本的向量表示。
通过计算文本之间的相似度,可以实现文本的聚类、分类和检索等任务。
在实际应用中,还可以根据需求对LSA进行一些改进和优化。
基于主题模型的文档聚类方法研究主题模型是一种用于分析文本数据的统计模型,它可以帮助我们理解文本背后的主题结构和语义信息。
在文本挖掘和信息检索领域,文档聚类是一项重要的任务,它可以将相似主题的文档归类在一起,帮助我们更好地理解和组织大规模文本数据。
基于主题模型的文档聚类方法结合了主题模型和聚类算法,可以有效地发现隐藏在大规模文本数据中的潜在主题,并将相似主题的文档进行聚类。
本篇文章将介绍基于主题模型的文档聚类方法,并重点探讨其研究现状、优势、挑战及应用领域。
首先,我们介绍基于概率图模型的主题模型。
概率图模型是一种用于描述变量之间关系的图结构,并通过概率分布来建立变量之间的依赖关系。
其中,最为著名且广泛应用的是Latent Dirichlet Allocation(LDA)模型。
LDA假设每个文档由多个隐藏主题组成,并通过计算每个词语与每个主题之间的概率关系来推断出每个词语所属于的主题。
通过应用LDA模型,我们可以从大规模文本数据中发现主题的分布情况,进而进行文档聚类。
其次,我们介绍基于主题模型的文档聚类方法。
基于主题模型的文档聚类方法可以分为两个步骤:主题建模和聚类分析。
首先,通过应用LDA等主题模型,我们可以从大规模文本数据中发现潜在的主题结构,并将每个文档表示为一个概率分布向量。
然后,我们可以使用聚类算法(如K-means、层次聚类等)将相似主题的文档进行归类。
在此过程中,我们需要选择合适的相似度度量方法和聚类算法参数来达到最佳效果。
基于主题模型的文档聚类方法具有一些优势。
首先,它能够发现隐藏在大规模文本数据中的潜在语义信息和结构关系。
传统基于词频统计等方法往往只能捕捉到表面层次上词语之间的关系,而无法理解其背后隐藏的语义信息。
而基于主题模型的方法则能够通过学习每个词语与每个主题之间的概率关系来推断出隐藏在其中的语义信息和结构关系。
其次,基于主题模型的文档聚类方法能够处理大规模文本数据。
由于主题模型能够将文档表示为概率分布向量,而不是原始的词频向量,因此可以大大减少特征空间的维度,提高聚类效率。
8类LSA作用1. 引言随着信息时代的到来,我们面临着大量的文本数据。
为了从这些海量数据中提取有价值的信息,文本挖掘成为了一个热门的研究领域。
在文本挖掘中,主题模型是一种常用的技术,它可以帮助我们发现文本中隐藏的主题。
LSA(Latent Semantic Analysis)是一种主题模型的方法,它通过对文本进行降维处理,将文本表示为一个低维的向量空间模型。
在这个模型中,每个文档和每个单词都被表示为一个向量,向量的维度对应于主题的数量。
通过计算文档和单词之间的相似度,LSA可以帮助我们发现文本中的语义关联。
本文将介绍8类LSA的作用,包括文本分类、信息检索、文本聚类、关键词提取、文本生成、问答系统、推荐系统和情感分析。
2. 文本分类LSA可以用于文本分类任务,通过将文本表示为向量,可以使用机器学习算法对文本进行分类。
首先,将每个文档表示为LSA模型中的向量,然后使用分类算法(如朴素贝叶斯、支持向量机等)进行训练和预测。
LSA可以帮助我们发现文本中的潜在主题,从而提取有用的特征进行分类。
3. 信息检索LSA可以用于信息检索任务,通过计算查询和文档之间的相似度,可以帮助我们找到与查询相关的文档。
首先,将查询和文档表示为LSA模型中的向量,然后计算它们之间的余弦相似度。
相似度高的文档将排在前面,从而提高了信息检索的效果。
4. 文本聚类LSA可以用于文本聚类任务,通过将文本表示为向量,可以使用聚类算法将相似的文本归为一类。
首先,将每个文档表示为LSA模型中的向量,然后使用聚类算法(如K均值聚类、层次聚类等)进行训练和聚类。
LSA可以帮助我们发现文本中的相似性,从而将相似的文本聚类在一起。
5. 关键词提取LSA可以用于关键词提取任务,通过计算文档中每个单词的重要性,可以帮助我们提取文档中的关键词。
首先,将文档表示为LSA模型中的向量,然后根据向量中每个单词的权重进行排序,选取权重较高的单词作为关键词。
LSA可以帮助我们发现文档中的重要信息,从而提取出有意义的关键词。
各种聚类算法及改进算法的研究各种聚类算法及改进算法的研究论文关键词:数据挖掘;聚类算法;聚类分析论文摘要:该文详细阐述了数据挖掘领域的常用聚类算法及改进算法,并比较分析了其优缺点,提出了数据挖掘对聚类的典型要求,指出各自的特点,以便于人们更快、更容易地选择一种聚类算法解决特定问题和对聚类算法作进一步的研究。
并给出了相应的算法评价标准、改进建议和聚类分析研究的热点、难点。
上述工作将为聚类分析和数据挖掘等研究提供有益的参考。
1 引言随着经济社会和科学技术的高速发展,各行各业积累的数据量急剧增长,如何从海量的数据中提取有用的信息成为当务之急。
聚类是将数据划分成群组的过程,即把数据对象分成多个类或簇,在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大。
它对未知数据的划分和分析起着非常有效的作用。
通过聚类,能够识别密集和稀疏的区域,发现全局的分布模式,以及数据属性之间的相互关系等。
为了找到效率高、通用性强的聚类方法人们从不同角度提出了许多种聚类算法,一般可分为基于层次的,基于划分的,基于密度的,基于网格的和基于模型的五大类。
2 数据挖掘对聚类算法的要求(1)可兼容性:要求聚类算法能够适应并处理属性不同类型的数据。
(2)可伸缩性:要求聚类算法对大型数据集和小数据集都适用。
(3)对用户专业知识要求最小化。
(4)对数据类别簇的包容性:即聚类算法不仅能在用基本几何形式表达的数据上运行得很好,还要在以其他更高维度形式表现的数据上同样也能实现。
(5)能有效识别并处理数据库的大量数据中普遍包含的异常值,空缺值或错误的不符合现实的数据。
(6)聚类结果既要满足特定约束条件,又要具有良好聚类特性,且不丢失数据的真实信息。
(7)可读性和可视性:能利用各种属性如颜色等以直观形式向用户显示数据挖掘的结果。
(8)处理噪声数据的能力。
(9)算法能否与输入顺序无关。
3 各种聚类算法介绍随着人们对数据挖掘的深入研究和了解,各种聚类算法的改进算法也相继提出,很多新算法在前人提出的算法中做了某些方面的提高和改进,且很多算法是有针对性地为特定的领域而设计。
基于改进的k-means算法的新闻聚类的研究新闻聚类是将具有相似主题或内容的新闻文章自动分组的任务。
它在信息检索、文本挖掘和推荐系统等领域具有广泛应用。
k-means算法是一种经典的聚类算法,它是一种基于距离的无监督学习方法。
传统的k-means算法对数据分布的要求较高,容易受到初始中心点的选择和局部最优解的影响。
为了提高新闻聚类的准确性和效率,许多学者对k-means算法进行了改进。
改进k-means算法的方法有很多,以下列举了几种常见的方法:1. 加权k-means算法:传统的k-means算法将所有样本视为同等重要,而在新闻聚类任务中,不同的新闻文章可能具有不同的重要性。
加权k-means算法将在每次迭代时计算样本与聚类中心的距离时引入权重,以反映样本的重要程度。
通过引入权重,加权k-means算法可以更好地处理不同重要性的新闻文章,提高聚类效果。
2. 增量k-means算法:传统的k-means算法需要对所有样本进行迭代计算,当数据量较大时,计算复杂度较高。
增量k-means算法将所有样本划分成多个批次,每次只对一个批次进行迭代计算,然后将结果合并。
通过增量计算,可以减少计算复杂度,加快聚类速度。
3. 层次k-means算法:传统的k-means算法只能得到一种聚类结果,但实际应用场景中可能存在多个层次的聚类结构。
层次k-means算法通过同时考虑多个层次的聚类结构,将数据划分成不同层次的子集,从而得到更为精细的聚类结果。
4. 密度k-means算法:传统的k-means算法对数据分布的要求较高,容易受到噪声数据的干扰。
密度k-means算法通过引入密度概念,在计算距离时考虑样本的密度信息,从而提高对噪声数据的鲁棒性。
除了上述方法,还有很多其他改进k-means算法的研究。
基于深度学习的改进方法可以使用自动编码器或卷积神经网络等来提取新闻文章的特征,从而改进聚类效果。
基于概率模型的改进方法可以使用高斯混合模型或贝叶斯网络等来建模新闻数据的分布,以充分利用数据的统计特性。
改进Single-Pass聚类算法的实现(包括分词、tfidf计算、卡方检验特征选择)//热点话题发现的预处理,生成单词表,tdidf向量的值package test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import com.NewsList.*;import com.aliasi.util.Files;import ICTCLAS.I3S.AC.*;import java.io.FileWriter;import code.*;public class segment {public static HashMap<String, Integer> wordInt = new HashMap<String, Integer>();public static int wordCnt[][] = new int[20000][11];public static String[] cntWord = new String[20000];public static int[] wordValid = new int[20000];public static int A[][] = new int[20000][11];public static int B[][] = new int[20000][11];public static int C[][] = new int[20000][11];public static int D[][] = new int[20000][11];public static int cateWordSum[] = new int [20000];public static double chi[][] = new double[20000][11];public static double chiAvg[] = new double[20000];public static int num = 0;public static HashMap<String, Integer> wordDic = new HashMap<String, Integer>();public static HashSet<String> name = new HashSet<String>();public static HashSet<String> place = new HashSet<String>();public static HashSet<String> organization = new HashSet<String>();public static HashSet<String> time = new HashSet<String>();public static HashSet<String> stopWord = new HashSet<String>();public static File TDIR = new File("D:/Users/admin/eclipseworkspace/CreateCorpus/突发事件语料");public static String[] CATEGORIES = { "雅安地震","新疆巴楚恐怖事件","禽流感H7N9疫情","台湾渔船菲律宾射杀","波士顿爆炸案","黄浦江死猪","发改委副主任落马","四川泸县瓦斯爆炸","南方暴雨","内蒙古通辽地震" };public static void outFile(){File out = new File("wordChi1.txt");if (out.exists()) {out.delete();}try {if (out.createNewFile()){OutputStreamWriter outputW = new OutputStreamWriter (new FileOutputStream(out),"GBk");BufferedWriter output = new BufferedWriter(outputW);for(int i=0;i<num;i++){if(wordValid[i]==0)continue;output.write(cntWord[i]+"\r\n");for(int j=0;j<10;j++){output.write(String.valueOf(wordCnt[i][j]));output.write("\r\n");}//output.write("\r\n");}output.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("输出文件wordChi1.txt完毕!");}public static void outputFile(){File out = new File("wordCnt.txt");if (out.exists()) {out.delete();}try {if (out.createNewFile()){OutputStreamWriter outputW = new OutputStreamWriter (new FileOutputStream(out),"GBk");BufferedWriter output = new BufferedWriter(outputW);for(int i=0;i<num;i++){output.write(cntWord[i]+" ");for(int j=0;j<11;j++){output.write(String.valueOf(wordCnt[i][j]));output.write(" ");}output.write("\r\n");}output.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("输出文件wordCnt.txt完毕!");}public static HashSet<String> CreateStopWord(String filename){HashSet<String> tempStopWord = new HashSet<String>();File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;while((text = input.readLine()) != null)//从第三行到文件末尾是正文{tempStopWord.add(text);}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return tempStopWord;}public static String ReturnTitle(String filename){String title = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题title = text;input.close();}catch(IOException ioException){System.err.println("File Error!");}}return title;}public static String ReturnContent(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题while((text = input.readLine()) != null)//从第三行到文件末尾是正文{content += text;}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnTitleandContent(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题content = text;while((text = input.readLine()) != null)//从第三行到文件末尾是正文{content += text;}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnTitleandFirstParagraph(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题text += input.readLine();//第三行正文的第一段content = text;input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}private static String[] spitByWhiteChar(String para) {if (para != null)return para.split("[\\s]");//return para.split(" ");elsereturn null;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubICTCLAS30 testICTCLAS30 = new ICTCLAS30();String argu = ".";try {if (testICTCLAS30.ICTCLAS_Init(argu.getBytes("GB2312")) == false) {System.out.println("Init Fail!");return;}} catch (UnsupportedEncodingException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}/** ���ô��Ա�ע��ID �����Լ� 1 ������һ����ע��0 �����������ע�� 2 ���������ע�� 3 ����һ����ע��*/testICTCLAS30.ICTCLAS_SetPOSmap(1);for (int i = 0; i < CATEGORIES.length; i++){//System.out.println(CATEGORIES[i]);File classDir = new File(TDIR, CATEGORIES[i]);if (!classDir.isDirectory()) {System.out.println("不能找到目录=" + classDir);}//遍历for (File file : classDir.listFiles()){String filepath = "D:/Users/admin/eclipseworkspace/CreateCorpus/突发事件语料/" + CATEGORIES[i] + "/" + file.getName();//System.out.println(filepath);String news = ReturnTitleandContent(filepath);//String news = ReturnTitleandFirstParagraph(filepath);//String news = ReturnTitle(filepath);news = news.trim();//System.out.println(news);//ȥ��if (!new ChineseCheck().CheckChinese(news))continue;news = new ChangeCode().Change(news);// ��if (news == null)continue;byte nativeBytes[];try {nativeBytes = testICTCLAS30.ICTCLAS_ParagraphProcess(news.getBytes("GBK"), 1);String spitedNews = new String(nativeBytes, 0,nativeBytes.length, "GBK");//FileWriter writer = new FileWriter(String.valueOf(i), false);String[] words = spitByWhiteChar(spitedNews);spitedNews = "";for (String word : words) {int pos = word.indexOf("/");int pos1 = word.indexOf("/n");int pos2 = word.indexOf("/v");int pos3 = word.indexOf("/t");//int pos2,pos3,pos4,pos5;//int pos2 = word.indexOf("/");if (!word.equals("") && ((pos1 != -1)||(pos2 != -1)||(pos3 != -1))) {word = word.substring(0, pos);if (wordDic.containsKey(word)) {wordDic.put(word, wordDic.get(word) + 1);} else {wordDic.put(word, 1);//System.out.println(word);}}}//System.out.println(wordDic.size());}catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}System.out.print("初步统计词(名词+动词+时间词)之后的词个数:");System.out.println(wordDic.size());//去停用词stopWord = CreateStopWord("ChineseStopWord.txt");//Iterator<String> iterator=stopWord.iterator();//while(iterator.hasNext()){//System.out.println(iterator.next());//}//int num = 0;Iterator iter = wordDic.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue();if(stopWord.contains(key)){iter.remove();continue;}else{wordCnt[num][10] = Integer.valueOf(val.toString());//System.out.println(wordCnt[num][10]);wordInt.put(key.toString(),num);//词和词的编号映射,wordCnt保存的是0-9的类的词个数以及这个词的总个数cntWord[num] = key.toString();++num;}}System.out.println("去除停用词剩余词个数:"+num);//计算wordCnt[0-9] 再次遍历for (int i = 0; i < CATEGORIES.length; i++){File classDir = new File(TDIR, CATEGORIES[i]);if (!classDir.isDirectory()) {System.out.println("不能找到目录=" + classDir);}//遍历for (File file : classDir.listFiles()){int flag[][] = new int[20000][10];for(int w=0;w<num;w++)for(int x=0;x<10;x++)flag[w][x]=0;String filepath = "D:/Users/admin/eclipseworkspace/CreateCorpus/突发事件语料/" + CATEGORIES[i] + "/" + file.getName();//System.out.println(filepath);String news = ReturnTitleandContent(filepath);//String news = ReturnTitleandFirstParagraph(filepath);//String news = ReturnTitle(filepath);news = news.trim();//System.out.println(news);//ȥ��if (!new ChineseCheck().CheckChinese(news))continue;news = new ChangeCode().Change(news);// ��if (news == null)continue;byte nativeBytes[];try {nativeBytes = testICTCLAS30.ICTCLAS_ParagraphProcess(news.getBytes("GBK"), 1);String spitedNews = new String(nativeBytes, 0,nativeBytes.length, "GBK");//FileWriter writer = new FileWriter(String.valueOf(i), false);String[] words = spitByWhiteChar(spitedNews);spitedNews = "";for (String word : words) {int pos = word.indexOf("/");int pos1 = word.indexOf("/n");int pos2 = word.indexOf("/v");int pos3 = word.indexOf("/t");//int pos2,pos3,pos4,pos5;//int pos2 = word.indexOf("/");if (!word.equals("") && ((pos1 != -1)||(pos2 != -1)||(pos3 != -1))) {word = word.substring(0, pos);if (wordInt.containsKey(word)) {if(flag[wordInt.get(word)][i]==0){wordCnt[wordInt.get(word)][i]++;flag[wordInt.get(word)][i] = 1;}}}}//System.out.println(wordDic.size());}catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//将wordCnt输出到文件//outputFile();//求出A,B,C,D的值for(int i=0;i<num;i++){for(int j=0;j<10;j++){A[i][j] = wordCnt[i][j];}}for(int i=0;i<num;i++){int sum = 0;for(int j=0;j<10;j++){cateWordSum[i] += wordCnt[i][j];}}for(int i=0;i<num;i++){for(int j=0;j<10;j++){B[i][j] = cateWordSum[i]-wordCnt[i][j];}}for(int i=0;i<num;i++){for(int j=0;j<10;j++){C[i][j] = 100 - wordCnt[i][j];}}for(int i=0;i<num;i++){for(int j=0;j<10;j++){D[i][j] = 1000 - A[i][j] - B[i][j] -C[i][j];}}//Chi(卡方检验特征选择)for(int i=0;i<num;i++){for(int j=0;j<10;j++){chi[i][j] = (double)(1000*(A[i][j]*D[i][j]-B[i][j]*C[i][j]))/((A[i][j]+C[i][j])*(A[i][j]+B[i][j]));chi[i][j] = chi[i][j]*(((double)(A[i][j]*D[i][j]-B[i][j]*C[i][j]))/((B[i][j]+D[i][j])*(C[i][j]+D[i][j])));//System.out.println(chi[i][j]);}}for(int i=0;i<num;i++){double sum = 0.0;for(int j=0;j<10;j++)sum += chi[i][j];chiAvg[i] = sum/10;}double tempchiAvg[] = new double[20000];for(int i=0;i<num;i++)tempchiAvg[i] = chiAvg[i];Arrays.sort(tempchiAvg,0,num);//按升序排序for(int xxx=0;xxx<num;xxx++){System.out.println(tempchiAvg[xxx]);}int chiLeave = 3500;int pos = num-chiLeave;System.out.print("Chi卡方检验保留词个数:");System.out.println(chiLeave);int wordLeareNum = 0;for(int i=0;i<num;i++){if(chiAvg[i]>=tempchiAvg[pos]){wordValid[i]= 1;wordLeareNum++;}else wordValid[i] = 0;}System.out.println("最后剩余的词表大小:"+wordLeareNum);//将做完特征选择的10000个单词输入到文件中outFile();//再次遍历文件,得到每个文档的tf*idf向量}}分词和卡方检验特征选择package test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import com.NewsList.*;import com.aliasi.util.Files;import ICTCLAS.I3S.AC.ICTCLAS30;import java.io.FileWriter;import code.*;public class tfidf {public static String wordList[][] = new String[20000][11];public static int wordNum = 3774;public static HashMap<String, Integer> wordNo = new HashMap<String, Integer>();//public static HashMap<Integer, String> noWord = new HashMap<Integer, String>();public static File TDIR = new File("D:/Users/admin/eclipseworkspace/CreateCorpus/突发事件语料");public static String[] CATEGORIES = { "雅安地震","新疆巴楚恐怖事件","禽流感H7N9疫情","台湾渔船菲律宾射杀","波士顿爆炸案","黄浦江死猪","发改委副主任落马","四川泸县瓦斯爆炸","南方暴雨","内蒙古通辽地震" };public static int[][] wordDocNum = new int[15100][1000];//每个文档含有的某个词的个数public static double[][] tf = new double[15100][1000];public static double[] idf = new double[15100];public static double[][] featureVector = new double[1000][15100];//特征向量public static HashMap<String, Integer> docNo = new HashMap<String, Integer>();public static HashMap<Integer, String> noDoc = new HashMap<Integer, String>();public static int[][] name = new int[15100][1000];//人名public static int[][] place = new int[15100][1000];//地名public static int[][] organization = new int[15100][1000];//机构名public static int[][] time = new int[15100][1000];//时间词public static int[][] title = new int[15100][1000];//标题public static int[][] firstParagraph = new int[15100][1000];//第一段public static void outFile(){for(int i=0;i<1000;i++){File out = new File("featureVector/"+noDoc.get(i)+".txt");System.out.println(i);System.out.println(noDoc.get(i));if (out.exists()) {out.delete();}try {if (out.createNewFile()){OutputStreamWriter outputW = new OutputStreamWriter (new FileOutputStream(out),"GBk");BufferedWriter output = new BufferedWriter(outputW);for(int j=0;j<wordNum;j++){output.write(String.valueOf(featureVector[i][j]));output.write("\r\n");}output.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("输出文件完毕!");}public static int FindWord(String word){int i=0;for(i=0;i<wordNum;i++){if(word.equals(wordList[i][0]))return i;}return -1;}public static void GetWordList(){File file = new File("wordChi1.txt");if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;for(int i=0;i<wordNum;i++){text = input.readLine();wordList[i][0] = text;wordNo.put(text, i);//noWord.put(i, text);for(int j=0;j<10;j++){text = input.readLine();wordList[i][j+1] = text;}}input.close();}catch(IOException ioException){System.err.println("File Error!");}}}public static String ReturnTitle(String filename){String title = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题title = text;input.close();}catch(IOException ioException){System.err.println("File Error!");}}return title;}public static String ReturnContent(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题while((text = input.readLine()) != null)//从第三行到文件末尾是正文{content += text;}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnTitleandContent(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题content = text;while((text = input.readLine()) != null)//从第三行到文件末尾是正文{content += text;}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnContentFromSecond(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题text = input.readLine();//第三行是正文的第一段while((text = input.readLine()) != null)//从第三行到文件末尾是正文{content += text;}input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnTitleandFirstParagraph(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题text += input.readLine();//第三行正文的第一段content = text;input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}public static String ReturnFirstParagraph(String filename){String content = "";File file = new File(filename);if (file.exists() && file.isFile()) {try{InputStreamReader read = new InputStreamReader (new FileInputStream(file),"GBk");BufferedReader input = new BufferedReader(read);String text;text = input.readLine();//第一行是时间text = input.readLine();//第二行是标题text = input.readLine();//第三行正文的第一段content = text;input.close();}catch(IOException ioException){System.err.println("File Error!");}}return content;}private static String[] spitByWhiteChar(String para) {if (para != null)return para.split("[\\s]");//return para.split(" ");elsereturn null;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stublong startTime = System.currentTimeMillis(); //获取开始时间GetWordList();//计算idffor(int i=0;i<wordNum;i++){int sum = 0;for(int j=0;j<10;j++){sum += Integer.valueOf(wordList[i][j+1]);}idf[i] = Math.log(((double)1000/sum)+0.01);}ICTCLAS30 testICTCLAS30 = new ICTCLAS30();String argu = ".";try {if (testICTCLAS30.ICTCLAS_Init(argu.getBytes("GB2312")) == false) {System.out.println("Init Fail!");return;}} catch (UnsupportedEncodingException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}/** ���ô��Ա�ע��ID �����Լ� 1 ������һ����ע��0 �����������ע�� 2 ���������ע�� 3 ����һ����ע��*/testICTCLAS30.ICTCLAS_SetPOSmap(1);int k=0;for (int i = 0; i < CATEGORIES.length; i++){File classDir = new File(TDIR, CATEGORIES[i]);if (!classDir.isDirectory()) {System.out.println("不能找到目录=" + classDir);}//遍历for (File file : classDir.listFiles()){docNo.put(file.getName(), k);noDoc.put(k, file.getName());k++;//System.out.println(file.getName());//k++;String filepath = "D:/Users/admin/eclipseworkspace/CreateCorpus/突发事件语料/" + CATEGORIES[i] + "/" + file.getName();//System.out.println(filepath);String news = ReturnTitle(filepath);//String news = ReturnTitleandFirstParagraph(filepath);news = news.trim();//System.out.println(news);//ȥ��if (!new ChineseCheck().CheckChinese(news))continue;news = new ChangeCode().Change(news);// ��if (news == null)continue;byte nativeBytes[];try {nativeBytes = testICTCLAS30.ICTCLAS_ParagraphProcess(news.getBytes("GBK"), 1);String spitedNews = new String(nativeBytes, 0,nativeBytes.length, "GBK");//FileWriter writer = new FileWriter(String.valueOf(i), false);String[] words = spitByWhiteChar(spitedNews);spitedNews = "";for (String word : words) {int pos1 = word.indexOf("/");int pos2 = word.indexOf("/nr");int pos3 = word.indexOf("/ns");int pos4 = word.indexOf("/nt");int pos5 = word.indexOf("/t");//int pos2 = word.indexOf("/");if (!word.equals("") && pos1 != -1) {word = word.substring(0, pos1);//int flag = FindWord(word);//if (flag!=-1)if(wordNo.containsKey(word)){wordDocNum[wordNo.get(word)][k-1]++;title[wordNo.get(word)][k-1]=1;if(pos2!=-1)name[wordNo.get(word)][k-1]=1;if(pos3!=-1)place[wordNo.get(word)][k-1]=1;if(pos4!=-1)organization[wordNo.get(word)][k-1]=1;if(pos5!=-1)time[wordNo.get(word)][k-1]=1;}}}news = ReturnFirstParagraph(filepath);news = news.trim();//System.out.println(news);//ȥ��if (!new ChineseCheck().CheckChinese(news))continue;news = new ChangeCode().Change(news);// ��if (news == null||news=="")continue;//byte nativeBytes[];//try {nativeBytes = testICTCLAS30.ICTCLAS_ParagraphProcess( news.getBytes("GBK"), 1);spitedNews = new String(nativeBytes, 0,nativeBytes.length, "GBK");//FileWriter writer = new FileWriter(String.valueOf(i), false);words = spitByWhiteChar(spitedNews);spitedNews = "";for (String word : words) {int pos1 = word.indexOf("/");int pos2 = word.indexOf("/nr");int pos3 = word.indexOf("/ns");int pos4 = word.indexOf("/nt");int pos5 = word.indexOf("/t");//int pos2 = word.indexOf("/");if (!word.equals("") && pos1 != -1) {word = word.substring(0, pos1);//int flag = FindWord(word);//if (flag!=-1)if(wordNo.containsKey(word)){wordDocNum[wordNo.get(word)][k-1]++;firstParagraph[wordNo.get(word)][k-1]=1;if(pos2!=-1)name[wordNo.get(word)][k-1]=1;if(pos3!=-1)place[wordNo.get(word)][k-1]=1;if(pos4!=-1)organization[wordNo.get(word)][k-1]=1;if(pos5!=-1)time[wordNo.get(word)][k-1]=1;}}}news = ReturnContentFromSecond(filepath);news = news.trim();//System.out.println(news);//ȥ��if (!new ChineseCheck().CheckChinese(news))continue;news = new ChangeCode().Change(news);// ��if (news == null||news=="")continue;//byte nativeBytes[];//try {nativeBytes = testICTCLAS30.ICTCLAS_ParagraphProcess( news.getBytes("GBK"), 1);spitedNews = new String(nativeBytes, 0,nativeBytes.length, "GBK");//FileWriter writer = new FileWriter(String.valueOf(i), false);words = spitByWhiteChar(spitedNews);spitedNews = "";for (String word : words) {int pos1 = word.indexOf("/");int pos2 = word.indexOf("/nr");int pos3 = word.indexOf("/ns");int pos4 = word.indexOf("/nt");int pos5 = word.indexOf("/t");//int pos2 = word.indexOf("/");if (!word.equals("") && pos1 != -1) {word = word.substring(0, pos1);//int flag = FindWord(word);//if (flag!=-1)if(wordNo.containsKey(word)){wordDocNum[wordNo.get(word)][k-1]++;if(pos2!=-1)name[wordNo.get(word)][k-1]=1;if(pos3!=-1)place[wordNo.get(word)][k-1]=1;if(pos4!=-1)organization[wordNo.get(word)][k-1]=1;if(pos5!=-1)time[wordNo.get(word)][k]=1;}}}//k++;//System.out.println(wordDic.size());}catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//System.out.println(k);}System.out.println(docNo.size());//计算tfint sumWordDoc[] = new int[1000];for(int j=0;j<1000;j++)sumWordDoc[j] = 0;for(int j=0;j<1000;j++){for(int i=0;i<wordNum;i++){sumWordDoc[j] += wordDocNum[i][j];}}for(int i=0;i<wordNum;i++){for(int j=0;j<1000;j++){tf[i][j] = (double)(wordDocNum[i][j])/sumWordDoc[j];}}double sum[] = new double[1000];for(int i=0;i<1000;i++)。