wordmaker

词语生成工具
授权协议 GPL
开发语言 C/C++
所属分类 应用工具、 科研计算工具
软件类型 开源软件
地区 国产
投 递 者 公冶渝
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

wordmaker 词语生成工具

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

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

代码实现

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

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

编译与使用

mkdir build

cd build

cmake28 ..

make

./bin/wordmaker input.txt output.txt 或者

./bin/hugemaker input.txt output.txt

linux下可以使用:

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

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

测试语料

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

这里是我运行的表现结果

TODO

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

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

 

 相关资料
  • Bootstrap 在 CSS 方面采用 Grunt,用 JavaScript 构建系统,用 Jekyll 做记录。Gruntfile 在使用框架方面有许多便利的特点,包括编译代码、运行测试等等。 工具安装 为了使用Gruntfile以及本地运行我们的文档,你需要拷贝一份Bootstrap的源文件,还有Node.js以及Grunt。参照下面的步骤,你应该已经准备好开始动手了: 下载并安装 Node

  • 问题内容: 所以我基本上是在一个项目中,计算机从单词列表中提取一个单词,然后为用户弄乱它。只有一个问题:我不想一直在列表中写很多单词,所以我想知道是否有一种方法可以导入很多随机单词,所以即使我也不知道它是什么,并且那我也可以玩游戏吗?这是整个程序的编码,我只输入了6个字: 问题答案: 如果您重复执行此操作,我将在本地下载它并从本地文件中提取。* nix用户可以使用。 例: 从远程字典中提取 如果您

  • 谢谢你。

  • 问题内容: 是否有一个工具将Java文件作为参数,该文件将REST服务描述为参数并从中生成wadl文件。 问题答案: 我遇到了同样的问题:使用RESTeasy并想找到一种自动生成WADL的方法。 做了一些研究,得出下面的解决方案。 注意和元素。您必须更改它们以反映项目的配置。您可能还想更改插件的版本(我使用的是1.17)。 2.创建一个/ doc文件夹并添加一些文件。 创建文件夹并在下面创建两个文

  • 我对ElasticSearch相当陌生。我试图用西班牙语分析输入,但颜色“rojo”(西班牙语中的红色)似乎有问题。 根据词干演示,字符串Polera颜色rojo(红色衬衫)应该词干为Poler颜色roj,Polera roja(红色衬衫)应该是poler roj,使我能够搜索为rojo或roja,并获得两个结果。 我在Kibana的控制台中用以下代码初始化了索引: 并使用以下代码进行了查询: 我

  • 问题内容: 在这里,我想问些奇怪的事情。 我想问问有什么方法/逻辑可以将整数值转换成包含数字英文单词的字符串值? 例如,用户输入22并获得输出22或2。 谢谢 问题答案: 看看这段代码,它可能就是您想要的。例如,在main方法内部,如果有: 输出: 编辑 我复制了下面的代码,清理了一下格式(主方法在底部):