一种拼音分词器的JAVA实现

简介: 搜索中的分词器有很多种,包括中文、英文,一般的网站都会有站内搜索功能,也就是对用户输入的内容进行处理,本文对中文的全拼实现了一 个分词器,原理很简单,就是模式匹配。
搜索中的分词器有很多种,包括中文、英文,一般的网站都会有站内搜索功能,也就是对用户输入的内容进行处理,本文对中文的全拼实现了一

个分词器,原理很简单,就是模式匹配。根据中文全拼的特点,即声母和韵母配对,首先列举出所有的声母,再分别列举出所有声母对应的韵母

集,分词的过程就是遍历匹配的过程。具体代码如下:

import java.util.ArrayList;

public class SpellTool {

	static String result = "";// 最后要显示的结果
	private static ArrayList<ArrayList<String>> ym = new ArrayList<ArrayList<String>>();// 单字集合
	private static ArrayList<String> sm = new ArrayList<String>();// 声母集合
	private static ArrayList<String> yy = new ArrayList<String>();// 单字集合
	private static ArrayList<String> ym_b = new ArrayList<String>();// 声母b的韵母集合
	private static ArrayList<String> ym_c = new ArrayList<String>();// 声母c的韵母集合
	private static ArrayList<String> ym_d = new ArrayList<String>();// 声母d的韵母集合
	private static ArrayList<String> ym_f = new ArrayList<String>();// 声母f的韵母集合
	private static ArrayList<String> ym_g = new ArrayList<String>();// 声母g的韵母集合
	private static ArrayList<String> ym_h = new ArrayList<String>();// 声母h的韵母集合
	private static ArrayList<String> ym_j = new ArrayList<String>();// 声母j的韵母集合
	private static ArrayList<String> ym_k = new ArrayList<String>();// 声母k的韵母集合
	private static ArrayList<String> ym_l = new ArrayList<String>();// 声母l的韵母集合
	private static ArrayList<String> ym_m = new ArrayList<String>();// 声母m的韵母集合
	private static ArrayList<String> ym_n = new ArrayList<String>();// 声母n的韵母集合
	private static ArrayList<String> ym_p = new ArrayList<String>();// 声母p的韵母集合
	private static ArrayList<String> ym_q = new ArrayList<String>();// 声母q的韵母集合
	private static ArrayList<String> ym_r = new ArrayList<String>();// 声母r的韵母集合
	private static ArrayList<String> ym_s = new ArrayList<String>();// 声母s的韵母集合
	private static ArrayList<String> ym_t = new ArrayList<String>();// 声母t的韵母集合
	private static ArrayList<String> ym_w = new ArrayList<String>();// 声母w的韵母集合
	private static ArrayList<String> ym_x = new ArrayList<String>();// 声母x的韵母集合
	private static ArrayList<String> ym_y = new ArrayList<String>();// 声母y的韵母集合
	private static ArrayList<String> ym_z = new ArrayList<String>();// 声母z的韵母集合
	private static ArrayList<String> ym_sh = new ArrayList<String>();// 声母sh的韵母集合
	private static ArrayList<String> ym_zh = new ArrayList<String>();// 声母zh的韵母集合
	private static ArrayList<String> ym_ch = new ArrayList<String>();// 声母ch的韵母集合

