采用基于Java的开源搜索结果聚合引擎,Carrot2 2.0 中的后缀树算法
Carrot2 可以自动的把搜索结果归类到相应的语义类别中,这个功能是通过Carrot2一个现成的组件完成的,除此之外Carrot2 还包括了很多其他的搜索结果聚合聚类算法。
因为没有做中文分词,也没有中文的Stopword,所以我们用英文测试,实现代码
1SnippetTokenizer snippetTokenizer = new SnippetTokenizer();
2 List<DocReference> documentReferences = new ArrayList<DocReference>();
3 List<TokenizedDocument> documents = new ArrayList<TokenizedDocument>();
4 TokenizedDocument doc = null;
5 DocReference documentReference = null;
6
7 //从搜索引擎google获取100篇数据
8 {
9 String url = "http://www.google.com/search?as_q=phone&num=100&hl=en&newwindow=1&btnG=Google+Search&as_epq=&as_oq=&as_eq=&lr=&as_ft=i&as_filetype=&as_qdr=all&as_nlo=&as_nhi=&as_occt=any&as_dt=i&as_sitesearch=&as_rights=&safe=images";
10 byte[] pageHtml = HttpUtil.getPage(url);
11 if(pageHtml == null ) return ;
12 try {
13 String strHtml = new String(pageHtml, "utf-8");
14 String[][] result = StringUtil.splitByReg(strHtml,"<td class=j>(.*?)<br>");
15
16 if(result != null)
17 { for(int i=0;i<result.length;i++)
18 {
19 for(int j=0;j<result[i].length;j++)
20 {
21 doc = snippetTokenizer
22 .tokenize(new RawDocumentSnippet(i+"sen"+j,result[i][j].replaceAll("<[^<>]+>",""), "en"));
23 documentReference = new DocReference(doc);
24 documentReferences.add(documentReference);
25 documents.add(doc);
26 }
27 }
28 }
29 } catch (UnsupportedEncodingException e) {
30 e.printStackTrace();
31 }
32 }
33
34
35 //构建后缀树
36 final STCEngine stcEngine = new STCEngine(documentReferences);
37 stcEngine.createSuffixTree();
38 HashMap<String,String> defaults = new HashMap<String,String>();
39 defaults.put("lsi.threshold.clusterAssignment", "0.150");
40 defaults.put("lsi.threshold.candidateCluster", "0.775");
41 final StcParameters params = StcParameters.fromMap(defaults);
42 stcEngine.createBaseClusters(params);
43 stcEngine.createMergedClusters(params);
44
45 final List clusters = stcEngine.getClusters();
46 int max = params.getMaxClusters();
47
48 // Convert STC's clusters to the format required by local interfaces.
49 final List rawClusters = new ArrayList();
50 for (Iterator i = clusters.iterator(); i.hasNext() && (max > 0); max--)
51 {
52 final MergedCluster b = (MergedCluster) i.next();
53 final RawClusterBase rawCluster = new RawClusterBase();
54
55 int maxPhr = 3; // TODO: This should be a configuration parameter moved to STCEngine perhaps.
56 final List phrases = b.getDescriptionPhrases();
57 for (Iterator j = phrases.iterator(); j.hasNext() && (maxPhr > 0); maxPhr--)
58 {
59 Phrase p = (Phrase) j.next();
60 rawCluster.addLabel(p.userFriendlyTerms().trim());
61 }
62
63 for (Iterator j = b.getDocuments().iterator(); j.hasNext();)
64 {
65 final int docIndex = ((Integer) j.next()).intValue();
66 final TokenizedDocument tokenizedDoc = (TokenizedDocument) documents.get(docIndex);
67 final RawDocument rawDoc = (RawDocument) tokenizedDoc.getProperty(TokenizedDocument.PROPERTY_RAW_DOCUMENT);
68 rawCluster.addDocument(rawDoc);
69 }
70
71 rawClusters.add(rawCluster);
72 }
73
74 //得到结果,输出
75 for (Iterator iter = rawClusters.iterator(); iter.hasNext();)
76 {
77 RawCluster cluster = (RawCluster) iter.next();
78 final List phrases = cluster.getClusterDescription();
79 for(int i=0;i<phrases.size();i++)
80 System.out.print("#"+phrases.get(i));
81 System.out.println();
82
83 }
下面是输出聚类phone的结果,还不错
#phone
#Phone Number
#yellow pages
#mobile phone
#cell phone
#Phone Book
#area code
#Business
#services
#Wireless
#people
#directory
#telephone
#address
#online
分享到:
相关推荐
总结来说,这项研究提出了一种结合后缀树聚类和期望最大化求精的新颖模体发现算法,它克服了模体发现中的关键难点,提高了模体识别的效率和准确性。这一方法不仅对于生物信息学领域的研究者具有指导意义,也为后续的...
后缀树聚类算法是本论文的核心技术,通过对后缀树的构建和应用,实现了对中文文本的聚类,避免了中文分词问题,提高了文本聚类的效率和准确性。 本论文的研究方法包括项目实践、文献阅读、算法设计、实验分析等。...
- **响应时间**:利用后缀树算法的高效特性,新方法大幅缩短了聚类所需的时间。 - **用户满意度**:通过问卷调查等方式收集反馈,结果显示用户对改进后的元搜索引擎满意度较高。 综上所述,基于遗传算法和后缀树...
针对后缀树聚类选取基类时,基类短语出现信息不规范、重复和冗余的问题,提出了一种改进后缀树聚类算法。该算法首先以短语互信息算法改进基类的选取,选出遵守维吾尔语语法规则的基类短语;然后,利用短语归并算法对...
该方法采用雅可比系数修改了STC算法中基本类相似度的计算方法,然后根据基本类相似度矩阵,利用变色龙算法完成网页聚类。实验结果表明:STCC算法与STC算法相比,聚类精度提高将近10%,避免了单链接算法的链式效应,...
文章首先回顾了现有文本聚类技术的优势与局限,随后详细介绍了基于后缀树(Suffix Tree Clustering, STC)的中文文本聚类算法的工作原理、构建流程以及实施过程中遇到的关键挑战及其解决方案。 #### 关键知识点解析...
后缀树是一种在计算机科学中广泛使用的数据结构,尤其适用于...总体来看,这篇文章为维吾尔文后缀树构造算法的设计与实现提供了理论基础和实验验证,并对后缀树聚类算法在处理维吾尔文网页聚类问题的可行性做出了贡献。
Ukkonen算法是一种用于构建后缀树的线性时间复杂度算法,由芬兰计算机科学家Esko Ukkonen在1992年和1995年的论文中提出和完善。该算法的核心优势在于它能够在O(n)的时间复杂度内构建出后缀树,其中n是输入字符串的...
这个算法的核心是利用后缀树和改进的Needleman-Wunsch算法来处理相似序列的对齐问题,同时通过无监督学习和聚类技术优化了比对过程。 首先,后缀树是一种数据结构,它能够存储一个字符串的所有后缀,对于DNA或RNA...
Bad Character Rule利用模式串中的字符位置来减少不必要的匹配尝试,而Good Suffix Rule利用已匹配的后缀来调整搜索位置,提高效率。 - **外部排序**:当数据量超出内存限制时,外部排序通过分块排序和归并来实现。...
BIRCH算法利用构建CF聚类特征树作为算法的核心,通过树的形式,BIRCH算法扫描数据库,在内存中建立一棵初始的CF-树,可以看做数据的多层压缩。详细介绍链接 AdaBoost AdaBoost算法是一种提升算法,通过对数据的多...
算法的核心在于利用后缀数组这一数据结构。 - 时间复杂度:O(n),n为序列长度。 - **回文树** - 结构简介:回文树是一种特殊的数据结构,用于快速查找序列中的所有回文子串。每个节点代表一个回文子串,能够支持...