华宇拼音输入法论坛

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 6756|回复: 26

[求助]如何生成语言模型文件?

[复制链接]
发表于 2014-7-22 16:59:06 | 显示全部楼层 |阅读模式
首先,感谢华宇的开源,让我这种小白有了见识源码奥秘的机会。

最近在研究语言模型的相关问题,用来只能只能识别输入文字,并进行提示等方法。查资料时刚好发现华宇输入法中的应用,受益匪浅。但是有两个问题希望大虾给予指点。

1. 生成语言模型文件的相关资料能给予提供吗?现有的语言模型文件中大多数信息跟我这边的语料库不太相关,所以想使用相关的方法自己生成一个语言模型文件。

2. 关于Bigram过程中的黄金比例(0.618)不太明白,希望大虾指点一个,感激涕零。

感谢大虾的帮助指点!!!
发表于 2014-7-22 17:11:23 | 显示全部楼层
这个语言模型,跟加加拼音的语料库不是一个概念。语言模型是一个算法。达到把系统词库里的词,根据某种算法组合起来,输出新的词的目的。
所以你要生成语言模型以适合你的使用,那可不是一个简单的事,那等于要建立一种新的规则。这必须要收集大量的语言素材才行。这也就是为什么华宇网友一直期待的新的语言模型到现在也没有更新的缘故。
语言模型的建立,是为了减小系统词库的体积,以便一些二字词以上的词能够由输入法本身智能输出。
不知对你是否有用。
譬如下面这句话,在我所采用的任何词库中都没有,但是语言模型根据算法,把系统词库中有的“人类、之所以、做不完”这几个词,智能组成并输出(这个皮肤用绿色字显示的表示是词库中没有的,是由输入法智能组合出来的。):
1.bmp
 楼主| 发表于 2014-7-22 17:42:33 | 显示全部楼层
野风 发表于 2014-7-22 17:11
这个语言模型,跟加加拼音的语料库不是一个概念。语言模型是一个算法。达到把系统词库里的词,根据某种算法 ...

对,我现在的想法就是按照现在既有的规则,生成一个二元语言模型。然后按照词库进行识别文字以后,在根据这个语言模型,对每一个词组进行计算校验(智能组句部分的算法),如果计算值符合要求,表明验证通过。
现在对整体的词频的计算都有方法了,但是正在纠结数据平滑避免零概率部分,在华宇开源的代码里面没有找到这部分相关内容,所以就来找专家帮助一下了~

点评

高手啊!佩服!呵呵。  发表于 2014-7-22 20:02
发表于 2014-7-22 19:13:39 | 显示全部楼层
野风 发表于 2014-7-22 17:11
这个语言模型,跟加加拼音的语料库不是一个概念。语言模型是一个算法。达到把系统词库里的词,根据某种算法 ...

语言模型最初应该是因为词库小,经常出现没有候选的情况,所以通过程序计算来猜用户想输入的内容。

当词库够大、自动记忆用户输入新词的前提下,智能组词功能用的就很少了。
发表于 2014-7-22 19:18:37 | 显示全部楼层
当前条件下,貌似通过寻找新词编制词库比制作语言模型效果好。
发表于 2014-7-22 19:51:26 | 显示全部楼层
四哥当初的意思不是这样的,他认为词库再大也不可能保罗万象,只有输入法具有了一定的智能性以后,才能解决大多数的输入问题。所以他才在标配语言模型的基础上,又搞了三个不同规模的语言模型。
这也就是开发组搜罗50年人民日报语料素材的动机。
并且词库大了,重码也就会大量增加,不仅仅是增加选词的负担,还会增加大量的翻页负担。
另外开发组搞语言模型,还有一个目的就是增强整句输入的能力(当时论坛里有很多讨论和测试那个版本整句输入能力的帖子的,有兴趣可以搜一下。)。毕竟当初第一个在输入法中使用语言模型的是智能狂拼输入法——也是一个具有代表性的整句输入法。
实际上,四哥当初很想更新一下语言模型的——在这个初始的版本里,毕竟因种种原因而留下了诸多的遗憾。但当时我就觉得基本上没有可能了!
发表于 2014-7-22 19:53:15 | 显示全部楼层
winking324 发表于 2014-7-22 17:42
对,我现在的想法就是按照现在既有的规则,生成一个二元语言模型。然后按照词库进行识别文字以后,在根据 ...


这个就要看看官方怎么回复你了!呵呵。
当初在北京会议后,官方的首席技术专家来旅馆送我的时候,我们在一起从下午1点,一直谈到下午5点多,都是在谈论输入法。他说了很多,但是时间比较久远了,很多都不记得了,上面也是当初谈话的记忆残留了。
估计就是官方,也只有他一个人能回答你的问题了。
 楼主| 发表于 2014-7-23 08:22:40 | 显示全部楼层
kingdick 发表于 2014-7-22 19:18
当前条件下,貌似通过寻找新词编制词库比制作语言模型效果好。

