精华内容
下载资源
问答
  • 文本聚类

    2018-04-23 11:49:00
    文本聚类就是要在一堆文档中,找出哪些文档具有较高的相似性,然后可以针对这些相似文档的聚合进行类别划分。本文聚类应用场景:提供大规模文档集进行类别划分并提取公共内容的概括和总览;找到潜在的各个文档间的...

    文本聚类就是要在一堆文档中,找出哪些文档具有较高的相似性,然后可以针对这些相似文档的聚合进行类别划分。本文聚类应用场景:提供大规模文档集进行类别划分并提取公共内容的概括和总览;找到潜在的各个文档间的相似度进行相似度判别、类别修正,以减少浏览相似文档和信息的时间和精力。

    通常,聚类分析是针对数值型做计算的,K均值这类基于聚类的算法要求只有数值型变量才能得到距离相似度。对于文本聚类而言,由于不同文本集出现的全部都是文字内容,因此无法直接针对这些文本进行聚类。

    实现文本聚类,除了要进行必要的文本数据清洗和预处理外,还有两个前置条件:

    • 分词。分词是实现聚类条件的第一个必要步骤,分词之后会得到不同文本集已经分割好的单词(常用的分词方法:最大匹配法、逆向最大匹配法、双向匹配法、最佳匹配法、联想-回溯法)。
    • word to vector。也称为文本转向量、词转向量,目的是将不同文本集的单词集合,转换为向量集合,然后通过向量空间模型建立向量矩阵。(常采用向量空间模型来描述文本向量,即将文档作为行,将分词后得到的单词(单词在向量空间模型里面被称为向量)作为列,而矩阵的值则是通过词频统计算法得到的值。这种空间向量模型又称文档特征矩阵。)

    完成上述两个基本步骤后,可以基于向量矩阵做文本聚类分析、情感分析、词频统计、相似词频等。

     

    转载于:https://www.cnblogs.com/keye/p/8917197.html

    展开全文
  • 简介鉴于基于划分的文本聚类方法只能识别球形的聚类,因此本文对基于密度的文本聚类算法展开研究。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,可以找出...

    简介

    鉴于基于划分的文本聚类方法只能识别球形的聚类,因此本文对基于密度的文本聚类算法展开研究。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,可以找出形状不规则的聚类,而且聚类时无需事先知道聚类的个数。

    基本概念

    DBSCAN算法中有两个核心参数:Eps和MinPts(文献与程序中经常使用)。前者定义为邻域半径,后者定义为核心对象的阈值。本文为了描述方便,下文将Eps和MinPts分别简记为E和M。

    (1)   E邻域:给定对象半径E内的区域成为该对象的E邻域。该E邻域为球形,其半径的界定可以采用距离(欧式距离)、余弦相似度、Word2Vec等表征,本文实现采用余弦相似度来表征。

    (2)   核心对象:若给定对象E 邻域内的对象(样本点)个数大于等于M,则称该对象为核心对象。

    (3)   直接密度可达:给定一个对象集合D,若对象p在q的E 邻域内,且q是一个核心对象,则称对象p从对象q出发是直接密度可达的(directly density-reachable)。

    (4)   密度可达:给定一个对象集合D,若存在一个对象链p1,p2,p3,...,pn,p1=q,pn=p,对于pi属于D,i属于1~n,p(i+1)是从pi关于E和M直接密度可达的,则称对象p从对象q关于E和M密度可达的。

    (5)   密度相连:给定一个对象集合D,若存在对象o属于D,使对象p和q均从o关于E和M密度可达的,那么对于对象p到q是关于E和M密度相连的。

    (6)   边界对象:给定一个对象集合D,若核心对象p中存在对象q,但是q对象自身并非核心对象,则称q为边界对象。

    (7)   噪声对象:给定一个对象集合D,若对象o既不是核心对象,也不是边界对象,则称o为噪声对象。

    图1 集合对象

    如图1所示,其设定M=3,红色节点为核心对象,黄色节点为边界节点,蓝色为噪声节点。

    DBSCAN算法不仅能对对象进行聚类,同时还能识别噪声对象,即不属于任何一个聚类。需要指出:密度可达是直接密度可达的传递闭包,这种关系是非对称的,只有核心对象之间相互密度可达;但是,密度相连是一种对称的关系。

    DBSCAN的核心思想:寻找密度相连的最大集合,即从某个选定的核心对象(核心点)出发,不断向密度可达的区域扩张,从而得到一个包含核心对象和边界对象的最大化区域,区域中任意两点密度相连。

    算法伪代码(参考维基百科):

    1 DBSCAN(D, eps, MinPts) {2 C = 0

    3 for each point P indataset D {4 if P isvisited5 continuenext point6 mark P asvisited7 NeighborPts =regionQuery(P, eps)8 if sizeof(NeighborPts)

    17 expandCluster(P, NeighborPts, C, eps, MinPts) {18 add P to cluster C19 for each point P'in NeighborPts {

    20 if P'is not visited {

    21 mark P'as visited

    22 NeighborPts'= regionQuery(P', eps)23 if sizeof(NeighborPts') >= MinPts

    24 NeighborPts = NeighborPts joined with NeighborPts'25 }26 if P'is not yet member of any cluster

    27 add P'to cluster C

    28 }29 }30

    31 regionQuery(P, eps)32 return all points within P's eps-neighborhood (including P)

    程序源代码如下:

    1 importjava.util.List;2

    3 importcom.gta.cosine.ElementDict;4

    5 public classDataNode {6 private Listterms;7 private booleanisVisited;8 private intcategory;9

    10 public DataNode(Listterms)11 {12 this.terms =terms;13 this.isVisited = false;14 this.category = 0;15 }16

    17

    18 public void setVisitLabel(booleanisVisited)19 {20 this.isVisited =isVisited;21 }22

    23

    24 public void setCatagory(intcategory)25 {26 this.category =category;27 }28

    29

    30 public booleangetVisitLabel()31 {32 returnisVisited;33 }34

    35

    36 public intgetCategory()37 {38 returncategory;39 }40

    41

    42 public ListgetAllElements()43 {44 returnterms;45 }46

    47 }

    1 importjava.util.List;2 importjava.util.ArrayList;3

    4 importcom.gta.cosine.TextCosine;5 importcom.gta.cosine.ElementDict;6

    7 public classDBScan {8 private doubleeps;9 private intminPts;10 privateTextCosine cosine;11 private intthreshold;12 private ListdataNodes;13 private intdelta;14

    15 publicDBScan()16 {17 this.eps = 0.20;18 this.minPts = 3;19 this.threshold = 10000;20 this.cosine = newTextCosine();21 this.delta = 0;22 dataNodes = new ArrayList();23 }24

    25

    26 public DBScan(double eps, int minPts, intthreshold)27 {28 this.eps =eps;29 this.minPts =minPts;30 this.threshold =threshold;31 this.cosine = newTextCosine();32 this.delta = 0;33 dataNodes = new ArrayList();34 }35

    36

    37 public void setThreshold(intthreshold)38 {39 this.threshold =threshold;40 }41

    42

    43 public intgetThreshold()44 {45 returnthreshold;46 }47

    48

    49 public doublegetEps()50 {51 returneps;52 }53

    54

    55 public intgetMinPts()56 {57 returnminPts;58 }59

    60

    61 public List getNeighbors(DataNode p, Listnodes)62 {63 List neighbors = new ArrayList();64 List vec1 =p.getAllElements();65 List vec2 = null;66 double countDistance = 0;67 for(DataNode node : nodes)68 {69 vec2 =node.getAllElements();70 countDistance =cosine.analysisText(vec1, vec2);71 if (countDistance >=eps)72 {73 neighbors.add(node);74 }75 }76 returnneighbors;77 }78

    79

    80 public List cluster(Listnodes)81 {82 int category = 1;83 for(DataNode node : nodes)84 {85 if (!node.getVisitLabel())86 {87 node.setVisitLabel(true);88 List neighbors =getNeighbors(node, nodes);89 if (neighbors.size()

    94 {95 node.setCatagory(category);96 expandCluster(neighbors, category, nodes);97 }98 }99 category ++;100 }101

    102 returnnodes;103 }104

    105

    106 public void expandCluster(List neighbors, int category, Listnodes)107 {108 for(DataNode node : neighbors)109 {110 if (!node.getVisitLabel())111 {112 node.setVisitLabel(true);113 List newNeighbors =getNeighbors(node, nodes);114 if (newNeighbors.size() >=minPts)115 {116 expandCluster(newNeighbors, category, nodes);117 }118 }119

    120 if (node.getCategory() <= 0) //not be any of category

    121 {122 node.setCatagory(category);123 }124 }125 }126

    127

    128 public void showCluster(Listnodes)129 {130 for(DataNode node : nodes)131 {132 List ed =node.getAllElements();133 for(ElementDict e: ed)134 {135 System.out.print(e.getTerm() + " ");136 }137 System.out.println();138 System.out.println("所属类别: "+node.getCategory());139 }140 }141

    142

    143 public voidaddDataNode(String s)144 {145 List ed =cosine.tokenizer(s);146 DataNode dataNode = newDataNode(ed);147 dataNodes.add(dataNode);148 delta ++;149 }150

    151

    152 public voidanalysis()153 {154 if (delta >=threshold)155 {156 showCluster(cluster(dataNodes));157 delta = 0;158 }159 }160 }

    关于计算余弦相似度及其源代码,见本系列之文本挖掘之文本相似度判定。本文考虑到随着文本数量的递增,文本聚类结果会分化,即刚开始聚类的文本与后面文本数据相差甚远,本文非常粗略地采用门限值进行限定,本文后续系列联合KMeans和DBSCAN进行解决,若有更好的方法,请联系我。

    需要指出:DBSCAN算法对输入参数E和M非常敏感,即参数稍有变化,其聚类结果则会有明显变化。此外,对E和M的选择在实际应用中,需要大规模数据集调优选择(小数据集另当别论),同时对该算法进行改进也是重要研究方向。

    作者:志青云集

    出处:http://www.cnblogs.com/lyssym

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。

    如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。

    如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    展开全文
  • java文本聚类程序代码文件,实现文本聚类功能,分词
  • 【Java】文本聚类前言:由于接到...我就想着使用 主题抽取模型抽取长文本转化为短文本,再利用 文本聚类 的方法,把相似的文本存放到一起准备工作由于需要处理表格数据,这里我用到了java的 poi 框架安装:由于我是...

    【Java】文本聚类

    前言:

    由于接到一个任务,大概是对回复内容的质量进行评估(有点类似于情感分类),由于这种分类,没有定性的指标,只能认为规定 好——坏 之间的几个梯度指标,但由于有些回复的内容过长,人工打标签的时候不方便,我就想着使用 主题抽取模型抽取长文本转化为短文本,再利用 文本聚类 的方法,把相似的文本存放到一起

    准备工作

    由于需要处理表格数据,这里我用到了java的 poi 框架

    安装:

    由于我是使用mavan构建的项目,所以直接添加依赖就可以了

    org.apache.poi

    poi

    3.11

    org.apache.poi

    poi-ooxml

    3.11

    org.apache.poi

    poi-ooxml-schemas

    3.11

    文本聚类和主题抽取

    我直接采用hanlp这个框架中的模型

    项目流程

    1578eda404fe

    项目流程.png

    具体实现

    package com.NLP.test;

    import com.hankcs.hanlp.HanLP;

    import com.hankcs.hanlp.mining.cluster.ClusterAnalyzer;

    import org.apache.poi.xssf.usermodel.XSSFCell;

    import org.apache.poi.xssf.usermodel.XSSFRow;

    import org.apache.poi.xssf.usermodel.XSSFSheet;

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.util.List;

    import java.util.Set;

    public class TextCluster {

    public static void main(String[] args) throws IOException {

    //聚类器分析器

    ClusterAnalyzer analyzer = new ClusterAnalyzer();

    //读入数据

    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("附件4.xlsx"));

    XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);

    //

    int count = xssfSheet.getLastRowNum();

    for(int i = 0;i<=count;i++){

    XSSFRow xssfRow = xssfSheet.getRow(i);

    XSSFCell xssfCell = xssfRow.createCell(7,5);

    XSSFCell cateCell = xssfRow.createCell(8);

    cateCell.setCellValue(-1);

    if(i!=0){

    String text = xssfRow.getCell(5).getStringCellValue();

    String id = String.valueOf(xssfRow.getCell(0).getNumericCellValue());

    if(text.length()<50){

    }else {

    List results = HanLP.extractSummary(text, 2);

    String tempTest="";

    for(String item:results){

    tempTest+=item+",";

    }

    text = tempTest;

    }

    xssfCell.setCellValue(text);

    analyzer.addDocument(id,text);

    }else {

    xssfCell.setCellValue("shortText");

    }

    }

    System.out.println(analyzer.repeatedBisection(1.0));

    int categorynum = 0;

    for(Set item:analyzer.repeatedBisection(1.0)){

    for(String uid:item){

    for(int i = 1;i<=count;i++){

    XSSFRow xssfRow = xssfSheet.getRow(i);

    String id = String.valueOf(xssfRow.getCell(0).getNumericCellValue());

    if(id.equals(uid)){

    xssfRow.getCell(8).setCellValue(categorynum);

    }

    }

    }

    categorynum++;

    }

    //生成数据

    xssfWorkbook.write(new FileOutputStream("附件4_转换.xlsx"));

    }

    }

    展开全文
  • 小编觉得python中的文本聚类文本聚类不错,分类的速度比较快,而且不会以出现分类混乱的问题。小编整理了有关文本聚类用来分类的代码,分享给小伙伴们一起尝试一下。主要有一下几个步骤:切词去除停用词构建词袋空间...

    当我们想要给表格中的内容进行分类,一般人想到的是excel中的做法。那还有没有什么特别好的解决办法呢?小编觉得python中的文本聚类文本聚类不错,分类的速度比较快,而且不会以出现分类混乱的问题。小编整理了有关文本聚类用来分类的代码,分享给小伙伴们一起尝试一下。

    主要有一下几个步骤:

    切词

    去除停用词

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

    TF-IDF构建词权重,这部我没有做,因为我的数据基本都是一类的,只是想细分,所以感觉不太适合,而且这个也有点难(捂脸)

    使用K-means算法

    下面开始代码部分:#引入基础库,在网上抄的代码,除了1、2、6,其他的可能用不到

    import numpy as np

    import pandas as pd

    import re

    import os

    import codecs

    import jieba

    #打开文件,文件在桌面上,可以自行修改路径

    f1=open("C:/Users/KangB/Desktop/wechat7/title.txt","r",encoding='GB2312',errors='ignore')

    f2=open("C:/Users/KangB/Desktop/wechat7/title_fenci.txt",'w',encoding='GB2312',errors='ignore')

    for line in f1:

    seg_list = jieba.cut(line, cut_all=False)

    f2.write((" ".join(seg_list)).replace("\t\t\t","\t"))

    #print(w)

    f1.close()

    f2.close()

    #取需要分词的内容

    titles=open("C:/Users/KangB/Desktop/wechat7/title_fenci.txt",encoding='GB2312',errors='ignore').read().split('\n')

    #查看内容,这里是一个list,list里面每个原素是分好的标题,查看下长度看有没有错误

    #titles

    #len(titles)

    #构建停词函数,停词表是自己在网上搜的

    def get_custom_stopwords(stop_words_file):

    with open(stop_words_file,encoding='utf-8')as f:

    stopwords=f.read()

    stopwords_list=stopwords.split('\n')

    custom_stopwords_list=[i for i in stopwords_list]

    return custom_stopwords_list

    #停用词函数调用

    stop_words_file="C:/Users/KangB/Desktop/wechat7/stopwords.txt"

    stopwords=get_custom_stopwords(stop_words_file)

    #查看停用词,也是list格式

    #stopwords

    #构建词向量,也就是把分好的次去除停词转化成kmeans可以接受的形式

    from sklearn.feature_extraction.text import CountVectorizer

    count_vec=CountVectorizer(stop_words=stopwords)

    km_matrix= count_vec.fit_transform(titles)

    print(km_matrix.shape)

    #查看词向量

    #print(km_matrix.toarray())

    #开始聚类啦

    from sklearn.cluster import KMeans

    num_clusters = 4 #聚为四类,可根据需要修改

    km = KMeans(n_clusters=num_clusters)

    km.fit(km_matrix)

    clusters = km.labels_.tolist()

    #查看聚类的结果,是list,这里省略,看看长度是不是和title一样就行啦

    #len(clusters)

    #最后把聚类结果写在一个新的txt里面

    f3 =open("C:/Users/KangB/Desktop/wechat7/title_clusters.txt", 'w',encoding='GB2312',errors='ignore')

    for i in clusters:

    f3.write(str(i))

    f3.write("\n")

    f3.close()

    最后把原始数据title和聚类结果title_clusters在一个excel里面不同列打开就可以啦。

    不知道有没有小伙伴们试了文本聚类的分类方法,是不是跟小编说的一样好用呢?小编相信试过的小伙伴,肯定下次还会使用这种分类方法的。

    展开全文
  • 在线文本聚类论文

    2018-04-23 09:16:09
    最新的在线文本聚类的论文,做文本聚类的可以看看,很有价值
  • 文本聚类算法

    2020-04-22 14:58:34
    文本聚类算法(Python实现DBSCAN和K-Means)文本聚类算法分类使用DBSCAN进行文本聚类DBSCAN 算法介绍DBSCAN python实现使用K-Means进行文本聚类k-Means 算法介绍K-means Python实现 文本聚类算法分类 1、划分法...
  • 花了好几天时间学习了文本聚类,以下记录一下这次的学习,也整理了一些这方面的资料,和大家分享一下,一起交流学习,进步在于不断总结和分享以及相互交流。文本聚类就是把相似的文档聚集成一簇,通过把文本转换成...
  • 文本聚类在很多领域都有广泛应用,而聚类算法作为文本聚类的核心直接决定了聚类的效果和效率。结合基于划分的聚类算法和基于密度的聚类算法的优点,提出了基于密度的聚类算法DBCKNN。算法利用了k近邻和离群度等概念...
  • 文本聚类教程

    万次阅读 多人点赞 2017-12-07 15:53:29
    文本聚类教程 本人曾做机器学习方向,由于实习需要转做文本聚类、分类的工作,虽然大致相似,但仍是新手,过程和结果也仅供大神指教。本博包含了作者两周的专心研究调试及由数千行测试得到了300余行...
  • 文本聚类2

    2019-10-06 00:30:37
    文本聚类2 文本聚类2 - riky - 博客园文本聚类2A.问题背景 聚类是对数据对象进行划分的一种过程,与分类不同的是,它所划分的类是未知的,故此,这是一个“无指导的学习”(unsupervisedlearning)过程,...
  • 文本聚类的重构策略研究
  • python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,836
精华内容 1,134
关键字:

文本聚类