精华内容
下载资源
问答
  • 用Python写拼音输入法

    千次阅读 2020-09-12 00:02:53
    拼音输入法的简单实现可以归结为使用维特比算法求解汉字隐马尔可夫模型的问题:将用户输入的拼音转换为字层,使用维特比算法求解得到概率最大的个“字链”,这个“字链”便是拼音输入法输出的文字。...

    拼音输入法的简单实现可以归结为使用维特比算法求解汉字隐马尔可夫模型的问题:将用户输入的拼音转换为字层,使用维特比算法求解得到概率最大的一个“字链”,这个“字链”便是拼音输入法输出的文字。主要的几个步骤包括:

    1、语料数据的预处理:把语料内容从文件列表中抽取出来,分句,去掉非中文字符。2、在所有语料中,计算每个汉字的出现频次。3、在所有语料中,计算当前汉字与其前面的汉字共同出现的频数,并计算其频率。4、建立输入拼音与汉字的匹配关系,构造输入拼音对应汉字的隐马尔科夫模型。5、使用维特比算法求解,得到概率最大的一个“字链”,取这个“字链”为输出的句子。6、测试准确率。

    1 代码构造

    根据需求和实现步骤,写3个python程序。

    第一个根据输入的语料库,计算汉字出现的频次、汉字与前一个汉字共同出现的频次和语料库的总字数。

    第二个,首先根据“拼音汉字表”构造拼音与汉字的对应关系,将用户输入的拼音通过这个对应关系形成一个隐马尔科夫模型。根据第一个程序得出的结果,使用维特比算法,计算得到概率最大的“字链”,将这个“字链”输出为句子。

    第三个,使用测试数据集,测试输入法的准确率和整句准确率。

    代码结构如下。

    2 实现过程

    2.1 数据预处理

    模型使用2016年2月、4-11月共9个月的新浪新闻语料数据进行模型训练。在训练之前,使用re.split()对语料中每一条新闻进行分句,分句依据为特定的标点符号,作为分句的标点为:(1)中文标点“:”、“。”、“……”、“,”、“?”、“、”(2)英文标点:“:”、“,”“!”、“?”。

    由于只考虑6763个一二级汉字,为提高模型的可靠性,在分句时,如果这句话出现基本汉字之外的汉字,则不将这句话纳入模型训练。另外,使用“零一二三四五六七八九”代替阿拉伯数字“123456789”。同时,在每一句话中去掉所有非中文字符。对每一个数据集的每一条新闻都做同样的分句和数据处理,得到训练句子集。

    2.2 生成汉字频数矩阵

    对于已经得到的句子集合,以一二级汉字为统计对象,统计每个汉字的频数、每个汉字出现在句首的频数、当前汉字与前一汉字共同出现的频数、所有汉字的累计出现频数,分别定义hzarray、headarray、hzmatrix和totalNum 4个变量来存储这些数据。hzarray、headarray是数组形式,hzmatrix是矩阵形式。

    2.3 生成汉字的隐马尔科夫模型

    根据拼音汉字表,生成拼音与汉字对应关系的字典,并将输入的每一个拼音转化为对应的所有汉字。假设在一个句子中,每一个汉字的出现仅与前一个汉字有关,以每一个拼音所对应的汉字作为字链中的一层,生成汉字的隐马尔科夫模型。句首汉字的出现概率与其自身出现的概率与出现在句首的概率有关,用λ1来调节。同时,在计算概率时,将相应汉字的频次从各频次矩阵中提取出来,计算各个汉字出现的频率。由于总的汉字数超过4亿,在这里将上述两个概率以频率近似以频率代替。

    在完成计算后,得到汉字的隐马尔科夫模型λ=(A,B,π),其中,状态转移矩阵A为当前汉字与前一汉字共同出现的概率矩阵,观测矩阵B为当前汉字出现的概率。初始矩阵π为句首汉字概率矩阵。其计算公式如下:

    汉字的隐马尔科夫链如下图。

    2.4 构建维特比函数

    在拼音输入时,使用.lower()函数将输入的拼音转化为小写。

    (1)对第一个节点,有:

    若只有一个拼音输入,取δ1(i)最大的节点,即:

    当输入两个以上的汉字时,先考虑句首汉字的概率,在完成过程(1)的基础上,完成如下过程。

    (2)从第2个节点开始,有:

    (3)终止,得到:

    (4)通过iT*,对t=T-1, T-2,...,1进行最优路径回溯:

    通过以上过程,得到字链的最佳路径I*=(i1*,i2*,...iT*),由I*查找对应的汉字,即可以组成输出的句子。

    在写代码时, 放到同一个数组p_num中, 放在同一个矩阵p中。

    2.5 构造测试函数

    使用Levenshtein.hamming()计算实际汉字和拼音输入法输出汉字之间对应位置上不同字符的个数,用该段汉字总数减去不相符汉字的总数,得到该段汉字字符相同的汉字数。对每段汉字进行上述操作,加总除以总字数,得到准确率。整句准确率以完全相同的句子数量除以句子总数得到。

    3 实现效果

    在实现上,构建了testinput()和testaccuracy()两个函数。test_input()实现在命令行中输入拼音,输出汉字的效果。

    testaccuracy()用作准确率测试。使用拼音数据inputdomo1.txt进行测试,取λ1=0.8,准确率为78.1%,整句准确率为25.6%。

    使用新浪新闻的拼音数据input_domo2.txt测试,取λ1=0.5,拼音输入法准确率达到86.4%,整句准确率达到47.4%。

    4 效果好的和效果差的,对比分析

    在未分句时,使用整段新闻去掉标点和生僻字后得到的输出汉字,输入拼音“wo ai ni”会出现“我哎你”的情况。

    分析发现,出现在一句话的句末的频次较高的字与出现在句前频次较高的字会有较高的概率共同出现在一起。所以,最终在计算各汉字频次时,使用分句的形式进行。为提高准确率,把阿拉伯数字转化为汉字数字,当句子中出现不在一二级汉字表中的汉字时,不将这句话纳入计算中。虽然计算时间基本不变,但是计算准确率得到提高。

    同样,由于训练语料库的特点,与训练语料库同一来源新浪新闻测试集的准确率显著高于其他随机输入的拼音测试集。对于新闻中出现的热词准确率很高。

    5 对照参数选择,性能分析

    更改值,使用拼音数据input_domo1.txt进行测试,发现准确率变化幅度不大(如下图),但是取λ1=0.8时,准确率能够达到一个极大值。

    6 总结收获

    这是我人工智能课的第一次大作业,花了很多时间,也学到了不少东西。这门课我三次作业成绩也都还不错,发上来一是为了记录在公众号上,充实一下公众号的内容,提高一下公众号水平;二是也是提高我自己的自信:文科同学也能学好数学,写好代码……

    实践是最好的老师。通过本次学习,提高了对马尔科夫过程、隐马尔科夫模型、维特比算法的理解,对python的编程也更为熟练。

    同时,由于数据量较大,写循环函数时代码极容易出错,应该在完成一段代码后立即测试。在调试代码的过程中,曾出现过汉字与前一个汉字共同出现次数大于单个汉字出现次数的情况,原因在于在计算频次时有一个变量出现错误。另外,在维特比算法的计算过程中,出现的index较多,容易弄乱,在循环计算中对应关系也应该小心,否则极易出现错误。付出极高的时间成本。

    另外,对于变量的命名最好规范,做好规划,否则变量太多后容易出错。

    8 改进方案

    备选汉字可以不局限于一二级汉字表,使用包含20902个汉字的基本汉字表,可以提高输入法的适用性。另外,语料库可以不局限于新闻语料,类型更为多样的语料库可以提高输出句子的准确率和整句正确率。基于字的二元模型可以换成三元甚至更多,也能够进一步提高句子的准确率和整句正确率。

    展开全文
  • 一年级拼音-拼音.pdf

    2021-11-01 14:24:43
    一年级拼音-拼音.pdf
  • 一年级下看拼音写汉字汇总打印版,从第课到最后课均有,附带答案。可以给拼音不好的孩子更好的练习,与人教版课本一一对应,好资源要分享才更好。
  • 这是个非常不错的拼音索引效果案例,源码FancyListIndexer,listview 或者 gridview的拼音索引效果。里面的自定义view FancyIndexer类做的很不错。
  • 拼音练习一年级拼音共十五页.doc
  • 小学一年级拼音学习方法拼音学习诀窍.doc
  • 小学一年级拼音学习方法,拼音学习诀窍.doc
  • 小学一年级拼音练习根据汉字写拼音正稿.pdf
  • 中国拼音练习1单韵母班级姓名读熟单韵母的四声要求读准读熟至少读5遍我读了遍二练写单韵母照样子抄写.要求认真写写饱满三练习写自己的名字注意请家长督促孩子保管好每次发下来的拼音纸以宝妈宝爸
  • 23个一年级拼音交互式练习或游戏含源代码,可以给学生自学,在游戏或练习中巩固汉语拼音
  • 小学语文毕业总复习一拼音。.doc
  • 小学语文毕业总复习一拼音。-2.doc
  • 六年级毕业专项复习一拼音PPT学习教案.pptx
  • 最全中文拼音字库.zip

    2019-05-27 16:45:58
    用于生成输入法,中文图片训练集等,OCR识别汉字库,欢迎下载。
  • 可以实现汉字转拼音功能,里面有第三方java,直接加到工程的lib可以使用,配置工程后即可运行,若有疑问可以留言
  • asp 取得中文句子头个字的大写拼音字母的函数
  • 一年级看图写拼音练习姓名看图补充音节并加上声调一年级拼音练习dbjq
  • 主要介绍了java随机生成个名字和对应拼音的方法,涉及java针对数组及随机数操作的相关技巧,需要的朋友可以参考下
  • 拼音输入法源代码

    热门讨论 2009-06-17 17:32:02
    拼音输入法C++源代码,学习输入法编程的可以看看
  • iang[央] iong[用] uai[外] uan[弯] uang[往] 韵母歌 汉语拼音字母表-整体认读音节 zhi chi shi ri zi ci si yi wu yu ye yue yin yun yuan ying 唱唱 汉语拼音字母表(大小写对照) 汉语拼音共有十种基本笔画 ...

    1f66db880f17f97f7c602f8a0b58b2d5.gif

    文末有打印资料的方法

    往期回顾:

    部编版一年级上册语文期中练习题(6套)+测试卷,可打印!

    人教版一年级上册数学期中测试题及答案(8套),可打印!

    北师大版一年级上册数学期中测试题及答案(2套),可打印!

    一年级语文上册期中复习知识点归类及分类复习巩固课件

    一年级数学期中知识点复习课件,考前巩固!

    苏教版一年级上册数学期中测试题及答案(2套),可打印!

    部编版语文一年级上册1~4单元知识点归纳,期末考前复习!

    人教版一年级上册数学1-4单元知识点精选+经典题型,孩子期中必备!

    北师大版一年级数学1-4单元上册知识点归纳,孩子复习必备!

    1ca83760a3bd17cfe95d2f87de4a4115.png

    拼音字母表学习攻略包括26个汉语拼音字母表读法、拼音字母表图片大全、汉语拼音字母表大小写等拼音字母表学习攻略,请看拼音字母表学习攻略:26个汉语拼音字母表读法

    领取电子版请拉到文末

    领取电子版请拉到文末

    汉语拼音字母表——声母表

    汉语中每个音节起始处的辅音可以构成声母。汉语拼音方案《声母表》规定的声母符号一共有21个。

    b [玻] p [坡] m [摸] f [佛]

    d [得] t [特] n [讷] l [勒] g [哥] k [科] h [喝]

    j [基] q [欺] x [希]

    z [资] c[;雌] s [思] r [日] zh[知] ch [嗤] sh [诗]

    y [医] w [巫]

    拼音歌

    a3b6232eb6083be491e9e29dc4f29de0.png

    声调歌

    a3b6232eb6083be491e9e29dc4f29de0.png

    拼音基础教学

    推荐给老师和家长看的拼音学习视频

    a3b6232eb6083be491e9e29dc4f29de0.png

    汉语拼音字母表——韵母表

    汉语普通話拼音中一共有37个韵母。分别是:

    a[阿] an[安] ao[奥] ai[哀] ang[昂]

    o[喔] ong[翁] ou[欧]

    e[鹅] en[恩] er[儿] ei[唉] eng[摁]

    i[衣] ia[呀] iu[由] ie[耶] in[因] ing[英]

    u[乌] un[温] ua[蛙] uo[窝] ue[月] ui[威]

    ü[迂]

    iao[腰] ian[烟] iang[央] iong[用]

    uai[外] uan[弯] uang[往]

    韵母歌

    汉语拼音字母表-整体认读音节

    zhi chi shi ri zi ci si

    yi wu yu

    ye yue

    yin yun yuan ying

    唱一唱  

    汉语拼音字母表(大小写对照)

    b6b5d81902b05db010ffb07d875be699.png

    汉语拼音共有十种基本笔画

    它们的名称是: 横、 竖、左弯竖、右弯竖、竖左弯、竖右弯、左半圆、右半圆、左斜、右斜。

    6个单韵母和20个声母的笔顺

    a:第一笔左半圆,第二笔竖右弯 o:左上起笔,一笔写成 e:中间起笔,从左至右一笔写成 i:第一笔竖,第二笔点 u:第一笔竖右弯,第二笔竖 v:先写u,后从左至右写两点 b:第一笔竖,第二笔右半圆 p:第一笔竖,第二笔右半圆 m:第一笔竖,第二笔左弯竖,第三笔左弯竖 f:第一笔右弯竖,第二笔横 d:第一笔左半圆,第二笔竖 t:第一笔竖右弯,第二笔横 n:第一笔竖,第二笔左弯竖 l:竖,一笔写成 g:第一笔左半圆,第二笔竖左弯 k:第一笔竖,第二笔左斜右斜 h:第一笔竖,第二笔左弯竖 j:第一笔竖左弯,第二笔点 q:第一笔左半圆,第二笔竖 x:第一笔右斜,第二笔左斜 z:一笔写成 c:左半圆一笔写成 s:一笔写成 r:第一笔竖,第二笔右弯 y:第一笔右斜,第二笔左斜 w:两笔写成,斜下斜上,斜下斜上 注:zh ch sh 笔顺参考z c s h的笔顺。

    打印资料的方法:

    1、高清图可保存图片到手机,去打印店打印;

    2、复制粘贴到word文档里打印;

    3、在电脑上登录微信点开文章,用浏览器打开打印。

    推荐阅读:

    统编版一年级上册语文拼音测试题+拼音练习,可下载!

    一年级数学上册重难点归纳分析总结,非常实用!

    一年级数学上册应用题大全(50道)必考题型,孩子提前练!

    一年级数学上册基础分类练习题,给孩子下载练习!

    一年级数学上册口算专项练习题,提高计算速度!

    一年级数学上册数学位置练习题精选,孩子考试必考!

    一年级数学上册:10以内加减、填空、比大小、列式,综合作业12套

    最新部编一年级语文上册总预习资料(有练习)!

    一年级语文重点必背古诗20首,必须要背熟!赶快收藏!

    一年级语文上册看图写话指导(附范文全集及视频),可下载!

    一年级上册语文《课外阅读》精选24篇含答案,可给孩子下载!

    7e59f23d703e1d70bdb2c792ba5bf89f.png

    ❖  欢 迎 分 享 到 朋 友 圈 哦  ❖

    9933d97fcce3041dd16a45cfae0342a5.gif

    展开全文
  • java的中文拼音搜索jar包 maven下的目录E:\maven_repository\repository\net\sourceforge\pinyin4j\pinyin4j-core\2.5.0
  • C++ 拼音输入法

    热门讨论 2011-12-22 10:10:18
    该系统是个基于C++的输入法系统,可以很好地实现汉字的输出,值得参考
  • 输入个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu 输入格式: 输入在行中给出个整数,如:...

    输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

    0: ling
    1: yi
    2: er
    3: san
    4: si
    5: wu
    6: liu
    7: qi
    8: ba
    9: jiu
    输入格式:
    输入在一行中给出一个整数,如:1234。
    提示:整数包括负数、零和正数。
    输出格式:
    在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
    输入样例:
    -600
    输出样例:
    fu liu ling ling

    #include<stdio.h>
    int main(void)
    {
    char c;
    c=getchar();
    while(c!='n'){
    if(c=='-') printf("fu");
    else if(c=='0') printf("ling");
    else if(c=='1') printf("yi");
    else if(c=='2') printf("er");
    else if(c=='3') printf("san");
    else if(c=='4') printf("si");
    else if(c=='5') printf("wu");
    else if(c=='6') printf("liu");
    else if(c=='7') printf("qi");
    else if(c=='8') printf("ba");
    else if(c=='9') printf("jiu");
    c=getchar();
    if(c!='\n')
    printf(" ");
    }
    return 0;
    }
    
    

    缺点:代码运行复杂,时间长。

    代码二

    #include <stdio.h>
    int count(int x);
    int main()
    {
      int n;
      if(scanf("%d",&n)){};//输入要读的整数
      int c;
      if(n<0)
      {
      	printf("fu ");
      	n=-n;
      }//当输入的整数为负数时,取负数的相反数
      c=count(n);
      for(int i=0;c>0;i++)//循环的控制条件为c>0,之前写成了n>0
      {
        int m;
        m=n/c;//取出该整数的第一位数字
        n%=c;
        switch (m)
    	{ 
        case 0:
            printf("ling");
            break;
        case 1:
            printf("yi");
            break;
        case 2:
            printf("er");
            break;
        case 3:
            printf("san");
            break;
        case 4:
            printf("si");
            break;
        case 5:
            printf("wu");
            break;
        case 6:
            printf("liu");
            break;
        case 7:
            printf("qi");
            break;
        case 8:
            printf("ba");
            break;
        case 9:
            printf("jiu");
        }
            if(c>9)//判断点,控制最后输出没有空格
    		{
            	printf(" ");
    		}
        c/=10;
      }
      return 0;
    }
    int count(int x)//例如-400,则返回值为100
    {
    	int cnt=1;
    	while(x>9)
    	{
    	    x/=10;
    	    cnt*=10;
    	}
    	return cnt;
    }
    
    展开全文
  • 行内输出 n 的各位数字之和的每位,拼音数字间有 1 空格,但行中最后拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu 思路: 求各个位数上的和 求得的和再将各个...

    输入格式:
    每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10的100次方。

    输出格式:
    在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

    输入样例:
    1234567890987654321123456789
    输出样例:
    yi san wu

    思路:

    1. 求各个位数上的和
    2. 求得的和再将各个位数上数字转换成中文

    利用while语句求得该数的和,然后写一个函数用来数字转换成中文,这里有个投机的地方,由于n是小于10的100次方,所以求得和小于等于900,即该数最大是三位数。

    #数字转换成拼音
    def tra(num):
        return {
            0: 'ling',
            1: 'yi',
            2: 'er',
            3: 'san',
            4: 'si',
            5: 'wu',
            6: 'liu',
            7: 'qi',
            8: 'ba',
            9: 'jiu'
        }.get(num, 'error')
    
    #输入一个数
    a = int(input())
    c = 0
    
    #对该数进行各个位数上求和
    while a > 0:
        b =int(a % 10)
        a =int(a//10)
        c += b
    
    #将求和后的数进行拆分
    d = c // 100
    e = c // 10 - d * 10
    f = c - e * 10 - d * 100
    
    #根据情况分类输出
    if e == 0 and d == 0:
        print(tra(f))
    elif d == 0:
        print(tra(e) + ' ' + tra(f))
    else:
        print(tra(d) + ' ' + tra(e) + ' ' + tra(f))
    

    注意:&、| 是数值变量时用,and、or是逻辑变量的时使用。

    展开全文
  • 自己制作的DOC格式的汉语拼音字母表(四线三格),相信我你绝对不会错!
  • 这个时候,除了学校老师的教育,家长们也要了解一些拼音的基本内容和规则,这样在家也能辅导孩子学习啦~—— 声母表(23个)——声母记忆口诀像个6字b b b,脸盆泼水p p p,两个门洞m m m根拐棍f f f,...
  • 拼音点读机是个小学生学拼音软件,包括声母、韵母和整体认读音节的学习。市面上同类软件大都为视频格式,碰上哪个不懂发音,得来回拉动进度条寻找,操作性不强,本软件采用点读的方式进行学习,哪个不懂点哪个,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,390
精华内容 38,556
关键字:

一的拼音