	static {
		sm.add("b");//
		sm.add("c");
		sm.add("d");
		sm.add("f");
		sm.add("g");
		sm.add("h");
		sm.add("j");
		sm.add("k");
		sm.add("l");
		sm.add("m");
		sm.add("n");
		sm.add("p");
		sm.add("q");
		sm.add("r");
		sm.add("s");
		sm.add("t");
		sm.add("w");
		sm.add("x");
		sm.add("y");
		sm.add("z");
		sm.add("sh");
		sm.add("zh");
		sm.add("ch");

		yy.add("a");//
		yy.add("ai");
		yy.add("an");
		yy.add("ang");
		yy.add("ao");
		yy.add("e");
		yy.add("en");
		yy.add("eng");
		yy.add("er");
		yy.add("o");
		yy.add("ou");
                yy.add("ong");

		ym_b.add("a");//
		ym_b.add("ai");
		ym_b.add("an");
		ym_b.add("ang");
		ym_b.add("ao");
		ym_b.add("ei");
		ym_b.add("en");
		ym_b.add("eng");
		ym_b.add("i");
		ym_b.add("ian");
		ym_b.add("iao");
		ym_b.add("ie");
		ym_b.add("in");
		ym_b.add("ing");
		ym_b.add("o");
		ym_b.add("u");

		ym_c.add("a");// c
		ym_c.add("ai");
		ym_c.add("an");
		ym_c.add("ang");
		ym_c.add("ao");
		ym_c.add("e");
		ym_c.add("en");
		ym_c.add("eng");
		ym_c.add("i");
		ym_c.add("ong");
		ym_c.add("ou");
		ym_c.add("u");
		ym_c.add("uan");
		ym_c.add("ui");
		ym_c.add("un");
		ym_c.add("uo");

		ym_d.add("a");// d
		ym_d.add("ai");
		ym_d.add("an");
		ym_d.add("ang");
		ym_d.add("ao");
		ym_d.add("e");
		ym_d.add("ei");
		ym_d.add("en");
		ym_d.add("eng");
		ym_d.add("i");
		ym_d.add("ia");
		ym_d.add("ian");
		ym_d.add("iao");
		ym_d.add("ie");
		ym_d.add("ing");
		ym_d.add("iu");
		ym_d.add("ong");
		ym_d.add("ou");
		ym_d.add("u");
		ym_d.add("uan");
		ym_d.add("ui");
		ym_d.add("un");
		ym_d.add("uo");

		ym_f.add("a");// f
		ym_f.add("an");
		ym_f.add("ang");
		ym_f.add("ei");
		ym_f.add("en");
		ym_f.add("eng");
		ym_f.add("iao");
		ym_f.add("o");
		ym_f.add("ou");
		ym_f.add("u");

		ym_g.add("a");// g
		ym_g.add("ai");
		ym_g.add("an");
		ym_g.add("ang");
		ym_g.add("ao");
		ym_g.add("e");
		ym_g.add("ei");
		ym_g.add("en");
		ym_g.add("eng");
		ym_g.add("ong");
		ym_g.add("ou");
		ym_g.add("u");
		ym_g.add("uai");
		ym_g.add("uan");
		ym_g.add("uang");
		ym_g.add("ui");
		ym_g.add("un");
		ym_g.add("uo");

		ym_h.add("a");// h
		ym_h.add("ai");
		ym_h.add("an");
		ym_h.add("ang");
		ym_h.add("ao");
		ym_h.add("e");
		ym_h.add("ei");
		ym_h.add("en");
		ym_h.add("eng");
		ym_h.add("ong");
		ym_h.add("ou");
		ym_h.add("u");
		ym_h.add("ua");
		ym_h.add("uai");
		ym_h.add("uan");
		ym_h.add("uang");
		ym_h.add("ui");
		ym_h.add("un");
		ym_h.add("uo");

		ym_j.add("i");// j
		ym_j.add("ia");
		ym_j.add("ian");
		ym_j.add("iang");
		ym_j.add("iao");
		ym_j.add("ie");
		ym_j.add("in");
		ym_j.add("ing");
		ym_j.add("iong");
		ym_j.add("iu");
		ym_j.add("u");
		ym_j.add("uan");
		ym_j.add("ue");
		ym_j.add("un");

		ym_k.add("a");//
		ym_k.add("ai");
		ym_k.add("an");
		ym_k.add("ang");
		ym_k.add("ao");
		ym_k.add("e");
		ym_k.add("en");
		ym_k.add("eng");
		ym_k.add("ong");
		ym_k.add("ou");
		ym_k.add("u");
		ym_k.add("ui");
		ym_k.add("un");
		ym_k.add("uo");

		ym_l.add("a");// l
		ym_l.add("ai");
		ym_l.add("an");
		ym_l.add("ang");
		ym_l.add("ao");
		ym_l.add("e");
		ym_l.add("ei");
		ym_l.add("eng");
		ym_l.add("i");
		ym_l.add("ia");
		ym_l.add("ian");
		ym_l.add("iao");
		ym_l.add("ie");
		ym_l.add("in");
		ym_l.add("ing");
		ym_l.add("iu");
		ym_l.add("o");
		ym_l.add("ong");
		ym_l.add("ou");
		ym_l.add("u");
		ym_l.add("uan");
		ym_l.add("un");
		ym_l.add("uo");
		ym_l.add("v");
		ym_l.add("ve");

		ym_m.add("a");// m
		ym_m.add("ai");
		ym_m.add("an");
		ym_m.add("ang");
		ym_m.add("ao");
		ym_m.add("e");
		ym_m.add("ei");
		ym_m.add("en");
		ym_m.add("eng");
		ym_m.add("i");
		ym_m.add("ian");
		ym_m.add("iao");
		ym_m.add("ie");
		ym_m.add("in");
		ym_m.add("ing");
		ym_m.add("iu");
		ym_m.add("o");
		ym_m.add("ou");
		ym_m.add("u");

		ym_n.add("a");// n
		ym_n.add("ai");
		ym_n.add("an");
		ym_n.add("ang");
		ym_n.add("ao");
		ym_n.add("e");
		ym_n.add("ei");
		ym_n.add("en");
		ym_n.add("eng");
		ym_n.add("i");
		ym_n.add("ian");
		ym_n.add("iang");
		ym_n.add("iao");
		ym_n.add("ie");
		ym_n.add("in");
		ym_n.add("ing");
		ym_n.add("iu");
		ym_n.add("ong");
		ym_n.add("ou");
		ym_n.add("u");
		ym_n.add("uan");
		ym_n.add("un");
		ym_n.add("uo");
		ym_n.add("v");
		ym_n.add("ve");

		ym_p.add("a");// p
		ym_p.add("ai");
		ym_p.add("an");
		ym_p.add("ang");
		ym_p.add("ao");
		ym_p.add("e");
		ym_p.add("ei");
		ym_p.add("en");
		ym_p.add("eng");
		ym_p.add("i");
		ym_p.add("ian");
		ym_p.add("iao");
		ym_p.add("ie");
		ym_p.add("in");
		ym_p.add("ing");
		ym_p.add("o");
		ym_p.add("ou");
		ym_p.add("u");

		ym_q.add("i");// q
		ym_q.add("ia");
		ym_q.add("ian");
		ym_q.add("iang");
		ym_q.add("iao");
		ym_q.add("ie");
		ym_q.add("in");
		ym_q.add("ing");
		ym_q.add("iong");
		ym_q.add("iu");
		ym_q.add("u");
		ym_q.add("uan");
		ym_q.add("ue");
		ym_q.add("un");

		ym_r.add("an");// r
		ym_r.add("ang");
		ym_r.add("ao");
		ym_r.add("e");
		ym_r.add("en");
		ym_r.add("eng");
		ym_r.add("i");
		ym_r.add("ong");
		ym_r.add("ou");
		ym_r.add("u");
		ym_r.add("ua");
		ym_r.add("uan");
		ym_r.add("ui");
		ym_r.add("un");
		ym_r.add("uo");

		ym_s.add("a");// s
		ym_s.add("ai");
		ym_s.add("an");
		ym_s.add("ang");
		ym_s.add("ao");
		ym_s.add("e");
		ym_s.add("en");
		ym_s.add("eng");
		ym_s.add("i");
		ym_s.add("ong");
		ym_s.add("ou");
		ym_s.add("u");
		ym_s.add("uan");
		ym_s.add("ui");
		ym_s.add("un");
		ym_s.add("uo");

		ym_t.add("a");// t
		ym_t.add("ai");
		ym_t.add("an");
		ym_t.add("ang");
		ym_t.add("ao");
		ym_t.add("e");
		ym_t.add("ei");
		ym_t.add("eng");
		ym_t.add("i");
		ym_t.add("ian");
		ym_t.add("iao");
		ym_t.add("ie");
		ym_t.add("ing");
		ym_t.add("ong");
		ym_t.add("ou");
		ym_t.add("u");
		ym_t.add("uan");
		ym_t.add("ui");
		ym_t.add("un");
		ym_t.add("uo");

		ym_w.add("a");// w
		ym_w.add("ai");
		ym_w.add("an");
		ym_w.add("ang");
		ym_w.add("ei");
		ym_w.add("en");
		ym_w.add("eng");
		ym_w.add("o");
		ym_w.add("u");

		ym_x.add("i");// x
		ym_x.add("ia");
		ym_x.add("ian");
		ym_x.add("iang");
		ym_x.add("iao");
		ym_x.add("ie");
		ym_x.add("in");
		ym_x.add("ing");
		ym_x.add("iong");
		ym_x.add("iu");
		ym_x.add("u");
		ym_x.add("uan");
		ym_x.add("ue");
		ym_x.add("un");

		ym_y.add("a");// y
		ym_y.add("an");
		ym_y.add("ang");
		ym_y.add("ao");
		ym_y.add("e");
		ym_y.add("i");
		ym_y.add("in");
		ym_y.add("ing");
		ym_y.add("o");
		ym_y.add("ong");
		ym_y.add("ou");
		ym_y.add("u");
		ym_y.add("uan");
		ym_y.add("ue");
		ym_y.add("un");

		ym_z.add("a");//
		ym_z.add("ai");
		ym_z.add("an");
		ym_z.add("ang");
		ym_z.add("ao");
		ym_z.add("e");
		ym_z.add("ei");
		ym_z.add("en");
		ym_z.add("eng");
		ym_z.add("i");
		ym_z.add("ong");
		ym_z.add("ou");
		ym_z.add("u");
		ym_z.add("uan");
		ym_z.add("ui");
		ym_z.add("un");
		ym_z.add("uo");

		ym_ch.add("a");// ch
		ym_ch.add("ai");
		ym_ch.add("an");
		ym_ch.add("ang");
		ym_ch.add("ao");
		ym_ch.add("e");
		ym_ch.add("en");
		ym_ch.add("eng");
		ym_ch.add("i");
		ym_ch.add("ong");
		ym_ch.add("ou");
		ym_ch.add("u");
		ym_ch.add("ua");
		ym_ch.add("uai");
		ym_ch.add("uan");
		ym_ch.add("uang");
		ym_ch.add("ui");
		ym_ch.add("un");
		ym_ch.add("uo");

		ym_sh.add("a");// sh
		ym_sh.add("ai");
		ym_sh.add("an");
		ym_sh.add("ang");
		ym_sh.add("ao");
		ym_sh.add("e");
		ym_sh.add("ei");
		ym_sh.add("en");
		ym_sh.add("eng");
		ym_sh.add("i");
		ym_sh.add("ou");
		ym_sh.add("u");
		ym_sh.add("ua");
		ym_sh.add("uai");
		ym_sh.add("uan");
		ym_sh.add("uang");
		ym_sh.add("ui");
		ym_sh.add("un");
		ym_sh.add("uo");

		ym_zh.add("a");// zh
		ym_zh.add("ai");
		ym_zh.add("an");
		ym_zh.add("ang");
		ym_zh.add("ao");
		ym_zh.add("e");
		ym_zh.add("ei");
		ym_zh.add("en");
		ym_zh.add("eng");
		ym_zh.add("i");
		ym_zh.add("ong");
		ym_zh.add("ou");
		ym_zh.add("u");
		ym_zh.add("ua");
		ym_zh.add("uai");
		ym_zh.add("uan");
		ym_zh.add("uang");
		ym_zh.add("ui");
		ym_zh.add("un");
		ym_zh.add("uo");

		ym.add(yy);
		ym.add(ym_b);
		ym.add(ym_c);
		ym.add(ym_d);
		ym.add(ym_f);
		ym.add(ym_g);
		ym.add(ym_h);
		ym.add(ym_j);
		ym.add(ym_k);
		ym.add(ym_l);
		ym.add(ym_m);
		ym.add(ym_n);
		ym.add(ym_p);
		ym.add(ym_q);
		ym.add(ym_r);
		ym.add(ym_s);
		ym.add(ym_t);
		ym.add(ym_w);
		ym.add(ym_x);
		ym.add(ym_y);
		ym.add(ym_z);
		ym.add(ym_ch);
		ym.add(ym_sh);
		ym.add(ym_zh);

	}

