1. 程式人生 > >一種拼音分詞器的JAVA實現

一種拼音分詞器的JAVA實現

原理很簡單,就是模式匹配。根據中文全拼的特點,即聲母和韻母配對,首先列舉出所有的聲母,再分別列舉出所有聲母對應的韻母集,分詞的過程就是遍歷匹配的過程。
  1. publicclass SpellTool {  
  2.     static String result = "";// 最後要顯示的結果
  3.     privatestatic ArrayList<ArrayList<String>> ym = new ArrayList<ArrayList<String>>();// 單字集合
  4.     privatestatic ArrayList<String> sm = 
    new ArrayList<String>();// 聲母集合
  5.     privatestatic ArrayList<String> yy = new ArrayList<String>();// 單字集合
  6.     privatestatic ArrayList<String> ym_b = new ArrayList<String>();// 聲母b的韻母集合
  7.     privatestatic ArrayList<String> ym_c = new ArrayList<String>();// 聲母c的韻母集合
  8.     private
    static ArrayList<String> ym_d = new ArrayList<String>();// 聲母d的韻母集合
  9.     privatestatic ArrayList<String> ym_f = new ArrayList<String>();// 聲母f的韻母集合
  10.     privatestatic ArrayList<String> ym_g = new ArrayList<String>();// 聲母g的韻母集合
  11.     privatestatic ArrayList<String> ym_h = 
    new ArrayList<String>();// 聲母h的韻母集合
  12.     privatestatic ArrayList<String> ym_j = new ArrayList<String>();// 聲母j的韻母集合
  13.     privatestatic ArrayList<String> ym_k = new ArrayList<String>();// 聲母k的韻母集合
  14.     privatestatic ArrayList<String> ym_l = new ArrayList<String>();// 聲母l的韻母集合
  15.     privatestatic ArrayList<String> ym_m = new ArrayList<String>();// 聲母m的韻母集合
  16.     privatestatic ArrayList<String> ym_n = new ArrayList<String>();// 聲母n的韻母集合
  17.     privatestatic ArrayList<String> ym_p = new ArrayList<String>();// 聲母p的韻母集合
  18.     privatestatic ArrayList<String> ym_q = new ArrayList<String>();// 聲母q的韻母集合
  19.     privatestatic ArrayList<String> ym_r = new ArrayList<String>();// 聲母r的韻母集合
  20.     privatestatic ArrayList<String> ym_s = new ArrayList<String>();// 聲母s的韻母集合
  21.     privatestatic ArrayList<String> ym_t = new ArrayList<String>();// 聲母t的韻母集合
  22.     privatestatic ArrayList<String> ym_w = new ArrayList<String>();// 聲母w的韻母集合
  23.     privatestatic ArrayList<String> ym_x = new ArrayList<String>();// 聲母x的韻母集合
  24.     privatestatic ArrayList<String> ym_y = new ArrayList<String>();// 聲母y的韻母集合
  25.     privatestatic ArrayList<String> ym_z = new ArrayList<String>();// 聲母z的韻母集合
  26.     privatestatic ArrayList<String> ym_sh = new ArrayList<String>();// 聲母sh的韻母集合
  27.     privatestatic ArrayList<String> ym_zh = new ArrayList<String>();// 聲母zh的韻母集合
  28.     privatestatic ArrayList<String> ym_ch = new ArrayList<String>();// 聲母ch的韻母集合
  29.     static {  
  30.         sm.add("b");//
  31.         sm.add("c");  
  32.         sm.add("d");  
  33.         sm.add("f");  
  34.         sm.add("g");  
  35.         sm.add("h");  
  36.         sm.add("j");  
  37.         sm.add("k");  
  38.         sm.add("l");  
  39.         sm.add("m");  
  40.         sm.add("n");  
  41.         sm.add("p");  
  42.         sm.add("q");  
  43.         sm.add("r");  
  44.         sm.add("s");  
  45.         sm.add("t");  
  46.         sm.add("w");  
  47.         sm.add("x");  
  48.         sm.add("y");  
  49.         sm.add("z");  
  50.         sm.add("sh");  
  51.         sm.add("zh");  
  52.         sm.add("ch");  
  53.         yy.add("a");//
  54.         yy.add("ai");  
  55.         yy.add("an");  
  56.         yy.add("ang");  
  57.         yy.add("ao");  
  58.         yy.add("e");  
  59.         yy.add("en");  
  60.         yy.add("eng");  
  61.         yy.add("er");  
  62.         yy.add("o");  
  63.         yy.add("ou");  
  64.                 yy.add("ong");  
  65.         ym_b.add("a");//
  66.         ym_b.add("ai");  
  67.         ym_b.add("an");  
  68.         ym_b.add("ang");  
  69.         ym_b.add("ao");  
  70.         ym_b.add("ei");  
  71.         ym_b.add("en");  
  72.         ym_b.add("eng");  
  73.         ym_b.add("i");  
  74.         ym_b.add("ian");  
  75.         ym_b.add("iao");  
  76.         ym_b.add("ie");  
  77.         ym_b.add("in");  
  78.         ym_b.add("ing");  
  79.         ym_b.add("o");  
  80.         ym_b.add("u");  
  81.         ym_c.add("a");// c
  82.         ym_c.add("ai");  
  83.         ym_c.add("an");  
  84.         ym_c.add("ang");  
  85.         ym_c.add("ao");  
  86.         ym_c.add("e");  
  87.         ym_c.add("en");  
  88.         ym_c.add("eng");  
  89.         ym_c.add("i");  
  90.         ym_c.add("ong");  
  91.         ym_c.add("ou");  
  92.         ym_c.add("u");  
  93.         ym_c.add("uan");  
  94.         ym_c.add("ui");  
  95.         ym_c.add("un");  
  96.         ym_c.add("uo");  
  97.         ym_d.add("a");// d
  98.         ym_d.add("ai");  
  99.         ym_d.add("an");  
  100.         ym_d.add("ang");  
  101.         ym_d.add("ao");  
  102.         ym_d.add("e");  
  103.         ym_d.add("ei");  
  104.         ym_d.add("en");  
  105.         ym_d.add("eng");  
  106.         ym_d.add("i");  
  107.         ym_d.add("ia");  
  108.         ym_d.add("ian");  
  109.         ym_d.add("iao");  
  110.         ym_d.add("ie");  
  111.         ym_d.add("ing");  
  112.         ym_d.add("iu");  
  113.         ym_d.add("ong");  
  114.         ym_d.add("ou");  
  115.         ym_d.add("u");  
  116.         ym_d.add("uan");  
  117.         ym_d.add("ui");  
  118.         ym_d.add("un");  
  119.         ym_d.add("uo");  
  120.         ym_f.add("a");// f
  121.         ym_f.add("an");  
  122.         ym_f.add("ang");  
  123.         ym_f.add("ei");  
  124.         ym_f.add("en");  
  125.         ym_f.add("eng");  
  126.         ym_f.add("iao");  
  127.         ym_f.add("o");  
  128.         ym_f.add("ou");  
  129.         ym_f.add("u");  
  130.         ym_g.add("a");// g
  131.         ym_g.add("ai");  
  132.         ym_g.add("an");  
  133.         ym_g.add("ang");  
  134.         ym_g.add("ao");  
  135.         ym_g.add("e");  
  136.         ym_g.add("ei");  
  137.         ym_g.add("en");  
  138.         ym_g.add("eng");  
  139.         ym_g.add("ong");  
  140.         ym_g.add("ou");  
  141.         ym_g.add("u");  
  142.         ym_g.add("uai");  
  143.         ym_g.add("uan");  
  144.         ym_g.add("uang");  
  145.         ym_g.add("ui");  
  146.         ym_g.add("un");  
  147.         ym_g.add("uo");  
  148.         ym_h.add("a");// h
  149.         ym_h.add("ai");  
  150.         ym_h.add("an");  
  151.         ym_h.add("ang");  
  152.         ym_h.add("ao");  
  153.         ym_h.add("e");  
  154.         ym_h.add("ei");  
  155.         ym_h.add("en");  
  156.         ym_h.add("eng");  
  157.         ym_h.add("ong");  
  158.         ym_h.add("ou");  
  159.         ym_h.add("u");  
  160.         ym_h.add("ua");  
  161.         ym_h.add("uai");  
  162.         ym_h.add("uan");  
  163.         ym_h.add("uang");  
  164.         ym_h.add("ui");  
  165.         ym_h.add("un");  
  166.         ym_h.add("uo");  
  167.         ym_j.add("i");// j
  168.         ym_j.add("ia");  
  169.         ym_j.add("ian");  
  170.         ym_j.add("iang");  
  171.         ym_j.add("iao");  
  172.         ym_j.add("ie");  
  173.         ym_j.add("in");  
  174.         ym_j.add("ing");  
  175.         ym_j.add("iong");  
  176.         ym_j.add("iu");  
  177.         ym_j.add("u");  
  178.         ym_j.add("uan");  
  179.         ym_j.add("ue");  
  180.         ym_j.add("un");  
  181.         ym_k.add("a");//
  182.         ym_k.add("ai");  
  183.         ym_k.add("an");  
  184.         ym_k.add("ang");  
  185.         ym_k.add("ao");  
  186.         ym_k.add("e");  
  187.         ym_k.add("en");  
  188.         ym_k.add("eng");  
  189.         ym_k.add("ong");  
  190.         ym_k.add("ou");  
  191.         ym_k.add("u");  
  192.         ym_k.add("ui");  
  193.         ym_k.add("un");  
  194.         ym_k.add("uo");  
  195.         ym_l.add("a");// l
  196.         ym_l.add("ai");  
  197.         ym_l.add("an");  
  198.         ym_l.add("ang");  
  199.         ym_l.add("ao");  
  200.         ym_l.add("e");  
  201.         ym_l.add("ei");  
  202.         ym_l.add("eng");  
  203.         ym_l.add("i");  
  204.         ym_l.add("ia");  
  205.         ym_l.add("ian");  
  206.         ym_l.add("iao");  
  207.         ym_l.add("ie");  
  208.         ym_l.add("in");  
  209.         ym_l.add("ing");  
  210.         ym_l.add("iu");  
  211.         ym_l.add("o");  
  212.         ym_l.add("ong");  
  213.         ym_l.add("ou");  
  214.         ym_l.add("u");  
  215.         ym_l.add("uan");  
  216.         ym_l.add("un");  
  217.         ym_l.add("uo");  
  218.         ym_l.add("v");  
  219.         ym_l.add("ve");  
  220.         ym_m.add("a");// m
  221.         ym_m.add("ai");  
  222.         ym_m.add("an");  
  223.         ym_m.add("ang");  
  224.         ym_m.add("ao");  
  225.         ym_m.add("e");  
  226.         ym_m.add("ei");  
  227.         ym_m.add("en");  
  228.         ym_m.add("eng");  
  229.         ym_m.add("i");  
  230.         ym_m.add("ian");  
  231.         ym_m.add("iao");  
  232.         ym_m.add("ie");  
  233.         ym_m.add("in");  
  234.         ym_m.add("ing");  
  235.         ym_m.add("iu");  
  236.         ym_m.add("o");  
  237.         ym_m.add("ou");  
  238.         ym_m.add("u");  
  239.         ym_n.add("a");// n
  240.         ym_n.add("ai");  
  241.         ym_n.add("an");  
  242.         ym_n.add("ang");  
  243.         ym_n.add("ao");  
  244.         ym_n.add("e");  
  245.         ym_n.add("ei");  
  246.         ym_n.add("en");  
  247.         ym_n.add("eng");  
  248.         ym_n.add("i");  
  249.         ym_n.add("ian");  
  250.         ym_n.add("iang");  
  251.         ym_n.add("iao");  
  252.         ym_n.add("ie");  
  253.         ym_n.add("in");  
  254.         ym_n.add("ing");  
  255.         ym_n.add("iu");  
  256.         ym_n.add("ong");  
  257.         ym_n.add("ou");  
  258.         ym_n.add("u");  
  259.         ym_n.add("uan");  
  260.         ym_n.add("un");  
  261.         ym_n.add("uo");  
  262.         ym_n.add("v");  
  263.         ym_n.add("ve");  
  264.         ym_p.add("a");// p
  265.         ym_p.add("ai");  
  266.         ym_p.add("an");  
  267.         ym_p.add("ang");  
  268.         ym_p.add("ao");  
  269.         ym_p.add("e");  
  270.         ym_p.add("ei");  
  271.         ym_p.add("en");  
  272.         ym_p.add("eng");  
  273.         ym_p.add("i");  
  274.         ym_p.add("ian");  
  275.         ym_p.add("iao");  
  276.         ym_p.add("ie");  
  277.         ym_p.add("in");  
  278.         ym_p.add("ing");  
  279.         ym_p.add("o");  
  280.         ym_p.add("ou");  
  281.         ym_p.add("u");  
  282.         ym_q.add("i");// q
  283.         ym_q.add("ia");  
  284.         ym_q.add("ian");  
  285.         ym_q.add("iang");  
  286.         ym_q.add("iao");  
  287.         ym_q.add("ie");  
  288.         ym_q.add("in");  
  289.         ym_q.add("ing");  
  290.         ym_q.add("iong");  
  291.         ym_q.add("iu");  
  292.         ym_q.add("u");  
  293.         ym_q.add("uan");  
  294.         ym_q.add("ue");  
  295.         ym_q.add("un");  
  296.         ym_r.add("an");// r
  297.         ym_r.add("ang");  
  298.         ym_r.add("ao");  
  299.         ym_r.add("e");  
  300.         ym_r.add("en");  
  301.         ym_r.add("eng");  
  302.         ym_r.add("i");  
  303.         ym_r.add("ong");  
  304.         ym_r.add("ou");  
  305.         ym_r.add("u");  
  306.         ym_r.add("ua");  
  307.         ym_r.add("uan");  
  308.         ym_r.add("ui");  
  309.         ym_r.add("un");  
  310.         ym_r.add("uo");  
  311.         ym_s.add("a");// s
  312.         ym_s.add("ai");  
  313.         ym_s.add("an");  
  314.         ym_s.add("ang");  
  315.         ym_s.add("ao");  
  316.         ym_s.add("e");  
  317.         ym_s.add("en");  
  318.         ym_s.add("eng");  
  319.         ym_s.add("i");  
  320.         ym_s.add("ong");  
  321.         ym_s.add("ou");  
  322.         ym_s.add("u");  
  323.         ym_s.add("uan");  
  324.         ym_s.add("ui");  
  325.         ym_s.add("un");  
  326.         ym_s.add("uo");  
  327.         ym_t.add("a");// t
  328.         ym_t.add("ai");  
  329.         ym_t.add("an");  
  330.         ym_t.add("ang");  
  331.         ym_t.add("ao");  
  332.         ym_t.add("e");  
  333.         ym_t.add("ei");  
  334.         ym_t.add("eng");  
  335.         ym_t.add("i");  
  336.         ym_t.add("ian");  
  337.         ym_t.add("iao");  
  338.         ym_t.add("ie");  
  339.         ym_t.add("ing");  
  340.         ym_t.add("ong");  
  341.         ym_t.add("ou");  
  342.         ym_t.add("u");  
  343.         ym_t.add("uan");  
  344.         ym_t.add("ui");  
  345.         ym_t.add("un");  
  346.         ym_t.add("uo");  
  347.         ym_w.add("a");// w
  348.         ym_w.add("ai");  
  349.         ym_w.add("an");  
  350.         ym_w.add("ang");  
  351.         ym_w.add("ei");  
  352.         ym_w.add("en");  
  353.         ym_w.add("eng");  
  354.         ym_w.add("o");  
  355.         ym_w.add("u");  
  356.         ym_x.add("i");// x
  357.         ym_x.add("ia");  
  358.         ym_x.add("ian");  
  359.         ym_x.add("iang");  
  360.         ym_x.add("iao");  
  361.         ym_x.add("ie");  
  362.         ym_x.add("in");  
  363.         ym_x.add("ing");  
  364.         ym_x.add("iong");  
  365.         ym_x.add("iu");  
  366.         ym_x.add("u");  
  367.         ym_x.add("uan");  
  368.         ym_x.add("ue");  
  369.         ym_x.add("un");  
  370.         ym_y.add("a");// y
  371.         ym_y.add("an");  
  372.         ym_y.add("ang");  
  373.         ym_y.add("ao");  
  374.         ym_y.add("e");  
  375.         ym_y.add("i");  
  376.         ym_y.add("in");  
  377.         ym_y.add("ing");  
  378.         ym_y.add("o");  
  379.         ym_y.add("ong");  
  380.         ym_y.add("ou");  
  381.         ym_y.add("u");  
  382.         ym_y.add("uan");  
  383.         ym_y.add("ue");  
  384.         ym_y.add("un");  
  385.         ym_z.add("a");//
  386.         ym_z.add("ai");  
  387.         ym_z.add("an");  
  388.         ym_z.add("ang");  
  389.         ym_z.add("ao");  
  390.         ym_z.add("e");  
  391.         ym_z.add("ei");  
  392.         ym_z.add("en");  
  393.         ym_z.add("eng");  
  394.         ym_z.add("i");  
  395.         ym_z.add("ong");  
  396.         ym_z.add("ou");  
  397.         ym_z.add("u");  
  398.         ym_z.add("uan");  
  399.         ym_z.add("ui");  
  400.         ym_z.add("un");  
  401.         ym_z.add("uo");  
  402.         ym_ch.add("a");// ch
  403.         ym_ch.add("ai");  
  404.         ym_ch.add("an");  
  405.         ym_ch.add("ang");  
  406.         ym_ch.add("ao");  
  407.         ym_ch.add("e");  
  408.         ym_ch.add("en");  
  409.         ym_ch.add("eng");  
  410.         ym_ch.add("i");  
  411.         ym_ch.add("ong");  
  412.         ym_ch.add("ou");  
  413.         ym_ch.add("u");  
  414.         ym_ch.add("ua");  
  415.         ym_ch.add("uai");  
  416.         ym_ch.add("uan");  
  417.         ym_ch.add("uang");  
  418.         ym_ch.add("ui");  
  419.         ym_ch.add("un");  
  420.         ym_ch.add("uo");  
  421.         ym_sh.add("a");// sh
  422.         ym_sh.add("ai");  
  423.         ym_sh.add("an");  
  424.         ym_sh.add("ang");  
  425.         ym_sh.add("ao");  
  426.         ym_sh.add("e");  
  427.         ym_sh.add("ei");  
  428.         ym_sh.add("en");  
  429.         ym_sh.add("eng");  
  430.         ym_sh.add("i");  
  431.         ym_sh.add("ou");  
  432.         ym_sh.add("u");  
  433.         ym_sh.add("ua");  
  434.         ym_sh.add("uai");  
  435.         ym_sh.add("uan");  
  436.         ym_sh.add("uang");  
  437.         ym_sh.add("ui");  
  438.         ym_sh.add("un");  
  439.         ym_sh.add("uo");  
  440.         ym_zh.add("a");// zh
  441.         ym_zh.add("ai");  
  442.         ym_zh.add("an");  
  443.         ym_zh.add("ang");  
  444.         ym_zh.add("ao");  
  445.         ym_zh.add("e");  
  446.         ym_zh.add("ei");  
  447.         ym_zh.add("en");  
  448.         ym_zh.add("eng");  
  449.         ym_zh.add("i");  
  450.         ym_zh.add("ong");  
  451.         ym_zh.add("ou");  
  452.         ym_zh.add("u");  
  453.         ym_zh.add("ua");  
  454.         ym_zh.add("uai");  
  455.         ym_zh.add("uan");  
  456.         ym_zh.add("uang");  
  457.         ym_zh.add("ui");  
  458.         ym_zh.add("un");  
  459.         ym_zh.add("uo");  
  460.         ym.add(yy);  
  461.         ym.add(ym_b);  
  462.         ym.add(ym_c);  
  463.         ym.add(ym_d);  
  464.         ym.add(ym_f);  
  465.         ym.add(ym_g);  
  466.         ym.add(ym_h);  
  467.         ym.add(ym_j);  
  468.         ym.add(ym_k);  
  469.         ym.add(ym_l);  
  470.         ym.add(ym_m);  
  471.         ym.add(ym_n);  
  472.         ym.add(ym_p);  
  473.         ym.add(ym_q);  
  474.         ym.add(ym_r);  
  475.         ym.add(ym_s);  
  476.         ym.add(ym_t);  
  477.         ym.add(ym_w);  
  478.         ym.add(ym_x);  
  479.         ym.add(ym_y);  
  480.         ym.add(ym_z);  
  481.         ym.add(ym_ch);  
  482.         ym.add(ym_sh);  
  483.         ym.add(ym_zh);  
  484.     }  
  485.     publicstatic String findsm(String py) {  
  486.         char[] py2 = py.toCharArray();// 將讀入字元轉為char陣列
  487.         int temp = 0;  
  488.         int index = 0;//
  489.         // 遍歷聲母集合,匹對
  490.         for (int i = 0; i < sm.size(); i++) {  
  491.             for (int j = 1; j <= py2.length; j++) {  
  492.                 String py3 = String.copyValueOf(py2, 0, j);// 擷取從0開始到j結束的字串
  493.                 if (py3.equals(sm.get(i))) {  
  494.                     temp = sm.get(i).length();// 對應的聲母的長度
  495.                     index = i + 1;  
  496.                     break;  
  497.                 }  
  498.             }  
  499.         }  
  500.         if (temp != 0) {  
  501.             result = result + String.copyValueOf(py2, 0, temp);// 將匹對出來的聲母賦給result
  502.             py = py.substring(temp);  
  503.         }  
  504.         // 匹對完聲母后如果字串還麼結束繼續匹對韻母
  505.         if (py.length() != 0) {  
  506.             return findym(py, index);  
  507.         } else {  
  508.             return py;  
  509.         }  
  510.     }  
  511.     publicstatic String findym(String py, int index) {  
  512.         int temp = 0;  
  513.         char[] py2 = py.toCharArray();  
  514.         for (int i = 0; i < ym.get(index).size(); i++) {  
  515.             for (int j = 1; j <= py2.length; j++) {  
  516.                 String py3 = String.copyValueOf(py2, 0, j);  
  517.                 if (py3.equals(ym.get(index).get(i))) {  
  518.                     temp = ym.get(index).get(i).length();  
  519.                     break;  
  520.                 }  
  521.             }  
  522.         }  
  523.         if (temp != 0) {  
  524.             result = result + String.copyValueOf(py2, 0, temp) + " ";  
  525.             py = py.substring(temp);  
  526.         }  
  527.         return py;  
  528.     }  
  529.     /** 
  530.      * 拼音全拼分詞工具 
  531.      *  
  532.      * @param pell 
  533.      * @return 以空格區分的分詞後的字串 
  534.      */
  535.     publicstatic String trimSpell(String spell) {  
  536.         String s = spell;  
  537.         for (int i = 0; i < spell.length() * 2; i++) {  
  538.             if (s.length() == 0) {  
  539.                 break;  
  540.             }  
  541.             s = findym(s, 0);  
  542.             s = findsm(s);  
  543.         }  
  544.         return result;  
  545.     }  
  546.     publicstaticvoid main(String[] args) {  
  547.         //long start = System.currentTimeMillis();
  548.         String spell = "woaibeijintiananmen";  
  549.         String result = SpellTool.trimSpell(spell);  
  550.         //long end = System.currentTimeMillis();
  551.         //System.out.println("用時:" + (end - start) + "毫秒");
  552.         System.out.println(result);  
  553.     }  
  554. }  

測試:

輸入:woaibeijintiananmen

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

輸入:sousuozhongdefenciqiyouhenduozhong

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