截止日期后

基于NGramJ的N-Gram语言猜测

发布于多语言AtD,NLP研究2010年2月8日rsmudge

NGramJ公司是用于语言识别的Java库。它使用语言配置文件(字符序列计数)来猜测任意文本是什么语言。在本文中,我将简要介绍如何从命令行和Java API使用它。我还将向您展示如何生成新的语言配置文件。我这样做是为了不必再去想怎么做了。

正在运行

通过在命令行上尝试,您可以了解NGramJ的工作情况。例如:

$猫>a.txt这是一个测试。$java-jar cngram.jar-lang2 a.txt速度:en:0.667 ru:0.000 pt:0.000。。de:0.000|0.0E0|0.0E0 dt=2812$猫>b.txt维基百科作者ein Projekt zum Aufbau einer Enzyklopädie aus freien Inhalten in allen Sprachen der Welt。$java-jar cngram.jar-lang2 b.txt速度:de:0.857 ru:0.000 pt:0.000。。英语:0.000|0.0E0|0.0E0 dt=2077

使用

我喜欢这个程序的API,它很简单。它也是线程安全的。您可以实例化库的静态引用,然后从任何线程调用它。这里有一些代码采用自这个Flaptor实用程序库。

导入de.spieleck.app.cngram。NGram配置文件;受保护的NGramProfiles配置文件=新的NGramProfiles();public String getLanguage(字符串文本){NGramProfiles。Ranker-Ranker=档案.getRanker();ranker.account(文本);NGramProfiles。排名结果结果=ranker.getRankResult();return result.getName(0);}

现在您已经知道如何使用库进行语言猜测,我将向您展示如何添加新语言。

添加新语言

NGramJ附带了几个语言配置文件,但您可能需要自己生成一个。维基百科是语言数据的一个重要来源。我写过从维基百科中提取纯文本之前在这里。今天,我需要为印尼人生成一个简介。第一步是创建原始语言配置文件。您可以使用cngram.jar文件执行此操作:

$java-jar cngram.jar-创建id_big id_corpus.txt创建了新的配置文件“idbig.ngp”。

这将创建一个id.ngp文件。我还注意到这个文件很大。与其他语言配置文件的30K相比,有数百KB。下一步是清理语言配置文件。为此,我创建了一个简短的睡眠脚本读取id.ngp文件并剪切任何出现少于20K次的3克和4克序列。我选择20K是因为它给我留下了一个大约30K的文件。如果数据较少,则需要向下调整此数字。其他语言配置文件使用1000作为分界点。这让我相信他们接受了6MB文本数据的训练,而我的印尼文本是114MB。

下面是脚本:

%克=ohash();setMissPolicy(%grams,{return@();});$句柄=openf(@ARGV[0]);$banner=readln($handle);readln($handle);#使用ngramcount值而$text(readln($handle)){($gram,$count)=拆分('',$text);if(strlen($gram)<=2|$count>20000){推送(%grams[strlen($gram)],@($grams,$count));}}关闭($handle);子排序元组{返回$2[1]<=>$1[1];}println($banner);printAll(map({return join(“”,$1);},sort(&sortTuple,%grams[1]));printAll(map({return join(“”,$1);},sort(&sortTuple,%grams[2]));printAll(map({return join(“”,$1);},sort(&sortTuple,%grams[3]));printAll(map({return join(“”,$1);},sort(&sortTuple,%grams[4]));

要运行脚本,请执行以下操作:

$java-jar lib/sleep.jar排序.sl id_big.ngp>id.ngp

最后一步是将id.ngp复制到src/de/spieleck/app/cngram/中,并编辑src/de/spieleck/app/cngram/profiles.lst以包含id资源。类型蚂蚁在NGramJ源代码的顶级目录中重建cngram.jar,然后准备测试:

$猫>c.txtSelamat datang di Wikipedia bahasa Indonesia,ensiklopedia bebas berbahasa印尼$java-jar cngram.jar-lang2 c.txt速度:id:0.857 ru:0.000 pt:0.000。。de:0.000|0.0E0|0.0E0 dt=1872

正如您所见,NGramJ是一个易于使用的库。如果你需要做语言猜测,我建议你这样做。

从维基百科生成纯文本语料库

发布于多语言AtD,NLP研究rsmudge于2009年12月4日

AtD*以数据为基础,维基百科是各种数据的最佳去处之一。这篇文章描述了如何从完整的维基百科转储中生成纯文本语料库。此过程是对从维基百科中提取文本通过埃文·琼斯

Evan的帖子展示了如何从英文维基百科中提取顶级文章并制作纯文本文件。在这里,我将展示如何通过两个有用的约束从维基百科转储中提取所有文章。每一步都应该:

  • 在我到领取社会保险金的年龄之前完成
  • 容忍错误并在没有我干预的情况下完成

