zoukankan      html  css  js  c++  java
  • pinyin.dict.js 汉字转化为拼音,带读声,穷举多音字

    1,没别的,像这种没有规则的转化,我们首先需要一个字典文件,字典文件的完整度,决定了转化的成功率与精确度

    2,笔者收集了较为完整的字典文件,已上传到博客园,欢迎补充  =>  https://blog-static.cnblogs.com/files/lovling/pinyin.dict.js

    这个地址可以直接用 script 标签引入,但是博客园经常抽风,是不是的访问不到,推荐使用时还是在浏览器打开,拷贝到本地在引入使用

    3,借助字典,编写程序进行匹配转化,代码如下,注释写的不是很详细,不过相信都能看懂

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>汉字转化为拼音</title>
        <!--<script src="https://blog-static.cnblogs.com/files/lovling/pinyin.dict.js"></script>-->
        <script src="./pinyin.dict.js"></script>
        <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>
    </head>
    <style type="text/css">
        #word, #butt {
            width: 360px;
            height: 44px;
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-size: 14px;
        }
        #text1, #text2, #text3 {
            height: 44px;
        }
    </style>
    <body>
        <input id="word" type="text" />
        <input id="butt" type="button" value="转化" />
        <div id="text1"></div>
        <div id="text2"></div>
        <div id="text3"></div>
    </body>
    <script type="text/javascript">
        /**
         * 封装汉字转化为拼音的方法,该方法具有以下特点
         * 1, 多音字只是识别成多种拼音组合, 不能精准识别
         * 2, 不开启多音字, 汉字识别返回使用频率高的拼音
         * @param {String} str: 汉字字符串
         * @param {Boolean} isTone: 是否进行声调识别 默认 false
         * @param {Boolean} isMultitone: 是否穷举多音字 默认 false
         * @return: 如果开启多音字识别, 返回的是数组, 否则返回字符串
         */
        var chineseCharToPinyin = (function () {
            // 注意这里的变量 pinyinDict 来自于字典文件,需要先引入字典文件,且该变量不要在程序中被覆盖
            var temp = pinyinDict.split(','), withtone = {};
            // 循环遍历字典,以汉字字符为 key,对应的拼音为 value,形成一个超大的 JSON 对象
            for(var i = 0; i < temp.length; i++) {
                withtone[String.fromCharCode(i + 19968)] = temp[i];
            }
            var toneMap = {
                "ā": "a1", "á": "a2", "ǎ": "a3", "à": "a4", "ō": "o1", "ó": "o2", "ǒ": "o3",
                "ò": "o4", "ē": "e1", "é": "e2", "ě": "e3", "è": "e4", "ī": "i1", "í": "i2",
                "ǐ": "i3", "ì": "i4", "ū": "u1", "ú": "u2", "ǔ": "u3", "ù": "u4", "ü": "v0",
                "ǖ": "v1", "ǘ": "v2", "ǚ": "v3", "ǜ": "v4", "ń": "n2", "ň": "n3", "": "m2"
            };
            // 未开启声调识别的时候,将带声调的字符切换成不带声调的字母
            var removeTone = function(pinyin) {
                return pinyin.replace(/[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň�]/g, function(m) {
                    return toneMap[m][0];
                });
            };
            // 过滤掉多音字穷举产生的相同结果
            var simpleUnique = function(array) {
                var result = [], hash = {};
                for(var i = 0; i < array.length; i++) {
                    var key = (typeof array[i]) + array[i];
                    if(!hash[key]) {
                        result.push(array[i]);
                        hash[key] = true;
                    }
                }
                return result;
            };
            // 多音字穷举
            var handlePolyphone = function(array, joinChar) {
                var result = [''], temp = [];
                for(var i = 0; i < array.length; i++) {
                    temp = [];
                    var t = array[i].split(' ');
                    for(var j = 0; j < t.length; j++) {
                        for(var k = 0; k < result.length; k++)
                            temp.push(result[k] + (result[k] ? joinChar : '') + t[j]);
                    }
                    result = temp;
                }
                return simpleUnique(result);
            };
            // 对外返回一个转化的方法
            return function (str, isTone = false, isMultitone = false) {
                var result = [], pinyin;
                for(var i = 0; i < str.length; i++) {
                    pinyin = withtone[str[i]];
                    if(!isTone && pinyin) pinyin = removeTone(pinyin);
                    if(!isMultitone && pinyin) pinyin = pinyin.replace(/ .*$/g, '');
                    result.push(pinyin || str[i]);
                }
                if(!isMultitone) return result.join(" ");
                return handlePolyphone(result, " ");
            }
        })();
    
    
        /**
         * 写一个输入框测试一下
         */
        $('#butt').on("click", function (ev) {
            var str = $("#word").val().trim();
    
            // 最简单的使用
            $("#text1").text(chineseCharToPinyin(str));
    
            // 带读声识别的使用
            $("#text2").text(chineseCharToPinyin(str, true));
    
            // 穷举多音字的使用
            $("#text3").text(chineseCharToPinyin(str, true, true))
    
        });
    </script>
    </html>

    4,效果如下,还是不错的吗

    5,唯一遗憾的是,我们发现,开启多音字识别的时候,并不能准确的识别出我们想要的,而是返回了所有可能的组合

    6,我们有办法实现准确的识别码?理论上是可行的,只要我们拥有一个强大的词典,

    7,注意是词典,不是字典,指每个汉字的所有可能词组,包括各种不同语境,某些地区的使用习惯,某些群体的使用习惯等等

    7,这已经涉及到大数据和人工智能的(个人看法),由于组合实在太多,想要收集十分困难,就算收集完成,计算量也非常庞大,一般设备也不一定带的动

  • 相关阅读:
    写在毕业季前
    使用Github Page鼓励自己每日编程
    win8/Metro开发系列一 Xaml布局
    AlertDialog详解
    安卓项目文件目录
    Andriod布局之LinearLayout
    Andriod定时任务
    android 设置布局横屏竖屏
    Android默认启动程序问题
    Android全屏显示
  • 原文地址:https://www.cnblogs.com/lovling/p/10521292.html
Copyright © 2011-2022 走看看