如果只是依靠词库的话是不行的,例如现在处理“今天天气很好”,那么分词结果为“今天”,“天气”,“很好”,相当于一元语言模型,无法判断“今天”和“天气”之间的关系,也无法判断“天气”和“很好”之间的关系。那么可能会导致一种结果,假设上面三个词的词频分别为10,20和30,现在词库中又记录了一个词是“近天”,词频为40,那么判读结果为“近天天气很好”,导致错误。单纯依赖于词库的词频是不行的(特殊场合下词频变化比较大,只能确定结果的范围),所以才需要语言模型来对结果进行指导。
 楼主| 发表于 2014-7-23 08:33:23 | 显示全部楼层
野风 发表于 2014-7-22 19:53
这个就要看看官方怎么回复你了!呵呵。
当初在北京会议后,官方的首席技术专家来旅馆送我的时候,我们 ...

只能等官方的回复了么,官方对于语言模型建立部分的资料有开源吗?
发表于 2014-7-23 09:38:53 | 显示全部楼层
winking324 发表于 2014-7-23 08:22
如果只是依靠词库的话是不行的,例如现在处理“今天天气很好”,那么分词结果为“今天”,“天气”,“很 ...

佩服!兄弟,你真是高手!
发表于 2014-7-23 09:43:30 | 显示全部楼层
winking324 发表于 2014-7-23 08:33
只能等官方的回复了么,官方对于语言模型建立部分的资料有开源吗?


我想过一段时间应该会开源的(根据开源计划)。
因为对于语言模型的建立,我当初也只是跟官方的首席技术专家进行过交流,毕竟对于如何建立语言模型没有参与过且在编程方面我也是外行。
所以只有官方才能说得更明白。
你可以给我前面说的zxd4g(这个语言模型的建立者)发一封电子邮件跟他交流一下,但据我所知他是很忙的,有没有空回复你的邮件我不敢保证。
 楼主| 发表于 2014-7-23 10:11:50 | 显示全部楼层
野风 发表于 2014-7-23 09:38
佩服!兄弟,你真是高手!

这个是研究过程中遇到的问题,所以发现需要语言模型来指导词库进行智能组句的处理,所以认识也比较深刻。感谢版主热心的帮助,已联系四哥,坐等回复
等研究明白再来给大家提供答案~
发表于 2014-7-23 10:26:53 | 显示全部楼层
winking324 发表于 2014-7-23 10:11
这个是研究过程中遇到的问题,所以发现需要语言模型来指导词库进行智能组句的处理,所以认识也比较深刻。 ...

感谢!同时热烈欢迎兄弟你的到来!
 楼主| 发表于 2014-7-23 20:22:44 | 显示全部楼层
野风 发表于 2014-7-23 10:26
感谢!同时热烈欢迎兄弟你的到来!

临时想到一个解决方案,在现有语言模型文件的基础上,导出我这边新增的部分,格式为:
首词,词频,后继词,词频,两次组合词频

然后对现有的文件进行追加,至少可以保证现有数据的可用性,但是不能保证数据的平滑性。

另外,将现有的语言模型文件进行导出,发现有些问题,例如出现这种情况:
首词  后继词
除旧        布        迎新
        208        192
一般情况下,格式应该如下:
首词        后继词
除暴安良        △        的
              384        96
Δ是用来句尾计算,防止0概率发生的,如果没有Δ这种标记的,例如“除旧”,会导致该词出现在句尾时无穷小概率事件,导致智能组句失败。不知道版主对这种情况清楚不,这种数据我这边是不是可以全部过滤删除掉呢?
发表于 2014-7-23 21:55:01 | 显示全部楼层
对于语言模型的工作机制,我不是很清楚。
抱歉!
发表于 2014-7-24 19:28:22 | 显示全部楼层

0.618是黄金分割点,上个世纪的文化大革命中,大数学家华罗庚大讲 “ 优选法 ” ,无人不知,其实讲的就是这个呵呵!
 楼主| 发表于 2014-7-26 08:53:06 | 显示全部楼层
wangyanhan 发表于 2014-7-24 19:28
0.618是黄金分割点,上个世纪的文化大革命中,大数学家华罗庚大讲 “ 优选法 ” ,无人不知,其实讲的就是 ...

原来如此,0.618的二分法,涨姿势了,谢谢~~~~
 楼主| 发表于 2014-7-26 15:34:02 | 显示全部楼层
已按照14楼方式实现,虽然词频比较难于调整,但是结果已经按照我的方式出现,舒心的笑了。。。
发表于 2014-7-26 16:02:19 | 显示全部楼层
winking324 发表于 2014-7-26 15:34
已按照14楼方式实现,虽然词频比较难于调整,但是结果已经按照我的方式出现,舒心的笑了。。。

祝贺!
发表于 2014-7-26 17:36:45 | 显示全部楼层
winking324 发表于 2014-7-26 08:53
原来如此,0.618的二分法,涨姿势了,谢谢~~~~
不必谢。黄金分割点为0.618,是测试结果的优选比例,一般的应用数学问题呵呵!

