文本挖掘之文本聚类(借力打力)

刘勇    Email:[email protected]

简介

  在文本相似度判定中,作者将该算法用于文本聚类中,其核心思想通过比较两个文本向量中元素的相似度,即向量中所含的元素相似个数越多,则两个向量越相似,继而上述文本越相似。作者在短文本相似判定中采用了余弦相似度该算法来实现,本文借鉴数学集合取交集,借用现有组件来实现上述算法功能,继而减少工作量,也具备便捷性,也能取得较好的效果。

数学集合

  该方法的思想为:先将文本数据采用中文切分,将其切分为词汇(词组、短语、词汇的统称,本文不做细粒度划分),并以某种特征表示进行量化(本文按词频量化),通过取文本向量的交集,若交集的重复率为70%,则判定两篇文本相似。通过将相似文本聚合成链表存储,进而能实现文本聚类。

  以下内容则以python中具体实现来阐述。

1 def match_topic(self, keywords, topics):
2         keywords = set(keywords)
3         keywords_count = len(keywords)
4         for topic in topics:
5             intersection = keywords.intersection(topic[‘keywords‘])
6             if len(intersection) > keywords_count * 0.7 or len(intersection) > len(topic[‘keywords‘]) * 0.7:
7                 yield topic

  备注:keywords 制定匹配话题关键字列表,tipics为待匹配文本数据,每条数据为一个JSON对象,其中包含Web文本数据的标题、内容、发布时间等信息。其中涉及到长句与短句的关系,因此文本采用“或”操作来确定匹配话题,实现话题聚类。

Elasticsearch

  Elasticsearch是全文检索服务器,采用倒排索引对词汇建立索引,因此在文本检索方面具有较大的效率优势。本文将该工具以类似数学集合的方式来组织,继而实现文本聚类。

  以下内容则以Java中具体实现来阐述。

 1 import org.elasticsearch.action.index.IndexRequestBuilder;
 2 import org.elasticsearch.action.index.IndexResponse;
 3 import org.elasticsearch.action.search.SearchResponse;
 4 import org.elasticsearch.client.Client;
 5 import org.elasticsearch.client.transport.TransportClient;
 6 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 7 import org.elasticsearch.index.query.QueryBuilder;
 8 import org.elasticsearch.index.query.QueryBuilders;
 9 import org.elasticsearch.search.SearchHit;
10 import org.elasticsearch.search.SearchHits;
11
12 import java.util.List;
13 import org.elasticsearch.node.NodeBuilder.*;
14
15 public class SearchHandler {
16     private Client client;
17
18     public SearchHandler(String ipAddress)
19     {
20         client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));
21     }
22
23
24     public void createIndexResponse(String indexName, String type, List<String> data)
25     {
26         IndexRequestBuilder requestBuilder = client.prepareIndex(indexName, type).setRefresh(true);
27         int len = data.size();
28         for (int i = 0; i < len; i++)
29             requestBuilder.setSource(data.get(i)).execute().actionGet();
30
31     }
32
33
34     public IndexResponse createIndexResponse(String indexName, String type, String data)
35     {
36         IndexResponse response = client.prepareIndex(indexName, type).setSource(data).execute().actionGet();
37         return response;
38     }
39
40
41     public void searchResponse(QueryBuilder queryBuilder, String indexName, String type)
42     {
43         SearchResponse searchResponse = client.prepareSearch(indexName).setTypes(type)
44                 .setQuery(queryBuilder)
45                 .setMinScore((float)3)
46                 .setSize(10)
47                 .execute()
48                 .actionGet();
49         SearchHits hits = searchResponse.getHits();
50         System.out.println("查询到记录数=" + hits.getTotalHits());
51         SearchHit[] searchHits = hits.getHits();
52         for (SearchHit hit : searchHits) {
53             String keywords = (String)hit.getSource().get("title");
54             System.out.println(keywords);
55         }
56     }
57 }
 1 import org.elasticsearch.index.query.QueryBuilder;
 2 import org.elasticsearch.index.query.QueryBuilders;
 3
 4 public class Test {
 5
 6     public static void main(String[] args) {
 7         SearchHandler sh = new SearchHandler("192.168.101.243");
 8         String indexName = "title";
 9         String type = "test";
10
11         QueryBuilder qb = QueryBuilders.matchQuery(indexName, "主持政治局常委会").minimumShouldMatch("70%").boost((float)0.2);
12         long start = System.currentTimeMillis();
13         sh.searchResponse(qb, indexName, type);
14         long end = System.currentTimeMillis();
15
16         System.out.println("查询所需时间为: " + (end -start) + " ms");
17     }
18 }

  针对匹配存在长句与短句特例,详细内容文本相似度判定中具体描述,其解决方案为采用两次检索实现,以下内容根据项目中实际经验设定的数值,读者可根据应用场景具体设置:

  1)若匹配文本为长句,见matchQuery,则设定minimumShouldMatch("70%"),该部分与集合取交集等同,然后设置setMinScore((float)3),即将Elasticsearch检索的评分稍微设置高一点;

  2)若待匹配文本为短句,则设定minimumShouldMatch("90%"),该部分与集合取交集等同,然后设置setMinScore((float)0.7),即将Elasticsearch检索的评分稍微设置低一点。

总结

  本文介绍了两种借助现有组件实现文本聚类的方法,上述方法具有便捷性,经过实际大量Web文本数据测试,上述方法均实用、可行。本文作者推荐采用Elasticsearch实现的方法,由于对文本处理应用经常会使用文本检索服务,因此引入Elasticsearch,可以为后续应用扩展提供便利。后续本文作者将从机器学习角度介绍文本聚类算法。



  作者:志青云集
  出处:http://www.cnblogs.com/lyssym
  如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
  如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
  如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。



