`

高频词汇提取的Java实现

    博客分类:
  • Java
阅读更多

面对浩瀚的信息海洋,找到想要的资源有时真的是不容易。在大量文字中搜索高频词汇是信息搜索和数据压缩的共通课题。
这次智慧擂台请大家在一个比较庞大的英文文本中找出M个数量最多的短语(由N个单词组成)。统一处理相同的文本文件,该文本只包含英文单词、空格和回行符,比较谁的程序效率最高。

  程序输入:M,N,文本文件路径(M不超过20,N不超过8)
程序输出:高频短语及其数量清单

擂台规则:提交符合以上要求的可执行程序,语言招式不限,点到为止;
我们将在统一的环境下对每位选手的作品进行公平的测试,
比较出综合用时最少的程序。

源程序

 

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->import java.io.*;
import java.util.*;

class tt
{
    
public String phrase;
    
public int count;
}

public class searchphrase
{

    
private static LinkedHashMap phrase = new LinkedHashMap();
    
static tt[] max_phrase;

    
private static Vector SeparateString(String s)
    {
        Vector v 
= new Vector();
        String temp 
= "";
        
for (int i = 0; i < s.length(); i++)
        {
            
if (s.charAt(i) != ' ')
            {
                temp 
+= s.charAt(i);
            }
            
else
            {
                
if (temp != "")
                    v.add(temp);
                temp 
= "";
            }
        }
        
if (temp != "")
            v.add(temp);
        
return v;
    }

    
private static void swap(int pos, int count, String phrase)
    {
        
int i;
        
if (max_phrase[pos - 1].count < count)
        {
            
for (i = pos - 1; i > 0; i--)
            {
                
if (max_phrase[i - 1].count > max_phrase[i].count)
                    
break;
            }
            max_phrase[pos].count 
= max_phrase[i].count;
            max_phrase[pos].phrase 
= max_phrase[i].phrase;
            max_phrase[i].count 
= count;
            max_phrase[i].phrase 
= phrase;
        }

    }

    
private static void adjust_max(int count, String phrase)
    {
        
int i, j;
        
if (count <= max_phrase[max_phrase.length - 1].count)
            
return;
        
for (i = max_phrase.length - 1; i >= 0; i--)
        {
            
if (max_phrase[i].phrase.equals(phrase))
            {
                max_phrase[i].count 
= count;
                
if (i > 0)
                {
                    swap(i, count, phrase);
                }
                
return;
            }
        }
        max_phrase[max_phrase.length 
- 1].count = count;
        max_phrase[max_phrase.length 
- 1].phrase = phrase;
        
if (i > 0)
        {
            swap(max_phrase.length 
- 1, count, phrase);
        }
    }

    
private static void js(Vector v, int n)
    {
        String s;
        
for (int i = 0; i < v.size() - n + 1; i++)
        {
            s 
= "";
            
for (int j = i; j < i + n; j++)
            {
                s 
+= v.get(j) + " ";
            }
            
int count = 1;
            
if (phrase.containsKey(s.hashCode()))
            {
                count 
= Integer.parseInt(phrase.get(s.hashCode()).toString());
                count
++;
            }
            phrase.put(s.hashCode(), count);
            adjust_max(count, s);
        }
    }

    
public static void main(String[] args)
    {
        
try
        {
            
long t;
            
int m, n;
            String path;
            m 
= Integer.parseInt(args[0]);
            n 
= Integer.parseInt(args[1]);
            path 
= args[2];
            max_phrase 
= new tt[m];
            
for (int i = 0; i < m; i++)
            {
                max_phrase[i] 
= new tt();
                max_phrase[i].count 
= 0;
                max_phrase[i].phrase 
= "";
            }
            t 
= (new java.util.Date()).getTime();
            java.io.FileReader fr 
= new java.io.FileReader(path);
            java.io.BufferedReader br 
= new BufferedReader(fr);
            String s;

            Vector v 
= null;

            
while ((s = br.readLine()) != null)
            {
                v 
= SeparateString(s);
                js(v, n);
            }
            
for (int i = 0; i < m; i++)
            {
                System.out.println(max_phrase[i].phrase);
                System.out.println(max_phrase[i].count);
                System.out.println();
            }
            t 
= (new java.util.Date()).getTime() - t;
            System.out.print(t);
            System.out.println(
" ms");
        }
        
catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

    }

}

测试结果1:m = 20 n = 8 

under games played won drawn lost goals for
71

tabulated under games played won drawn lost goals
70

games played won drawn lost goals for against
70

May Xinhua Following are the results from the
69

played won drawn lost goals for against and
59

won drawn lost goals for against and points
59

Jan Xinhua Following are the results from the
48

Chinas economic efficiency indicators of the sector of
39

The industrial statistics include all stateowned enterprises and
39

industrial statistics include all stateowned enterprises and the
39

statistics include all stateowned enterprises and the nonstateowned
39

include all stateowned enterprises and the nonstateowned ones
39

all stateowned enterprises and the nonstateowned ones with
39

stateowned enterprises and the nonstateowned ones with annual
39

enterprises and the nonstateowned ones with annual sales
39

and the nonstateowned ones with annual sales income
39

Xinhua Chinas economic efficiency indicators of the sector
39

the nonstateowned ones with annual sales income over
39

nonstateowned ones with annual sales income over million
39

up percent over the same period last year
35

13594 ms


测试结果2  m = 10 n = 5

Xinhua Following are the results
295

May Xinhua Following are the
209

Following are the results from
183

are the results from the
176

April Xinhua Following are the
141

Jan Xinhua Following are the
122

billion yuan billion US dollars
120

won drawn lost goals for
88

played won drawn lost goals
88

Dec Xinhua Following are the
87

12437 ms

 
以上源程序是采用的是最简单的方法,谁有更好,效率更高的方法,请跟贴!!

分享到:
评论

相关推荐

    TextRank, TextRank算法提取关键词的Java实现.zip

    这个“TextRank, TextRank算法提取关键词的Java实现.zip”压缩包文件包含了一个开源项目,名为“TextRank-master”,它提供了一种Java实现来提取文本中的关键词。 TextRank算法的核心思想是模拟PageRank在文本处理...

    java提取文章关键字

    使用Java实现关键词提取通常包括以下步骤: - 文本预处理:清洗文本(去除标点、数字、特殊字符),分词。 - 应用算法:如TF-IDF或TextRank计算关键词得分。 - 后处理:按照得分排序,选择前n个关键词输出。 6....

    java词云生成器(代码,maven项目)

    词云是一种数据可视化工具,它以图形方式展示文本中的高频词汇,使得用户能够快速识别和理解大量文本数据的主题。在本项目中,开发者可以输入字体文件或文档,程序会自动分析并以艺术化的形式展示关键词。 **1. ...

    Hanlp分词实现从网络片段中提取省份和城市

    HanLP的核心是基于统计的分词模型,它能够将输入的中文句子切分成一个个词汇单元。在Java中,我们可以创建一个HanLP实例,然后调用其提供的分词方法,将网络片段作为输入进行处理。例如: ```java import ...

    最大熵模型JAVA实现

    总的来说,Java实现最大熵模型涉及文本处理、特征提取、模型训练和应用等多个环节,对于理解和掌握自然语言处理的机器学习技术具有重要意义。通过实践,开发者可以深入理解模型的工作原理,并将其应用于实际项目中,...

    doc2vec的java实现

    虽然原生的Gensim是用Python编写的,但通过Jython(Python的Java实现)或其他Java调用Python库的方法,可以在Java项目中使用Gensim的DOC2Vec功能。 **步骤详解** 1. **数据预处理**:首先,你需要对输入的文本进行...

    关键字提取

    Java实现TextRank可以参考GATE(General Architecture for Text Engineering)或者自行构建基于图算法的解决方案。 3. **LSA**:这是一种基于矩阵分解的方法,通过SVD(奇异值分解)来揭示隐藏在文本数据中的主题...

    用贝叶斯分类器实现垃圾邮件分类器(C版本和Java版本)

    《基于贝叶斯分类器的垃圾邮件识别:C与Java实现》 在信息技术领域,垃圾邮件过滤是一项重要的任务,它关系到用户的信息安全和工作效率。本文将深入探讨如何利用贝叶斯分类器来构建一个垃圾邮件分类器,分别介绍...

    java调用NLPIR接口实现词频,词性,分词、情感等Demo(控制台输出测试)

    NLPIR接口可以方便地进行词频统计,帮助开发者快速获取高频词汇,这对于关键词提取和文本摘要具有重要意义。 再者,**词性标注**是自然语言处理中的另一个关键步骤。词性标注是给每个词标记其在句子中的语法角色,...

    文本关键字提取

    文本关键字提取是自然语言处理(NLP)领域中的一个重要任务,其主要目的是从大量文本数据中识别出最具代表性和核心意义的词汇或短语。这些关键词可以概括文本的主题,为信息检索、文档分类、情感分析等应用提供关键...

    JAVA技术实现的搜索引擎(含源码)Java实用源码整理learns

    JAVA的正则表达式库可以用于识别关键词,而分词器(如IK Analyzer、HanLP)则可以将中文文本分解为单个词汇。 4. **检索**:最后,搜索引擎会根据索引和查询返回相关结果。这涉及到匹配算法,如BM25、TF-IDF等,...

    Java的全文检索实现

    在这一背景下,本文深入探讨了基于Java实现全文检索的方法及其性能优化策略。 #### 一、全文检索系统的机制 全文检索系统是一种根据全文检索理论构建的软件系统,旨在提供高效的全文检索服务。该系统主要包括索引...

    LDA的JAVA版本

    对于初学者来说,这个Java实现可以提供以下学习机会: 1. **理解LDA原理**:通过阅读源代码,可以深入理解LDA的数学基础和算法流程。 2. **实践编程技巧**:学习如何在Java环境下处理文本数据和构建复杂的数据结构...

    SearchEngine_java_搜索引擎实现_

    下面我们将详细探讨Java实现搜索引擎涉及的关键知识点。 首先,搜索引擎的核心部分包括**信息采集**、**索引构建**和**查询处理**三个主要阶段。 1. **信息采集**:这是搜索引擎工作的第一步,涉及到网络爬虫(Web...

    贝叶斯新闻分类java代码

    在这个Java实现中,我们将深入理解如何利用朴素贝叶斯进行新闻分类,并探讨相关的核心概念和技术。 首先,我们要知道朴素贝叶斯分类器的工作原理。它基于贝叶斯定理,该定理描述了给定一些特征的情况下,一个事件...

    CMS标签提取方法[CMS核心标签提取]

    【CMS核心标签提取】是关于内容管理系统(CMS)中一种重要的功能,用于高效地管理和组织网站内容。在本文中,我们将深入探讨CMS标签提取的方法及其重要性,以便于更好地理解和应用这一技术。 首先,理解什么是CMS...

    Java+英语词汇表.doc

    ### Java 英语词汇表详解 #### Abstract Window Toolkit (AWT) **中文名称:抽象窗口工具包** **概念解析:** AWT 是 Java 中用于构建图形用户界面 (GUI) 的一组类。它允许开发者创建标准的窗口、按钮、菜单等 GUI ...

    java学习之英文词汇

    ### Java学习之英文词汇知识点详解 #### 一、计算机基础词汇 (Computer-based Vocabulary) 1. **Mouse**: 鼠标,用于控制计算机屏幕上光标的移动。 2. **Chinese**: 中文,指中国的语言或文字。 3. **English**: ...

    向量空间模型快速文本相似度计算 java源码+数据

    在Java实现中,"DocumentSimilarity"可能包含以下关键类和方法: - `TermExtractor`:用于进行术语提取。 - `VocabularyBuilder`:构建词汇表。 - `DocumentVectorizer`:将文档转化为向量。 - `...

    java使用卷积神经网络的用法

    在Java中实现CNN进行自然语言情感化分析,通常会涉及以下关键步骤: 1. **数据预处理**:首先,你需要将文本数据转化为机器可理解的形式。这可能包括分词、去除停用词、词干提取等。对于情感分析,你还需要将每个...

Global site tag (gtag.js) - Google Analytics