今天,我们将学习法语维基百科。我正在研究多语言的AtD,法语似乎是一种有趣的语言。我们的系统人员,斯特凡会说法语。这是一个很好的理由。

步骤1:下载维基百科提取器工具包

Evan提供了一组从维基百科中提取明文的代码。为了实现上述两个目标,我做了一些修改*。所以你想做的第一件事是下载此工具包并将其提取到某个位置:

wget公司http://www.polishmywriting.com/download/wikipedia2text_rsm_mods.tgztar zxvf维基百科2text_rsm_mods.tgzcd维基百科文本

(*请参阅CHANGES文件以了解所做的修改)

步骤2:下载并提取维基百科数据转储

你可以从http://download.wikimedia.org/。任何语言的存档都是*pages-articles.xml.bz2。以下是我所做的:

wget公司http://download.wikimedia.org/frwiki/20091129/frwiki-20091129-pages-articles.xml.bz2bunzip2 frwiki-20091129-pages-articles.xml.bz2

步骤3:从维基百科数据中提取文章数据

现在您有了一个包含所有维基百科文章的大XML文件。祝贺 你。下一步是提取文章并剥离所有其他内容。

为输出创建一个目录,并对运行xmldump2files.py。您在上一步中获得的XML文件:

mkdir输出./xmldump2files.py frwiki-20091129-pages-articles.xml输出

根据硬件的不同,此步骤需要几个小时。

步骤4:将文章Wiki标记解析为XML

下一步是获取提取的文章,并将Wikimedia标记解析为XML格式,以便稍后从中恢复纯文本。有一个shell脚本可以为out目录中的所有文件生成XML文件。如果你有一台多核机器,我不建议运行它。我更喜欢为每个核心使用shell脚本,在文件集的一部分执行Wikimedia to XML命令(也称穷人的并发编程)。

要生成这些shell脚本,请执行以下操作:

查找-键入f|grep'\.txt$'>fr.files

将此fr.文件拆分为多个.sh文件。

java-jar sleep.jar到8.sl fr.files

您可能会发现创建launch.sh文件来启动into8.sl创建的shell脚本很有帮助。

猫>洗衣./files0.sh文件&./文件1.sh&./files2.sh文件&..../files15.sh文件&^天

接下来,启动这些shell脚本。

./启动.sh

不幸的是,这段旅程充满了危险。这些脚本对每个文件运行的命令有以下注释:将wiki格式的Wikipedia文章转换为XML格式。有时它可能会分段或进入“无限”循环。这句话是真的。PHP进程将冻结或崩溃。我第一次经历这个过程时,我必须手动监视顶部并消除错误的进程。这使得该过程花费的时间超过了应有的时间,而且非常耗时。为了有所帮助,我编写了一个脚本,可以终止任何运行超过两分钟的php进程。要启动它:

java-jar sleep.jar watchthem.sl

只要让这个程序运行,它就会完成它的工作。根据您的硬件,预计此步骤需要12个或更多小时。

步骤5:从文章中提取纯文本

接下来,我们要从XML文件中提取文章明文。为此,请执行以下操作:

./wikiextract.py out法语_plaintext.txt

此命令将创建一个名为french_plaintext.txt的文件,其中包含法语维基百科的整个纯文本内容。根据您的硬件,此命令可能需要几个小时。

第6步(可选):将纯文本拆分为多个文件以便于处理

如果您计划在AtD中使用此数据,您可能希望将其拆分为多个文件,以便AtD可以对其进行分段解析。我包含了一个脚本来执行此操作:

mkdir语料库java-jar sleep.jar makecorpus.sl法语plaintext.txt语料库

就这样。你现在有一个从维基百科中提取的语言语料库。

多语言前沿研究进展

发布于多语言AtDrsmudge于2009年12月3日

我在多语言AtD方面取得了进展。我已经将LanguageTool集成到了AtD中。语言工具是一个支持的语言检查工具18种语言。创建语法规则是一个需要大量人力的过程,我更喜欢使用一个有成功社区过程的既定项目。

我还在维基百科上创建语料库数据。我有四个步骤。每种语言最长的一步需要12个多小时才能运行,并占用我的整个开发服务器。所以我每天晚上只能生成一种语言的数据。

通过这些语料库数据,我能够为该语言提供上下文拼写检查,并对LanguageTool结果进行粗略的统计过滤(假设LT支持该语言)。

这里有一些统计数据要实现这一点:

WordPress.com上66%的博客是英文的。这将AtD的实用性限制为我们用户群的66%。通过使用AtD支持接下来的六种语言,我们可以为近90%的WordPress.com社区提供校对工具。那太令人兴奋了。

目前,这项工作正处于概念验证阶段。我希望很快有一个法语AtD(拼写检查+LanguageTool语法检查)。我会让一些人尝试一下,告诉我他们的经历。如果你想自愿尝试一下,联系我

关闭注释多语种前沿研究进展

文本分割跟进

发布于多语言AtD由rsmudge于2009年11月18日

