wordmaker 词语生成工具开源项目

我要开发同款
匿名用户2014年02月22日
40阅读
开发技术C/C++
所属分类应用工具、科研计算工具
授权协议GPL

作品详情

wordmaker词语生成工具

通过词语组成的规律,自动从大文本当中学习得到文本当中的词语,而不再需要其它额外的信息。

很多分词库等都需要字典库,特别在一些专业的领域,需要得到很多的专业相关词语。而人工标注字典需要花很大的时间,所以希望有一个工具能够自动从文本中训练得到词语。分析某类人的用词特点,也可以有所应用。

代码实现

最初尝试实现了一个简单版本,但基于单线程,运行速度慢,并且还消耗巨大的内存。最近尝试接触c++11,并使用了类似map/reduce思想,所以决定拿这个项目练练手,也希望能有人多交流。思想如下:

基于节约内存的Trie树结构(DoubleArrayTrie&MARISA)用多个线程独立计算各个文本块的词的信息,再按词的顺序分段合并,再计算各个段的字可能组成词的概率,左右熵,得到词语输出。因为都分成独立的块处理,所以使用多线程非常方便。这种思想应该可以应用在大部分的文本处理工作中,若有更好的办法欢迎交流~src/wordmaker.cpp将在内存当中完成所有计算,并只依赖于cedar.h文件。能够很快处理20M左右的文本。src/hugemaker.cpp为了节约内存,在计算、合并过程中将保存部分中间文件。可以处理更大的文本(50M+)。marisa:Trie支持mmap将trie文件mmap到内存当中,经过修改完全可以处理更巨大的文本(当时用的时间也会更久)。默认启用4个线程,可以修改代码的宏,也可以自己加shell命令控制。为了代码的简单,只支持gbk编码。(没太多检查,其它编码格式的输入将可能产生段错误,欢迎帮优化)在linux与cygwin下编码成功,visualstudio下应该也没问题吧。因工作关系用C比C++时间多得多,希望使用代码的人看到代码有任何不符合现在c++观点的作法及时指出,以做交流!编译与使用

mkdirbuild

cdbuild

cmake28..

make

./bin/wordmakerinput.txtoutput.txt或者

./bin/hugemakerinput.txtoutput.txt

linux下可以使用:

iconv-f"gbk"-t"utf-8//IGNORE"<infile>outfile

进行编码转换。windows下当然可以使用notepad++了,转换成ANSI。

测试语料

sogou的新闻语料,把各个文本合成在一起总共50M:https://pan.baidu.com/s/1mgoIPxY里面还有莫言的文集当做输入语料,方法大家测试代码。

这里是我运行的表现结果

TODO

算法优化:结果里偶尔出现“鼓舞了”、“默认了”、“鲜红的”等错误词,虽然算法里已经较好的处理了这种情况,但感觉应该有更好的办法,比如:给类似“的”、“了”、“在”等出现频率特别高的字更低的组词权重,而提高其它一些情况的词的权重,可能输出结果会更好。

找到更多的语料,结合本工具,并实现一些办法,从这些语料当中分析得到更多的有趣信息。比如说网络流行词,某行业的专用词等。

 

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论