【发布时间】:2010-12-06 23:04:53
【问题描述】:
输入文本文件包含以下内容:
....
ponies B-pro
were I-pro
used I-pro
A O
report O
of O
indirect B-cd
were O
. O
...
输出 XML 文件
<sen>
<base id="pro">
<w id="1">ponies</w>
<w id="2">were</w>
<w id="3">were</w>
</base>A report of
<base id="cd">indirect</base> were
</sen>
我想通过读取文本文件来制作一个XML文件,B-表示我的标签的开头,I-表示标签内的包含词,而“O”表示在基本标签之外,这意味着它只存在于标记。
我尝试以下代码:
#!/usr/local/bin/perl -w
open(my $f, "input.txt") or die "Can't";
open(my $o, ">output.xml") or die "Can't";
my $c;
sub read_line {
my $fh = shift;
if ($fh and my $line = <$fh>) {
chomp($line);
my @words = split(/\t/, $line);
my $word = $words[0];
my $group = $words[1];
if($word eq "."){
return;
}
else{
if($group ne 'O'){
my @b = split(/\-/, $group);
if($b[0] eq 'B'){
my $e = "<e id=\"";
$e .= " . $b[1] . "\">";
$e .= $word . "</e>";
return $e;
}
if($b[0] eq 'I'){
my $w = "<w id=\"";
$w .= $c . "\">";
$w .= $word . "</w>";
$c++;
return $w;
}
}
else{
$c = 2;
return $word;
}
}
}
return;
}
sub get_text(){
my $txt = "";
my $r = read_line($f);
while($r){
if($r =~ m/[[:punct:]]/){
chop($txt);
$txt .= " " . $r . " ";
}
else{
$txt .= $r . " ";
}
$r = read_line($f);
}
chop($txt);
return "<sen>" . $txt . ".</sen>";
}
而不是我得到输出:
<sen>
<base id="pro"> ponies </base>
<w id="2">were</w>
<w id="3">were</w>
A report of
<base id="cd">indirect</base> were
</sen>
我真的需要帮助。
谢谢
【问题讨论】:
-
不要试图通过将字符串组合在一起来生成 XML。使用适当的 XML 模块。
-
你的问题有很多含糊之处——
indirect真的应该是直接在<base id="cd">中的文本,而不是<w>?<w>ID 是否只是全局递增? (XML 禁止重复使用 ID)。如果我们在blah B-bar之后立即看到blah I-foo会发生什么(基本ID 不匹配)?我有一些工作代码,但如果没有这些问题的答案,我真的不能说它是正确。 -
给我看看,也许我能得到一些想法。谢谢
-
单词 ID 只增加 'B-' 之后的下一个单词有 'I-' 并且如果第二列中的单词有 'O' 则重置为 2。每当我立即找到“B-”时,我都应该重置计数器。
标签: perl