文本挖掘之文本聚类(借力打力)

时间: 2024-08-04 03:24:31

文本挖掘之文本聚类(借力打力)的相关文章

文本挖掘之文本聚类(MapReduce)

刘 勇  Email:[email protected] 简介 针对大数量的文本数据,采用单线程处理时,一方面消耗较长处理时间,另一方面对大量数据的I/O操作也会消耗较长处理时间,同时对内存空间的消耗也是很大,因此,本文引入MapReduce计算模型,以分布式方式处理文本数据,以期提高数据处理速率.本文结合Kmeans和DBSCAN算法,对上述算法进行改进,其中借鉴Kmeans聚类方法(类别个数的确定性)以及DBSCAN聚类方法(基于密度),并在数据处理过程中引入多个Reducer对数据进行归并

文本挖掘之文本聚类(OPTICS)

刘 勇  Email:[email protected] 简介 鉴于DBSCAN算法对输入参数,领域半径E和阈值M比较敏感,在参数调优时比较麻烦,因此本文对另一种基于密度的聚类算法OPTICS(Ordering Points To Identify the Clustering Structure)展开研究,其为DBSCAN的改进算法,与DBSCAN相比,该算法对输入参数不敏感.OPTICS算法不显示地生成数据聚类,其只是对数据对象集合中的对象进行排序,获取一个有序的对象列表,其中包含了足够的信

文本挖掘之文本聚类(DBSCAN)

刘勇   Email:[email protected] 简介 鉴于基于划分的文本聚类方法只能识别球形的聚类,因此本文对基于密度的文本聚类算法展开研究.DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,可以找出形状不规则的聚类,而且聚类时无需事先知道聚类的个数.  基本概念 DBSCAN算法中有两个核心参数:Eps和MinPts(文献与程序中经常使用).前者定义为邻域半径,后者定义

R语言做文本挖掘 Part3文本聚类

Part3文本聚类 分类和聚类算法,都是数据挖掘中最常接触到的算法,分类聚类算法分别有很多种.可以看下下面两篇文章对常见的分类聚类算法的简介: 分类算法:http://blog.csdn.net/chl033/article/details/5204220 聚类算法:http://blog.chinaunix.net/uid-10289334-id-3758310.html 文本分类聚类会要用到这些算法去实现,暂时不用深究算法细节,R中已经有成熟的可以直接调用的这些算法了.大概说下分类和聚类的差

[python] 使用Jieba工具中文分词及文本聚类概念

声明:由于担心CSDN博客丢失,在博客园简单对其进行备份,以后两个地方都会写文章的~感谢CSDN和博客园提供的平台.        前面讲述了很多关于Python爬取本体Ontology.消息盒InfoBox.虎扑图片等例子,同时讲述了VSM向量空间模型的应用.但是由于InfoBox没有前后文和语义概念,所以效果不是很好,这篇文章主要是爬取百度5A景区摘要信息,再利用Jieba分词工具进行中文分词,最后提出文本聚类算法的一些概念知识.        相关文章:        [Python爬虫]

一个简单的文本聚类实现(python)

具体实现如下,使用python+结巴分词+scikit-learn实现一个简单的文本聚类得到会议室数据,直接从DBA线上数据库得到预约数据,如下所示,共有3列,分别是会议ID,会议标题和会议时间 因为是中文,因此要进行分词,使用结巴分词对会议标题进行分词并过滤停用词分词代码如下(jiebafenci.py) #encoding=utf-8 import sys import re import codecs import os import shutil import jieba import

文本挖掘之文本推荐(子集合生成)

刘 勇   Email:[email protected] 简介 在研究文本推荐算法时,需要挖掘关键字之间的规则,其中比较重要的一步是构建关键字的集合,即需要求取一个集合的所有子集.因此本文根据需求,采用3种方式实现该算法,以期对后续算法研究提供帮助. 本文下面从二叉树递归.位图和集合3个角度,对该算法进行研究与实现. 二叉树递归 为简要描述,采用数据集为:A= {1,2,3}.二叉树递归如下图-1所示. 图-1 二叉树递归过程 对图-1采用二叉树递归解释为:集合中每个元素有2中状态,属于某个集

利用LDA进行文本聚类(hadoop, mahout)

项目原理概述 利用sqoop将数据从MySQL导入到HDFS中,利用mahout的LDA的cvb实现对输入数据进行聚类,并将结果更新到数据库中.数据流向图如下 mahout算法分析 输入数据格式为<IntegerWritable, VectorWritable>的matrix矩阵,key为待聚类文本的数字编号,value为待聚类文本的单词向量Vector, Vector的index为单词在字典中的编号, value为TFIDF值. 算法相关参数详解(不包含hadoop运行参数)项目中所有参数设

文本聚类教程

本人曾做机器学习方向,由于实习需要转做文本聚类.分类的工作,虽然大致相似,但仍是新手,过程和结果也仅供大神指教.本博包含了作者两周的专心研究调试及由数千行测试得到了300余行代码精华,如需转载,请注明出处. 什么是文本聚类? 文本聚类是将一个个文档由原有的自然语言文字信息转化成数学信息,以高维空间点的形式展现出来,通过计算那些点距离比较近来将那些点聚成一个簇,簇的中心叫做簇心.一个好的聚类要保证簇内点的距离尽量的近,但簇与簇之间的点要尽量的远. 文本聚类的难点是什么? 聚类是一种非监督学习,也就