我是一个完整的 Perl 新手,但我确信学习 Perl 比弄清楚如何在 awk 中解析 XML 更容易。我想从这个数据集中解析 .sgm 文件:
http://kdd.ics.uci.edu/databases/reuters21578/reuters21578.html
这是十年前来自新闻专线的 20,000 篇路透社文章的集合,是某些类型的文本处理的标准测试集。为了简化我的 perl 测试,我从第一个文件中提取了前几百行并制作了 test.sgm,直到我的脚本在该文件上正常工作。开始是这样的:
<!DOCTYPE lewis SYSTEM "lewis.dtd">
<REUTERS TOPICS="YES" LEWISSPLIT="TRAIN" CGISPLIT="TRAINING-SET" OLDID="5544" NEWID="1">
<DATE>26-FEB-1987 15:01:01.79</DATE>
<TOPICS><D>cocoa</D></TOPICS>
<PLACES><D>el-salvador</D><D>usa</D><D>uruguay</D></PLACES>
<PEOPLE></PEOPLE>
<ORGS></ORGS>
<EXCHANGES></EXCHANGES>
<COMPANIES></COMPANIES>
<UNKNOWN>
C T
f0704reute
u f BC-BAHIA-COCOA-REVIEW 02-26 0105</UNKNOWN>
<TEXT>
<TITLE>BAHIA COCOA REVIEW</TITLE>
<DATELINE> SALVADOR, Feb 26 - </DATELINE><BODY>Showers continued throughout the week in
the Bahia cocoa zone, alleviating the drought since early
January and improving prospects for the coming temporao,...
我以http://www.xml.com/pub/a/2001/05/16/perlxml.html中的 perl 脚本为例,最后得到了这个,extract.pl:
use XML::DOM;
my $file = $ARGV[0];
my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile($file);
#print $doc->getElementsByTagName('DATE');
print "\n";
我得到这个输出:
> perl extract.pl test.sgm
reference to invalid character number at line 11, column 0, byte 343 at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/XML/Parser.pm line 187
>
谷歌没有帮助(最热门的页面似乎是遇到与我相同的错误的页面),我的 Perl 黑客朋友仍然在维加斯的 Blackhat 中徘徊。有什么想法我做错了什么,或者我如何清理文件?我假设坏事发生在那个“未知”标签内,我什至不需要它。我真的只想从每篇文章中提取文本。如果您需要更多信息,请告诉我。