我让AtD多语言的第一个目标是启动拼写检查器。昨天,我找到了一个很有希望的解决方案,可以将文本拆分为句子和单词。这是一个重要的步骤,因为AtD使用统计方法进行拼写检查。

这里是睡眠我用来测试Java句子和分词技术的代码:

$句柄=openf(@ARGV[1]);$text=联接(“,readAll($handle)”);关闭($handle);导入java.text.*;$locale=[new locale:@ARGV[0]];$bi=[BreakIterator getSentenceInstance:$locale];断言$bi!为$null:&quot;语言失败:$locale&quot;;[$bi setText:$text];$索引=0;while([$bi next]!=[BreakIterator完成]){$sentence=子项($text,$index,[$bi-current]);println($句子);#打印出单个单词。$wi=[BreakIterator getWordInstance:$locale];[$wi-setText:$sentence];$ind=0;while([$wi next]!=[BreakIterator完成]){println(&quot;\t;.substr($sentence,$ind,[$wi-current]);$ind=[当前$wi];}$指数=[$bi current];}

您可以使用以下命令运行此操作:java-jar sleep.jar segment.sl[语言环境名称][文本文件]我试过用英语、日语、希伯来语和瑞典语。我发现Java文本分割在缩写方面并不聪明,这是一个遗憾。我有朋友看了一些琐碎的希伯来语和瑞典语输出,他们说看起来不错。

这是将AtD拼写和误用单词检查引入另一种语言的关键。

关闭注释文本分割跟进

Java句子分割研究

发布于多语言AtD由rsmudge于2009年11月17日

是时候让AtD使用更多语言了。最好首先从句子分割开始。句子分割是将一堆原始文本分割成句子的问题。

像其他研究人员一样,我从搜索别人做了什么开始我的任务。以下是我的发现:

  1. 有一个标准叫做SRX,用于细分规则交换。SRX文件是XML,有一个开源的Segment Java库,可以使用这些规则文件分割句子。还有一个名为Ratel的编辑器,可以让人们编辑这些SRX文件。语言工具支持SRX文件。
  2. 另一个选项是使用OpenNLP(开放NLP)项目的工具。他们有一个SentenceDetectorME类,可以实现这个功能。问题是模型仅适用于英语、德语、西班牙语和泰语。
  3. 我还了解到Java1.6在Java.text.*包中有用于句子分割的内置工具。这些是IBM捐赠的。下面是此软件包支持的地区的快速转储:

    java-jar sleep.jar-e'打印ln(join(“,”,[java.text.BreakIterator getAvailableLocales]);'

    ja_JP、es_PE、en、ja_JP_JP,es_PA、sr_BA、mk、es_GT、ar_AE、no_no、sq_AL、bg、ar_IQ、ar_YE、hu、pt_pt、el_CY、ar_QA、mk_mk、sv、de_CH、en_US、fi_fi、is、cs、en_MT、sl_SI、sk_sk、it、tr_tr、zh、th、ar_SA、no、en_GB、sr_cs、lt、ro、en_NZ、no_no_NY、lt_lt、es _NI、nl、ga_IE、fr_BE、es_es、ar_LB、ko、fr_CA、et_EE、ar_KW、sr_RS、es_US、es_MX、ar_SD、,in_ID,ru,lv,es_UY,lv_lv,iw,pt_BR,ar_SY,hr,et,es_DO,fr_CH,hi_in,es_VE,ar_BH,en_PH,ar_TN,fi,de_AT,es,nl_nl,es_EC,zh_TW,ar_JO,be,is_is,es_CO,es_CR,es_CL,ar_EG,en_ZA,th_th,el_GR,it_it,ca,hu_hu,fr,en_IE,uk_UA,pl_pl,fr_LU,nl_be、en_in、ca_es、ar_MA、es_BO、en_AU、sr、zh_SG、pt、uk、es_SV、ru_ru、ko_KR、vi、ar_DZ、,vi_VN、sr_ME、sq、ar_LY、ar、zh_CN、be_BY、zh_HK、ja、iw_IL、bg_bg、in、mt_mt、es_PY、sl、fr_fr、cs_CZ、it_CH、ro_ro、es_PR、en_CA、de_de、ga、de_LU、de、es_ar、sk、ms_MY、hr_hr、en_SG、da、mt、pl、ar_OM、tr、th_th_th、el、ms、sv_SE、da_DK、es_HN

对来自语料库邮件列表的工具的一个很好的调查是http://mailman.uib.no/public/corporata/2007年10月/05429.htm

我想我用Java内置的句子分割工具找到了我的赢家。我还没有评估输出的质量(明天的任务),但它支持这么多现成的语言环境这一事实对我来说非常有吸引力。AtD-English在我的简单的基于规则的句子分割上取得了很大的进步。如果这个API接近(或者我怀疑比)我现有的API更好,那么这会做得很好。

关闭评论Java句子切分调查研究