	public static String findsm(String py) {
		char[] py2 = py.toCharArray();// 将读入字符转为char数组
		int temp = 0;
		int index = 0;//
		// 遍历声母集合,匹对
		for (int i = 0; i < sm.size(); i++) {
			for (int j = 1; j <= py2.length; j++) {
				String py3 = String.copyValueOf(py2, 0, j);// 截取从0开始到j结束的字符串
				if (py3.equals(sm.get(i))) {
					temp = sm.get(i).length();// 对应的声母的长度
					index = i + 1;
					break;
				}
			}
		}
		if (temp != 0) {
			result = result + String.copyValueOf(py2, 0, temp);// 将匹对出来的声母赋给result
			py = py.substring(temp);
		}
		// 匹对完声母后如果字符串还么结束继续匹对韵母
		if (py.length() != 0) {
			return findym(py, index);
		} else {
			return py;
		}
	}

	public static String findym(String py, int index) {
		int temp = 0;
		char[] py2 = py.toCharArray();
		for (int i = 0; i < ym.get(index).size(); i++) {
			for (int j = 1; j <= py2.length; j++) {
				String py3 = String.copyValueOf(py2, 0, j);
				if (py3.equals(ym.get(index).get(i))) {
					temp = ym.get(index).get(i).length();
					break;
				}
			}
		}
		if (temp != 0) {
			result = result + String.copyValueOf(py2, 0, temp) + " ";
			py = py.substring(temp);
		}
		return py;
	}

