精华内容
下载资源
问答
  • 基于Canopy K-means的中文文本聚类算法.pdf
  • HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构...提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能。
  • python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...
  • 利用Python实现中文文本关键词抽取,分别采用TF-IDF、TextRank、Word2Vec词聚类三种方法。
  • K-means在关键词聚类中的尝试

    千次阅读 2019-03-22 01:34:51
    K-means在文本聚类中的尝试 K-means算法是无监督的聚类算法。它的算法思想是:先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类...

    K-means在文本聚类中的尝试

    K-means算法是无监督的聚类算法。它的算法思想是:先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。

    K-means算法的关键点在于:

    • 初始k个聚类中心的选择
    • 距离的计算方式

    我想讨论的是:在关键词聚类的任务当中,距离的计算方式的选择,对聚类效果的影响。


    具体任务

    我爬取了司法相关的法律文章,包括:

    • 法律
    • 法律法规
    • 法律解读
    • 行政法规
    • 部门规章
    • 地方政府规章

    首先对于这些文章我使用了LTP进行分词,对每个词计算它的TFIDF值,然后根据TFIDF值大小选取了每篇文章的前10个关键词得到关键词词袋。

    任务的目的是将同一类关键词划分在一起,得到司法文章某一类的共性,从而得到司法文章的全部类别特性。

    我把这个任务视为一个聚类任务。因为虽然我们事先已经对文章有了“预分类”,但是文章的关键词可能是多个类别所共有的,换言之,关键词词袋不同于“预分类”文章,并不具有类别特性,仍需要我们根据关键词的特性将同一类关键词划分在同一簇中。


    关键词向量化

    我对关键词向量化的方式是词向量概率模型,做法是将关键词映射到6维实数向量,6个维度分别对应----法律,法律法规,法律解读,部门规章,行政法规,地方政府规章。对于关键词w(w属于关键词词袋),他的第i维的值xi是它在i维中出现的tfidf值的和,于是w = {x0,x1,x2,x3,x4,x5}

    向量化后的关键词词袋,就可以应用k-means算法进行聚类了,但由于我之前没有NLP的经验,使用k-means算法对关键词聚类的过程中走了弯路。


    欧式距离

    欧式距离是K-means在网上流传性比较广的实现方式,尽管我不知道它是否在学术上流传广泛。

    应用欧式距离进行k-means聚类,问题在于:文本的预处理以及向量化过程导致使用欧式距离难以得到良好效果。
    具体而言,为了得到文章的关键词,不能简单的使用概率模型,不得不使用TF-IDF(逆向文本率)剔除文本共性,得到文章的关键词;但词向量化过程,由于剔除了文本共性,得到的词向量(欧式距离中更好的表述是“词点”),绝大多数都是诸如{1,0,0,0,0,0}只在某一维度上拥有非0值。最终导致,使用欧式距离,绝大多数“词点”集中在{0,0,0,0,0,0}“原点”附近。


    余弦相似度

    因为欧式距离难以实现聚类效果,所以我把目光转向了在其他文章博客中多次提到但没有人拿来实现的余弦相似度K-means。
    为了少走弯路,我查阅了基于余弦距离选取初始簇中心的文本聚类研究论文。
    论文的贡献在于:

    • 1、探索余弦相似度与欧氏距离的关系, 在此基础上给出一种余弦距离, 通过余弦距离的优良性质, 使改进算法思想得以运用到余弦K-means算法中。
    • 2、余弦K-means及其拓展算法的簇内中心点仍是簇内各坐标的和的均值, 与欧氏K-means的簇内中心点的计算方法相同
    • 3、将欧氏距离的距离远即可当初始点的思想迁移应用于余弦K-means算法, 即依次寻找余弦距离相隔最远的K个点。

    在1中,作者证明了余弦相似度、欧氏距离,以及作者提出的余弦距离在函数上的关系,作为作者改进K-means算法的基础。
    在这里插入图片描述
    作者在文章中给出了改进后的算法在公开数据集20newsgroup (20NG) 新闻组数据集上的实验数据
    在这里插入图片描述
    可见改进后的算法效果得到了提升。

    有了上述论文的理论支持,我部分实现了作者的改进Kmeans算法(没有采用余弦距离,采用了余弦相似度,但中心点和初始点选择参考了作者的实现)。同一簇内的向量基本具有相同的方向,我又根据簇内向量在中心向量上的投影的大小,将簇内向量进行重要性排序,最终利用了词向量方向和距离的特性,得到了较好的聚类效果。

    http://xueshu.baidu.com/usercenter/paper/show?paperid=40a3ae181b554a498725b6815daf3e18&site=xueshu_se

    展开全文
  • 中文文本聚类(切词以及Kmeans聚类) 标签: <a href="http://www.csd
    • 简介
    • 一 切词
    • 二 去除停用词
    • 三 构建词袋空间VSMvector space model
    • 四 将单词出现的次数转化为权值TF-IDF
    • 五 用K-means算法进行聚类
    • 六 总结
    • 简介

      查看百度搜索中文文本聚类我失望的发现,网上竟然没有一个完整的关于Python实现的中文文本聚类(乃至搜索关键词python 中文文本聚类也是如此),网上大部分是关于文本聚类的Kmeans聚类的原理Java实现R语言实现,甚至都有一个C++的实现

      正好我写的一些文章,我没能很好的分类,我想能不能通过聚类的方法将一些相似的文章进行聚类,然后我再看每个聚类大概的主题是什么,给每个聚类一个标签,这样也是完成了分类。

      中文文本聚类主要有一下几个步骤,下面将分别详细介绍:

      • 切词
      • 去除停用词
      • 构建词袋空间VSM(vector space model)
      • TF-IDF构建词权重
      • 使用K-means算法

      一、 切词

      这里中文切词使用的是结巴切词github项目主页作者微博

      github项目主页上有结巴切词的详细安装方式,以及示例说明,这里不再详述,一般情况下,可以使用如下方式安装。

      # pip install jieba
       
      • 1
      • 1

      或者

      # easy_install jieba
       
      • 1
      • 1

      还可以参考一下文章:
      1.Python中文分词组件 jieba
      2.python 结巴分词(jieba)学习

      二、 去除停用词

      结巴分词虽然有去除停用词的功能,但是好像只是给jieba.analyse组建使用的,并不给jieba.cut使用,所以这里我们还是要自己构建停用词文件,以及去除停用词。
      常见的中文停用词有:
      1. 中文停用词表(比较全面,有1208个停用词)
      2. 最全中文停用词表整理(1893个)

      实现代码如下(代码比较水):

      def read_from_file(file_name):
          with open(file_name,"r") as fp:
              words = fp.read()
          return words
      def stop_words(stop_word_file):
          words = read_from_file(stop_word_file)
          result = jieba.cut(words)
          new_words = []
          for r in result:
              new_words.append(r)
          return set(new_words)
      def del_stop_words(words,stop_words_set):
      #   words是已经切词但是没有去除停用词的文档。
      #   返回的会是去除停用词后的文档
          result = jieba.cut(words)
          new_words = []
          for r in result:
              if r not in stop_words_set:
                  new_words.append(r)
          return new_words
       
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      三、 构建词袋空间VSM(vector space model)

      接下来是构建词袋空间,我们的步骤如下
      1. 将所有文档读入到程序中,再将每个文档切词。
      2. 去除每个文档中的停用词。
      3. 统计所有文档的词集合(sk-learn有相关函数,但是我知道能对中文也使用)。
      4. 对每个文档,都将构建一个向量,向量的值是词语在本文档中出现的次数。
      这举个例子,假设有两个文本,1.我爱上海,我爱中国2.中国伟大,上海漂亮
      那么切词之后就有一下词语上海中国伟大漂亮,(逗号也可能被切词)。
      再假设停用词是我 ,,那么去除停用词后,剩余的词语就是
      上海中国伟大漂亮
      然后我们对文档1和文档2构建向量,那么向量将如下:

      文本上海中国伟大漂亮
      文档121100
      文档201111

      代码如下:

      def get_all_vector(file_path,stop_words_set):
          names = [ os.path.join(file_path,f) for f in os.listdir(file_path) ]
          posts = [ open(name).read() for name in names ]
          docs = []
          word_set = set()
          for post in posts:
              doc = del_stop_words(post,stop_words_set)
              docs.append(doc)
              word_set |= set(doc)
              #print len(doc),len(word_set)
      
          word_set = list(word_set)
          docs_vsm = []
          #for word in word_set[:30]:
              #print word.encode("utf-8"),
          for doc in docs:
              temp_vector = []
              for word in word_set:
                  temp_vector.append(doc.count(word) * 1.0)
              #print temp_vector[-30:-1]
              docs_vsm.append(temp_vector)
      
          docs_matrix = np.array(docs_vsm)
       
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      1. 在python中表示可能如下[[2,1,1,0,0],[0,1,1,1,]],我们尽可能将其放入到numpy的array或者matrix中方便下面TF-IDF的计算。

      四、 将单词出现的次数转化为权值(TF-IDF)

      换句话说,我们的vsm保存的本来已经是向量的形式,我们为什么还需要TF-IDF的形式呢?我认为这就是为了将单词出现的次数转化为权值。
      关于TF-IDF的介绍可以参考网上的文章:
      1. 基本文本聚类方法
      2. TF-IDF百度百科
      3. TF-IDF维基百科英文版(需要翻墙)

      这里需要注意的是关于TF(term frequency)的计算,关于IDF(Inverse document frequency)的计算,我看公式基本上都是一样的:
      逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:

      idf(t,D)=log(NdD,td)

      本公式用LaTex编辑,推荐一个令人惊叹的网站:Detexify
      其中
      N:语料库中的文件总数
      dD,td:包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用作为分母。

      然而百度百科以及网上大部分关于TF的介绍其实是有问题的,TF-IDF百度百科中说词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率,那么很明显这个计算公式就为:

      tfi,j=ni,jknk,j

      然而这种计算方式常常会导致TF过小,其实TF-IDF并不是只有一种计算方式,而是多种,这个时候就体现出维基百科的威力了,具体的关于TF-IDF的介绍还是要参照维基百科。

      如果不熟悉numpy,可以参考numpy官方文档

      column_sum = [ float(len(np.nonzero(docs_matrix[:,i])[0])) for i in range(docs_matrix.shape[1]) ]
      column_sum = np.array(column_sum)
      column_sum = docs_matrix.shape[0] / column_sum
      idf =  np.log(column_sum)
      idf =  np.diag(idf)
      # 请仔细想想,根绝IDF的定义,计算词的IDF并不依赖于某个文档,所以我们提前计算好。
      # 注意一下计算都是矩阵运算,不是单个变量的运算。
      for doc_v in docs_matrix:
          if doc_v.sum() == 0:
              doc_v = doc_v / 1
          else:
              doc_v = doc_v / (doc_v.sum())
          tfidf = np.dot(docs_matrix,idf)
          return names,tfidf
       
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      现在我们拥有的矩阵的性质如下,

      • 列是所有文档总共的词的集合。
      • 每行代表一个文档。
      • 每行是一个向量,向量的每个值是这个词的权值。

      五、 用K-means算法进行聚类

      到这个时候,我们可以使用kmeans算法进行聚类,对kmeans算法来说,它看到已经不是文本了,只是矩阵而已,所以我们用的也是通用的kmeans算法就可以了。
      关于kmeans的介绍可以见于如下的文章:
      1. 基本Kmeans算法介绍及其实现
      2. K-means百度百科
      3. 浅谈Kmeans聚类
      所不同的是,在大部分的文本聚类中,人们通常用余弦距离(很好的介绍文章)而不是欧氏距离进行计算,难道是因为稀疏矩阵的原因,我并不太明白。

      下面的代码来自《机器学习实战》第十章的代码:

      def gen_sim(A,B):
          num = float(np.dot(A,B.T))
          denum = np.linalg.norm(A) * np.linalg.norm(B)
          if denum == 0:
              denum = 1
          cosn = num / denum
          sim = 0.5 + 0.5 * cosn
          return sim
      def randCent(dataSet, k):
          n = shape(dataSet)[1]
          centroids = mat(zeros((k,n)))#create centroid mat
          for j in range(n):#create random cluster centers, within bounds of each dimension
              minJ = min(dataSet[:,j]) 
              rangeJ = float(max(dataSet[:,j]) - minJ)
              centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
          return centroids
      
      def kMeans(dataSet, k, distMeas=gen_sim, createCent=randCent):
          m = shape(dataSet)[0]
          clusterAssment = mat(zeros((m,2)))#create mat to assign data points 
                                            #to a centroid, also holds SE of each point
          centroids = createCent(dataSet, k)
          clusterChanged = True
          counter = 0
          while counter <= 50:
              counter += 1
              clusterChanged = False
              for i in range(m):#for each data point assign it to the closest centroid
                  minDist = inf; 
                  minIndex = -1
                  for j in range(k):
                      distJI = distMeas(centroids[j,:],dataSet[i,:])
                      if distJI < minDist:
                          minDist = distJI; 
                          minIndex = j
                  if clusterAssment[i,0] != minIndex: 
                      clusterChanged = True
                  clusterAssment[i,:] = minIndex,minDist**2
              #print centroids
              for cent in range(k):#recalculate centroids
                  ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster
                  centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean 
          return centroids, clusterAssment
       
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43

      六、 总结

      基本上到这里为止,一个可用的中文文本聚类工具已经完成了,github项目地址
      其效果到底怎么样呢?

      我自己有一些未分类的文章属于人生感悟(羞羞脸)类别的共有182篇,在切词以及去除停用词之后,共得到13202个词语,我设置K=10,嗯,效果并不是太好,当然可能有一下原因:

      • 文档本身已经属于高度分类的了,基于词频的聚类并不能发现关于这些文章间的细微的区别。
      • 算法需要优化,可能有些地方可以设置修改一下。

      总之,在学习若干天机器学习后,第一次实践之旅算是结束了。

      本文转载自:http://blog.csdn.net/likeyiyy/article/details/48982909

    展开全文
  • 【NLP】Python中文文本聚类

    万次阅读 多人点赞 2018-07-18 10:08:50
    1. 准备需要进行聚类文本,这里选取了10篇微博。 import os path = 'E:/work/@@@@/开发事宜/大数据平台/5. 标签设计/文本测试数据/微博/' titles = [] files = [] for filename in os.listdir(path): titles....

    1. 准备需要进行聚类的文本,这里选取了10篇微博。

    import os
    path = 'E:/work/@@@@/开发事宜/大数据平台/5. 标签设计/文本测试数据/微博/'
    titles = []
    files = []
    for filename in os.listdir(path):
        titles.append(filename)
        #带BOM的utf-8编码的txt文件时开头会有一个多余的字符\ufeff,BOM被解码为一个字符\ufeff,如何去掉?修改encoding为utf-8_sig或者utf_8_sig
        filestr = open(path + filename, encoding='utf-8_sig').read()
        files.append(filestr)
    for i in range(len(titles)):
        print(i, titles[i], files[i])
    
    0 #我有特别的推倒技巧#之佟掌柜收李逍遥.txt 【#我有特别的推倒技巧#之佟掌柜收李逍遥】@胡歌 此前对南都称,“我要海陆空三栖”,可是还没等他征服海陆空呢,@素描闫妮 就把他先收了……他俩主演的电视剧《生活启示录》收视率稳居卫视黄金档排行第1名,在豆瓣甚至被刷到了8 .6的高分。佟掌柜是怎么推倒李逍遥而又不违和的?http://t.cn/Rvbj6oy
    1 从前的称是16两为一斤,为什么要16两为一斤呢?.txt 从前的称是16两为一斤,为什么要16两为一斤呢?古人把北斗七星、南斗六星以及福、禄、寿三星,共16颗星比作16两,商人卖东西,要讲究商德,不能缺斤短两;如果耍手腕,克扣一两就减福,克扣二两就损禄,克扣三两就折寿。所以这个数字和古代人对诚信的美好愿望分不开。
    2 作死男晒酒驾.txt #作死男晒酒驾# “他还晒出自己闯红灯20多次,最终此人自首。”请问“亲爱的交警同志”你们在干神马事情去啦!!!是不是撞死人呢,你们才会管啊,开宝马的命太金贵了,而我们的命太.......!!![怒][泪] |作死男晒酒驾
    3 冀中星被移送检察院审查起诉.txt #新闻追踪#:【冀中星被移送检察院审查起诉】首都机场公安分局对冀中星爆炸案侦查终结,目前已移送朝阳检察院审查起诉。7月20日18时24分,冀中星在首都机场T3航站楼B口外引爆自制炸药。案发当天除冀中星左手腕因被炸截肢外,无其他人伤亡。7月29日,冀中星因涉嫌爆炸罪被批捕。http://t.cn/zQHjr0S
    4 宝马男微博炫富晒酒驾挑逗交警 最终因被人肉求饶[汗].txt 【宝马男微博炫富晒酒驾挑逗交警 最终因被人肉求饶[汗]】"开车喝酒是不是违反交规?@深圳交警 今晚猎虎吗?",在向交警挑衅后,他又晒出车牌号,称自己闯红灯20多次,随即遭人肉,并陆续被曝光私人信息。很快,他发微博求饶。26日,交警传唤该男子,该男子炫富违法车辆已被查扣。http://t.cn/Rvb9gF6
    5 广场舞出口世界.txt #广场舞出口世界# 澳大利亚引进广场舞顺带引进大妈的疑惑:1)是否可以申请技术移民2)是否属于物种入侵3)亚洲女子天团进入澳洲是否会影响当地娱乐圈的圈态平衡4)是否能够接受“中国大妈一旦引进,一概不退不换”的要求
    6 方舟子:锤子改口号,换汤不换药!.txt 【方舟子:锤子改口号,换汤不换药!】遭到方舟子举报虚假宣传后,锤子手机官网修改了宣传口号,将"东半球最好用的手机"改成"全球第二好用的智能手机"。对此,方舟子称,被举报后,罗永浩一边说着"呵呵",一边偷偷改了广告用语,改成了”全球第二好用的智能手机"等,但这仍然是换汤不换药的虚假广告..
    7 杜汶泽宣布暂别香港 (2).txt #杜汶泽宣布暂别香港#杜先生长的丑,嘴巴臭,爪子贱不是你的错,你出来吓人乱说话熏到人就是你的不对了,大陆人怎么了,大陆人敢作敢当说不安逸你就不安逸你,大陆人让你无地自容的本事还是绰绰有余的,滚吧,杜狗! 
    8 杜汶泽宣布暂别香港.txt #杜汶泽宣布暂别香港# 虽说言论自由无可厚非,但攻击民族种族国家,涉及歧视他人的行为仍然不是营销策略中可以突破的下线。把无耻当有趣,是多无聊的人才能干出的事儿啊!该。。只有这个字能概括。
    9 首都机场爆炸案嫌犯冀中星 移送检方审查起诉.txt #豫广微新闻#【首都机场爆炸案嫌犯冀中星 移送检方审查起诉】 据报道,首都机场公安分局对冀中星爆炸案侦查终结,目前已移送朝阳检察院审查起诉。7月20日,山东籍男子冀中星在首都机场T3航站楼引爆自制炸药,案发当天除冀中星左手腕因被炸截肢外,无其他人伤亡

    2. 创建方法封装jieba分词,注意还需要获得用户自定义词和停用词列表

    此步骤会在分词时将用户自定义的词看作一个整体,不会分开,比如在添加“佟掌柜”这个词之前,会将其分词成“佟”、“掌柜”,添加该词后会将“佟掌柜视为整体”。且分词后的list会过滤掉停用词列表中的词,这样像标点符号等没有意义的字或字符就不会出现在最终的集合中。

    # 创建停用词list  
    def stopwordslist(stopwords_filepath):  
        stopwords = [line.strip() for line in open(stopwords_filepath, 'r', encoding='utf-8').readlines()]  
        return stopwords  
    
    # 对句子进行分词
    def segment(text, userdict_filepath = "userdict2.txt", stopwords_filepath = 'stopwords.txt'):
        import jieba
        jieba.load_userdict(userdict_filepath)
        stopwords = stopwordslist(stopwords_filepath)  # 这里加载停用词的路径
        seg_list = jieba.cut(text, cut_all=False)
        seg_list_without_stopwords = []
        for word in seg_list:  
            if word not in stopwords:  
                if word != '\t':  
                    seg_list_without_stopwords.append(word)    
        return seg_list_without_stopwords

    用户自定义字典,命名为userdict2.txt,保存在项目文件夹下

    杜汶泽
    佟掌柜
    南都
    生活启示录
    第1名
    违和
    两
    南斗六星
    福禄寿三星
    颗
    酒驾
    晒出
    亲爱的
    命
    金贵
    冀中星
    7月20日
    T3航站楼
    B口
    案发当天
    7月29日
    微博
    炫富
    广场舞
    物种入侵
    虚假
    宣传口号
    好用
    不对
    大陆人
    才能
    干出
    能
    微新闻
    被炸

    停用词列表:https://blog.csdn.net/shijiebei2009/article/details/39696571,命名为stopwords.txt,保存在项目文件夹下

    3. 使用分词器将list of files进行分词

    totalvocab_tokenized = []
    for i in files:
        allwords_tokenized = segment(i, "userdict2.txt", 'stopwords.txt')
        totalvocab_tokenized.extend(allwords_tokenized)
    print(len(totalvocab_tokenized)) #去重前长度371,去重后256
    
    371

    4. 获得Tf-idf矩阵

    from sklearn.feature_extraction.text import TfidfVectorizer
    #max_df: When building the vocabulary ignore terms that have a document frequency strictly higher than the given threshold (corpus-specific stop words). If float, the parameter represents a proportion of documents, integer absolute counts. This parameter is ignored if vocabulary is not None.
    #min_df: When building the vocabulary ignore terms that have a document frequency strictly lower than the given threshold. This value is also called cut-off in the literature. If float, the parameter represents a proportion of documents, integer absolute counts. This parameter is ignored if vocabulary is not None.
    tfidf_vectorizer = TfidfVectorizer(max_df=0.9, max_features=200000,
                                     min_df=0.1, stop_words='english',
                                     use_idf=True, tokenizer=segment)
    #terms is just a 集合 of the features used in the tf-idf matrix. This is a vocabulary
    #terms = tfidf_vectorizer.get_feature_names() #长度258
    tfidf_matrix = tfidf_vectorizer.fit_transform(files) #fit the vectorizer to synopses
    print(tfidf_matrix.shape) #(10, 258):10篇文档,258个feature
    
    (10, 258)

    5. 计算文档相似性

    from sklearn.metrics.pairwise import cosine_similarity
    #Note that 有了 dist 就可以测量任意两个或多个概要之间的相似性.
    #cosine_similarity返回An array with shape (n_samples_X, n_samples_Y)
    dist = 1 - cosine_similarity(tfidf_matrix)

    6. 获得分类

    from scipy.cluster.hierarchy import ward, dendrogram, linkage
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #用来正常显示中文标签
    #Perform Ward's linkage on a condensed distance matrix.
    #linkage_matrix = ward(dist) #define the linkage_matrix using ward clustering pre-computed distances
    #Method 'ward' requires the distance metric to be Euclidean
    linkage_matrix = linkage(dist, method='ward', metric='euclidean', optimal_ordering=False)
    #Z[i] will tell us which clusters were merged, let's take a look at the first two points that were merged
    #We can see that ach row of the resulting array has the format [idx1, idx2, dist, sample_count]
    print(linkage_matrix)
    for index, title in enumerate(titles):
        print(index, title)
    
    [[ 3.          9.          0.35350366  2.        ]
     [ 2.          4.          1.08521531  2.        ]
     [ 7.          8.          1.2902641   2.        ]
     [ 0.          5.          1.39239608  2.        ]
     [ 1.          6.          1.40430097  2.        ]
     [13.         14.          1.42131068  4.        ]
     [12.         15.          1.4744491   6.        ]
     [11.         16.          1.62772682  8.        ]
     [10.         17.          2.2853395  10.        ]]
    
    0 #我有特别的推倒技巧#之佟掌柜收李逍遥.txt
    1 从前的称是16两为一斤,为什么要16两为一斤呢?.txt
    2 作死男晒酒驾.txt
    3 冀中星被移送检察院审查起诉.txt
    4 宝马男微博炫富晒酒驾挑逗交警 最终因被人肉求饶[汗].txt
    5 广场舞出口世界.txt
    6 方舟子:锤子改口号,换汤不换药!.txt
    7 杜汶泽宣布暂别香港 (2).txt
    8 杜汶泽宣布暂别香港.txt
    9 首都机场爆炸案嫌犯冀中星 移送检方审查起诉.txt

    7. 可视化

    plt.figure(figsize=(25, 10))
    plt.title('中文文本层次聚类树状图')
    plt.xlabel('微博标题')
    plt.ylabel('距离(越低表示文本越类似)')
    dendrogram(
        linkage_matrix,
        labels=titles, 
        leaf_rotation=-70,  # rotates the x axis labels
        leaf_font_size=12  # font size for the x axis labels
    )
    plt.show()
    plt.close()

    展开全文
  • https://blog.csdn.net/zhaoxinfan/article/details/11069485 好文
    展开全文
  • 【Java】文本聚类

    2021-03-04 02:23:10
    【Java】文本聚类前言:由于接到...我就想着使用 主题抽取模型抽取长文本转化为短文本,再利用 文本聚类 的方法,把相似的文本存放到一起准备工作由于需要处理表格数据,这里我用到了java的 poi 框架安装:由于我是...
  • 利用word2vec对关键词聚类

    千次阅读 2016-10-17 03:10:13
    利用word2vec对关键词进行聚类 package com.purelearning; import love.cq.util.IOUtil; import org.ansj.domain.Term; import org.ansj.splitWord.analysis.ToAnalysis; import java.io.BufferedReader; import...
  • 四、(2) 文本层次聚类

    千次阅读 2019-05-18 11:30:35
    四、(1) 层次聚类 层次聚类方法的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。该方法的优点是可随时停止划分,主要步骤如下: (1)移除网络中的所有边,...
  • import re import os import string import jieba import logging import sys import codecs import traceback ...# tfidf_Result.txt记录关键词及对应文本重要性 # cluster_Result.txt记录聚类结果文件名+对应类别
  • HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构...提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能。
  • 基于VSM的文本聚类算法 这部分主要参考2008年上海交通大学姚清坛等《基于向量空间模型的文本聚类算法》的论文,因为我的实体对齐使用InfoBox存在很多问题,发现对齐中会用到文本内容及聚类算法,所以简单讲述下文章...
  • 自然语言处理系列-2-文本聚类

    千次阅读 2018-09-19 15:07:07
    本文主要简要介绍文本聚类, 1: 什么是文本聚类 先说说聚类的概念,聚类又称群分析,是数据挖掘的一种重要的思想,聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,...
  • 1.TF-IDF昨天给大家演示简单的文本聚类,但要给每个聚类再提取一两个关键词用于表示该聚类。我们还是用TFIDF算法来做,因为这是比较简单的提取特征算法,不过这里的TF是指某词在本聚类内所有文章的词频,而不是本...
  • 现有某大闸蟹电商负面评论5000条,txt文本,一行一条,举例如下,任务是要对其进行文本分析。读入所有文档并分词,统计词频,找到高频词,确定特征集,为每一条评论生成向量表示,计算一下不同评论之间的距离...
  • 基于LDA的文本主题聚类Python实现

    千次阅读 2020-02-24 18:48:14
    它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了...
  • 文本聚类(一)—— LDA 主题模型

    千次阅读 多人点赞 2020-09-20 16:09:07
    目录文本聚类一、LDA 主题模型1.1 加载数据集1.2 数据清洗、分词1.3 构建词典、语料向量化表示1.4 构建 LDA 模型1.5 小结 文本聚类 因工作需要,近期需要做一些文本聚类方面的事情,算法方面主要选择的是传统的机器...
  • 文本话题聚类(Kmeans/LDA)

    千次阅读 2019-03-30 21:23:51
    K-means 1 聚类是一种无监督的学习方法。聚类区别于分类,即事先不知道要寻找的内容,没有...3 K-means聚类算法,是一种广泛使用的聚类算法,其中k是需要指定的参数,即需要创建的簇的数目,K-means算法中的k个簇的...
  • 文本聚类(二)—— KMeans 聚类

    千次阅读 2020-10-13 15:07:22
    目录二、KMeans 聚类2.1 加载数据集2.2 数据清洗2.3 文本向量化2.4 文本聚类2.5 关键词展示2.6 判定最佳聚类数参考文档 这第一篇内容中,我们介绍了 LDA 主题模型,这一篇,我们将介绍经典的 KMeans 聚类算法在文本...
  • 基于关键词的学术文本聚类集成研究.pdf
  • 鬼吹灯文本挖掘1:jieba分词和CountVectorizer向量化鬼吹灯文本挖掘2:wordcloud 词云展示鬼吹灯文本挖掘3:关键词提取和使用sklearn 计算TF-IDF矩阵鬼吹灯文本挖掘4:LDA模型提取文档主题 sklearn LatentDirichlet...
  • Python之 文本聚类

    2020-11-26 04:13:03
    import re import os import string import jieba ...一行是一个文本 # tf_Result.txt记录关键词及对应文本出现频数 # tfidf_Result.txt记录关键词及对应文本重要性 # cluster_Result.txt记录聚类结果文件名+对应类别
  • NLP笔记之文本聚类

    2021-02-25 20:01:27
    NLP笔记之文本聚类 一、概述 文本聚类聚类文本上的应用。由浅入深,需要先介绍聚类的思想。 二、聚类思想简介 聚类是将给定对象的集合划分为不同子集的过程,目标是使每个子集内部的元素尽量相似,不同子集(簇...
  • 文本聚类

    2021-01-03 15:33:43
    注意,单词的颗粒度(分词、新词提取、关键词提取) < 短语的颗粒度(短语提取) < 句子的颗粒度(关键句提起) < 文章颗粒度(聚类),这些无监督任务一直体现着高内聚、低耦合的原则。 2 问题 对多个...
  • sklearn做文本聚类分析

    2021-03-28 09:14:31
    文本Kmeans聚类分析前言背景目的与思路数据预处理分词处理采用jieba分词停用词处理获取停用词表去除停用词生成tf-idf矩阵Kmeans聚类获取分类获取分类文档获取主题词结论 前言 背景 为了研究用户对数字音乐付费的...
  • 文本关键词提取方法综述

    千次阅读 2018-11-29 10:26:49
    第二步,使用关键词提取算法提取关键词。 最后得到的关键词应满足以下三个条件: 1·、Understandable. The keyphrases are understandable to people. This indicates the extracted keyphrases shoul...
  • 在现实生活中,人想做词云,也有了关键词的数据但自己又不会做词云可怎么办,我给大家推荐几款词云制作工具,让你瞬间呈现美观、酷炫的词云可视化。我们先来看看国外的词云制作工具:1、WordleWordle是一个用于从...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,387
精华内容 2,954
关键字:

文本关键词聚类