正如陈景润所说:“华老师一生,在应用数学方面投入精力太多,这是个遗憾”(不是原话)。不过这也不能怪华罗庚啊!当时是毛泽东时代,提倡为工农兵服务。
 楼主| 发表于 2014-7-26 18:17:09 | 显示全部楼层
wangyanhan 发表于 2014-7-26 17:36
不必谢。黄金分割点为0.618,是测试结果的优选比例,一般的应用数学问题呵呵!

正如陈景润所说:“华老师 ...

嗯,王老经验好丰富啊~~~80后表示对这些事都不太清楚啊。。。

只知道学习数学,却不知道如何应用到实际生活中,这个要做到还是很难的,需要对数学有一个透彻的理解。所以很佩服这些数学家以及在这上面做出努力的人们!
 楼主| 发表于 2014-8-1 17:21:59 | 显示全部楼层
关于现在的语言模型,我觉得有一个非常严重的问题:词首与词尾的判断问题。
问题具体情况是:当前的语言模型,是根据大规模的人民日报语料库生成,人民日报中出现的句子,必然是语法严谨的完全句。所以根据此语料库生成的语言模型,则具有以下特点:
1. 句子中间词作为句首和句尾的概率非常小,则其在语言模型中对应的词频也较低。
2. 句子中首词和末尾词作为句首和句尾的概率较高,对应语言模型中的句首,句尾词频较高。
根据这两个特点,会造成以下情况出现:
1. 部分组句进行识别时,识别率非常低,例如报纸中“号召”的“号”,会比“好”作为句首更多,则其作为句首的概率远超过“好”作为句首的情况,但是平时使用中,往往是“好喜欢***”这样的组句,识别结果反而是“号喜欢***”这种情况。
2. 作为句尾的情况同第1点相同,不再赘述。
现在的处理方式是,根据14楼的方法,将词首,词尾的词全部筛选出来,然后人工进行调整。可见语言模型生成时,句子不能完全按照一个句子处理,应该按照某种原则进行断句,然后再进行首词,尾词的计算,或者对首词,尾词频率计算时,进行一定的调整。另外,选取人民日报或者其他新闻资料作为语言模型生成的语料库,一定程度上不是很合理,其语料太过标准,跟实际需要差别较大。
实在不行只能看看其他有没有开源的资料可以使用了,这个越改越费力啊。。。
发表于 2014-8-1 20:37:51 | 显示全部楼层
目前语言模型确实是比较规范的语句才能正确输出,口语化的则比较差。这也是华宇拼音网友一直想更新语言模型的原因之一吧。
发表于 2015-7-21 15:04:50 | 显示全部楼层
我通过网络爬虫,爬取了豆瓣60G左右的语料生成语言模型的时候发现,一些连词老是打不准,都/也/就这些词经常会错,,
发表于 2015-7-21 18:55:18 | 显示全部楼层
下面是我查找到的Sunpinyin的语言模型生成步骤:
训练和构建语言模型的步骤:
首先使用 mmseg(最大正向分词),根据词表,对语料库进行分词,并将词的 ID 序列输出到临时文件中。
然后使用 ids2ngram,对所有 3 元组出现的次数进行统计,并输出到临时文件中。例如下面的句子:ABCEBCA。得到的3元列包括:(<S> A B), (A B C), (B C E) ... ( B C A), (C A '。'), (A '。' </S>)。<S>和</S>分别表示句首和句尾。
使用 slmbuild 来构造一个 back-off 的 trigram 语言模型,但是未经裁剪。
使用 slmprune 对刚输出的 trigram 语言模型进行剪裁,使用的算法是基于熵的剪裁算法。
使用 slmthread 对剪裁后的语言模型进行线索化,加快 back-off(回退)查找的速度。将最终的结果输出到 lm_sc.t3g。
$ make slm_trigram3:这个和上面的类似,不同的是使用 slmseg 进行分词,它借助刚刚生成的基于最大正向分词得到的语言模型,对语料库进行重新分词,这样可以进一步提高语言模型的精确程度。
$ make lexicon3: 根据生成语言模型中的 unigram 数据,对词表进行处理,得到一个支持不完全拼音的词库文件。

问题
1) 亲爱的程序员大大,华宇有相关类似的语料库说明没有。
2) //索引项内容
typedef struct tagGRAM_INDEX                        //Bigram, Trigram索引
{
        int                word_pos;                                        //在词表中的位置
        int                word_freq;                                        //该词词频
        int                item_index;                                        //项所处于的位置
        int                start_count;                                //该项起头的数目
}GRAM_INDEX; 这个结构里面start_count是什么意思,有相关的说明没
发表于 2016-1-12 12:10:07 | 显示全部楼层
不知楼主现在研究得如何了!有无可以分享的东西?呵呵!
发表于 2019-10-18 22:53:00 | 显示全部楼层
看到这个帖子,挖坟纪念下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|华宇拼音输入法网站  

GMT+8, 2019-12-11 23:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表