	/**
	 * 拼音全拼分词工具
	 * 
	 * @param pell
	 * @return 以空格区分的分词后的字符串
	 */
	public static String trimSpell(String spell) {
		String s = spell;
		for (int i = 0; i < spell.length() * 2; i++) {
			if (s.length() == 0) {
				break;
			}
			s = findym(s, 0);
			s = findsm(s);
		}
		return result;
	}

	public static void main(String[] args) {
		//long start = System.currentTimeMillis();
		String spell = "woaibeijintiananmen";
		String result = SpellTool.trimSpell(spell);
		//long end = System.currentTimeMillis();
		//System.out.println("用时:" + (end - start) + "毫秒");
		System.out.println(result);

	}
}

测试:

输入:woaibeijintiananmen

输出:wo ai bei jin tian an men
=============================

输入:sousuozhongdefenciqiyouhenduozhong

输出:sou suo zhong de fen ci qi you hen duo zhong


目录
相关文章
|
7月前
|
Java
java实现中文转化为拼音与简称(转)
java实现中文转化为拼音与简称(转)
49 1
|
Java
Java工具类——汉字转拼音
写了一个根据汉字获取拼音字符串的工具类
158 0
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
724 0
|
Java Maven
Java代码获取汉字的拼音或汉字首字母
今天写项目时,有需要将输入的汉字转化为拼音和提取每个汉字首字母的功能,随手记录分享一下
227 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
1284 0
JAVA 实现上传图片添加水印(详细版)(上)
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
编解码 Java Maven
Java汉字转拼音(解决方案)
Java汉字转拼音(解决方案)
231 0
Java汉字转拼音(解决方案)
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
221 0
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
426 0
Java实现图书管理系统
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
548 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建