我正在尝试基于英语维基百科转储中发现的前100K个单词构建一个n-gram语言模型。我已经使用Java编写的修改后的XML解析器提取了纯文本,但需要将其转换为词汇表文件。
为此,我找到了一个据说可以完成此任务的perl脚本,但缺乏关于如何执行的说明。不用说,我是完全新手,第一次遇到需要使用Perl的情况。
当我运行此脚本时,在两台分别配备4GB RAM和运行Ubuntu 10.04和10.10的双核机器上使用7.2GB文本文件时,我遇到了内存不足错误。
当我联系作者时,他说这个脚本在配备4GB RAM的MacBook Pro上运行良好,并且在使用perl 5.12对6.6GB文本文件执行时,总内存使用量约为78 MB。作者还表示,该脚本逐行读取输入文件并在内存中创建哈希表。
脚本如下:
#! /usr/bin/perl
use FindBin;
use lib "$FindBin::Bin";
use strict;
require 'english-utils.pl';
## Create a list of words and their frequencies from an input corpus document
## (format: plain text, words separated by spaces, no sentence separators)
## TODO should words with hyphens be expanded? (e.g. three-dimensional)
my %dict;
my $min_len = 3;
my $min_freq = 1;
while (<>) {
chomp($_);
my @words = split(" ", $_);
foreach my $word (@words) {
# Check validity against regexp and acceptable use of apostrophe
if ((length($word) >= $min_len) && ($word =~ /^[A-Z][A-Z\'-]+$/)
&& (index($word,"'") < 0 || allow_apostrophe($word))) {
$dict{$word}++;
}
}
}
# Output words which occur with the $min_freq or more often
foreach my $dictword (keys %dict) {
if ( $dict{$dictword} >= $min_freq ) {
print $dictword . "\t" . $dict{$dictword} . "\n";
}
}
我正在通过命令行执行此脚本:mkvocab.pl corpus.txt
附加的额外脚本只是一个正则表达式脚本,用于测试撇号的位置以及它们是否符合英语语法规则。
我认为内存泄漏是由于不同的版本导致的,因为5.10已安装在我的计算机上。所以我升级到了5.14,但错误仍然存在。根据free -m
,我系统上有大约1.5GB的空闲内存。
由于我完全不熟悉语言的语法和结构,您能指出问题区域以及问题存在的原因和如何修复它吗?