`
sungang_1120
  • 浏览: 323761 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

JAVA 中文分词正向最大匹配和逆向最大匹配算法实现

 
阅读更多

可以下载一个词库这里用的是搜狗的词库

 

Segmentation.java

package cn.strong;

 

import java.util.HashMap;

 

public class Segmentation {

 

private String tem = null;

private HashMap mapDic, len;

 

public Segmentation(HashMap mapDic, HashMap len) {

this.mapDic = mapDic;

this.len = len;

}

//source是输入的中文

//正向最大匹配

public String Fmm(String source) {

String[] targets = new String[source.length()];

String target = "";

//资源的最大长度

int MaxLen = source.length();

//将最大的长度赋给temLen变量

int temLen = MaxLen;

int primarylen = 0;

while (true) {

//判断temLen有没有对应的value值 有的返回true否则返回false

if (len.containsKey(temLen)) {

tem = source.substring(primarylen, temLen);

//判断词库里面有没有tem对应的值  或者只剩下一个单字的时候

if (mapDic.containsKey(tem) || temLen - primarylen == 1) {

primarylen = temLen;

temLen = MaxLen;

if (primarylen == MaxLen)

target = target + tem;

else

target = target + tem + "/";

} else

temLen--;

} else

temLen--;

 

if (primarylen == MaxLen)

break;

}

return target;

}

//反相最大匹配

public String Bmm(String source) {

String[] targets = new String[source.length()];

String target="";

int MaxLen = source.length();

int temLen = MaxLen;

int primarylen = 0;

int i=0;

while (true) {

if (len.containsKey(temLen)) {

tem = source.substring(primarylen, temLen);

if (mapDic.containsKey(tem)||temLen-primarylen==1) {

if (temLen == MaxLen){

targets[i] = tem;

}

else{

tem = tem+"/";

targets[i] = tem;

}

temLen = primarylen;

primarylen = 0;

i++;

} else

primarylen++;

} else

primarylen++;

if (temLen == 0)

break;

}

 

for(int j=i-1;j>=0;j--)

target+=targets[j];

return target;

}

 

}

GenerateDictionary.java

package cn.strong;

 

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.HashMap;

 

public class GenerateDictionary {

public void GenHashDic(String filename, HashMap hm, HashMap len) throws FileNotFoundException, IOException {

String s = new String();

BufferedReader in = new BufferedReader(new FileReader(filename));

//在此处会循环词库的词数个数次

while ((s = in.readLine()) != null) {

hm.put(s, s.length());

len.put(s.length(), s);

}

}

}

Test.java测试

package cn.Test;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.HashMap;

 

import cn.strong.GenerateDictionary;

import cn.strong.Segmentation;

 

public class Test {

 

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

 

String filename = "sougou.txt";

HashMap hm = new HashMap();

HashMap len = new HashMap();

GenerateDictionary genDic = new GenerateDictionary();

Segmentation seg;

 

long genStart = System.currentTimeMillis();

genDic.GenHashDic(filename, hm, len);

System.out.println("GenHashDic 消耗时间:"+(System.currentTimeMillis() - genStart));

 

System.out.println("请输入您需要分解的语句:");

 

InputStreamReader reader = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(reader);

String data = "";

data = br.readLine();

seg = new Segmentation(hm, len);

long emmStart = System.currentTimeMillis();

String FmmTarget = seg.Fmm(data);

System.out.println("FMM 算法共花费时间为:"+(System.currentTimeMillis()-emmStart));

long bmmStart = System.currentTimeMillis();

String BmmTarget = seg.Bmm(data);

System.out.println("BMM 算法共花费时间为:"+(System.currentTimeMillis()-bmmStart));

 

System.out.println("FMM算法统计结果为: " + FmmTarget);

System.out.println("BMM算法统计结果为: " + BmmTarget);

}

 

}

 GenHashDic 消耗时间:1337

请输入您需要分解的语句:

中国四川省成都市青羊区少城路9号人民公园

FMM 算法共花费时间为:0

BMM 算法共花费时间为:0

FMM算法统计结果为: 中国/四川省/成都市/青羊区/少/城/路/9/号/人民/公园

BMM算法统计结果为: 中国/四川省/成都市/青羊区/少/城/路/9/号/人民/公园

分享到:
评论

相关推荐

    Java实现分词(正向最大匹配和逆向最大匹配)两种方法实现

    本文介绍了Java环境下实现中文分词的两种常用算法:正向最大匹配法和逆向最大匹配法。这两种方法各有优缺点,在实际应用中可以根据具体需求选择合适的分词策略。此外,通过加载词典和设置最大匹配长度等方式,可以...

    中文分词程序-正向最大匹配算法及逆向最大匹配算法

    在这个“中文分词程序”中,包含了两种常见的分词算法:正向最大匹配算法(Forward Maximum Matching, FMM)和逆向最大匹配算法(Backward Maximum Matching, BMM)。 正向最大匹配算法是一种自左向右的分词策略。...

    python正向最大匹配分词和逆向最大匹配分词

    在本文中,我们将讨论 Python 实现的正向最大匹配分词和逆向最大匹配分词算法,并提供完整的源代码。 正向最大匹配分词 正向最大匹配分词是一种常用的分词算法,它从左到右扫描输入字符串,并尽可能地找到最长的...

    基于正向、逆向的最大分词算法实现

    本文将深入探讨“基于正向、逆向的最大分词算法实现”的相关知识。 首先,我们要理解什么是分词。分词,也称为词汇化或切词,是指将连续的汉字序列切分成具有独立含义的词语。在中文处理中,由于没有明显的空格分隔...

    正向最大匹配算法实现中文分词

    MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本程序实现了正向最大匹配算法。 本程序还可以从我的github上面下载:https://github.com/Zehua-Zeng/Maximum-Matching-Algorithm

    中文分词-正向最大匹配法和逆向最大匹配法的实现

    需要注意的是,Python提供了许多现成的中文分词库,如jieba,它们已经实现了包括正向、逆向匹配在内的多种分词算法,并且优化了性能。但在学习和理解分词原理时,自己动手实现这些方法是非常有益的。 总的来说,...

    正向最大匹配中文分词算法

    中文分词一直都是中文自然语言处理领域的基础研究。目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时...MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本程序实现了正向最大匹配算法。

    正向最大匹配(FMM)和逆向最大匹配(BMM)的分词系统

    总的来说,正向最大匹配和逆向最大匹配是中文分词领域的基础算法,它们各有优缺点,适用于不同的应用场景。C#实现的FMM&BMM分词系统为开发者提供了一个工具,能够方便地处理中文文本,进行有效的分词操作。对于深入...

    一个简单的分词系统(可以选择正向最大匹配分词或逆向最大匹配)

    在这个简单的分词系统中,提供了两种主要的分词算法:正向最大匹配(Forward Maximum Matching, FMM)和逆向最大匹配(Backward Maximum Matching, BMM)。下面我们将详细探讨这两种方法及其应用。 首先,正向最大...

    RMM.rar_rmm逆向最大_分词_最大匹配算法_逆向最大匹配算法实现分词

    逆向最大匹配(RMM,Reverse Maximum Matching)算法是一种在自然语言处理中广泛使用的中文分词方法。在中文文本处理中,由于汉字不带有明显的边界标识,因此需要借助特定的算法来确定词语的边界,而分词就是这个...

    最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码

    在提供的压缩包文件中,包含了各种与分词相关的源码,例如"zt_逆向最大匹配分词算法"可能是实现逆向最大匹配算法的具体代码,"秒盘古分词"可能是指快速版本的盘古分词程序,"中文分词"和"英文分词"源码分别针对中文...

    最大正向逆向分词算法

    最大正向逆向分词算法结合了最大正向匹配和逆向最大匹配两种策略,以提高分词的准确率和效率。最大正向匹配是从句子的开始位置,选取最长的词典中的词作为分词结果,直到无法找到更长的词为止。逆向最大匹配则从句子...

    java分词(正向、逆向、最大频率)

    在Java中,有多种分词策略,如正向最大匹配、逆向最大匹配以及最大频率匹配。下面我们将详细探讨这些方法。 1. **正向最大匹配(ForwardMatch.java)** 正向最大匹配法是从输入序列的起始位置开始,尝试匹配尽可能...

    反向最大匹配算法实现中文分词

    MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本程序实现了反向最大匹配算法。 本程序还可以从我的github上面下载:https://github.com/Zehua-Zeng/Reverse-Maximum-Matching-Algorithm

    中文分词-C语言编写正向和反向最大匹配算法

    本程序是北京师范大学学生根据一个中文字库对所给的文章进行分词。...采用的算法是正向最大匹配算法和反向最大匹配算法。主要实现屏幕分词和文件分词两项功能。因为对毕业设计有所帮助,所以我要分高一点哈~勿怪偶~

    python正向最大匹配分词和逆向最大匹配分词的实例

    在本篇文章中,将深入探讨Python语言实现的正向最大匹配分词算法和逆向最大匹配分词算法。这两种分词算法是中文自然语言处理(NLP)领域中非常重要的基础技术,广泛应用于中文信息检索、文本挖掘等场景。文章将给出...

    基于逆向匹配的中文分词算法

    通过与其他分词算法(如正向最大匹配法、双向最大匹配法等)进行对比,可以更直观地看出基于逆向匹配的中文分词算法的优势与不足。实验结果表明,RMM算法在处理未登录词方面表现更优,尤其是在处理长难句时能够保持...

    JAVA实现的中文分词程序

    在Java中实现分词算法,常见的方法有正向最大匹配法(FMM)、逆向最大匹配法(RMM)、动态规划法(DP)等。这些算法各有优缺点,选择哪种方法取决于具体的应用场景和性能需求。例如,FMM从左到右匹配最长的词,而RMM...

    一种基于改进最大匹配快速中文分词算法

    - **双向最大匹配法**:结合正向最大匹配法和逆向最大匹配法的优点,通过比较两种方法的分词结果,选取更优的一种。 #### 三、基于改进的最大匹配分词算法分析 针对传统最大匹配算法中存在的不足,本文提出了一种...

Global site tag (gtag.js) - Google Analytics