Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl:剥离html标记,操纵文本,然后将html标记返回到其原始位置_Html_Perl_Nlp_Strip - Fatal编程技术网

perl:剥离html标记,操纵文本,然后将html标记返回到其原始位置

perl:剥离html标记,操纵文本,然后将html标记返回到其原始位置,html,perl,nlp,strip,Html,Perl,Nlp,Strip,我正在使用Html::Strip模块从文件中删除所有Html标记。然后,我想处理结果文本(去掉html),并最终将html标记返回到其原始位置 我正在进行的文本操作需要使用split(/,$text)将文本拆分为数组。然后,我对生成的数组进行一些自然语言处理(包括向一些关键字添加新的html标记)。完成文本处理后,我希望将原始标记返回到它们的位置,同时保持在此期间完成的文本操作完好无损 如果我可以简单地删除原始标记中的所有空白(因为浏览器会忽略标记中的空白),我会感到满意。这样,我的NLP处理就

我正在使用Html::Strip模块从文件中删除所有Html标记。然后,我想处理结果文本(去掉html),并最终将html标记返回到其原始位置

我正在进行的文本操作需要使用split(/,$text)将文本拆分为数组。然后,我对生成的数组进行一些自然语言处理(包括向一些关键字添加新的html标记)。完成文本处理后,我希望将原始标记返回到它们的位置,同时保持在此期间完成的文本操作完好无损

如果我可以简单地删除原始标记中的所有空白(因为浏览器会忽略标记中的空白),我会感到满意。这样,我的NLP处理就可以忽略标记(包含“”)的单词

我曾尝试深入研究Html::Strip(试图根据我的需要对其进行修改),但我无法理解以下代码的作用:

  my $stripped = $self->strip_html( $text );
  if( $self->decode_entities && $_html_entities_p ) {
    $stripped = HTML::Entities::decode($stripped);
  }
似乎strip_html是一个sub,但我在任何地方都找不到该sub

无论如何,谢谢你的建议


。。。第二天

在与@amon进行了一番反复讨论之后,我找到了一个解决方案,我相信这个解决方案对于我的目的来说已经足够了。阿蒙把我推向了正确的方向,尽管他建议我无论如何不要做我做过的事情,哈哈

这是一种残忍的方法,但却能令人满意地完成工作。我会把它留在这里,以防其他人有和我一样的愿望,并且不介意一个快速而肮脏的解决方案:

my $input = text.html;
my $stripped = $hs->parse($input);
$hs->eof;
现在我有两个字符串变量。一个是我想要处理的html文件,另一个是去掉html的同一个文件

my @marks = split(/\s/, $stripped);
@marks = uniq(@marks);
现在我有了一个列表,其中列出了文件中出现的所有非HTMLtag关联词

$input = HTML::Entities::decode($input);
$input =~ s/\</ \</g; 
$input =~ s/\>/\> /g; 
$input =~ s/\n/ \n /g; 
$input =~ s/\r/ \r /g; 
$input =~ s/\t/ \t /g;
现在我用“+”标记了每个单词,并用TAQ分隔符将单词和非单词分开。我现在可以在TAQ上拆分,并在执行NLP和文本操作时忽略任何不包含“+”的项。完成后,我重新加入并去掉所有的“+”。然后用一些巧妙的编码,删除我插入的所有额外空格,然后砰!我现在已经完成了NLP处理,处理了文本,并且仍然将所有HTML放在正确的位置

这里有很多警告,我不打算一一说明。最大的问题是需要先解码然后编码,再加上HTML::Strip并不总是剥离所有javascript或无效HTML。有很多方法可以解决这个问题,但我同样没有空间或时间在这里讨论这个问题


谢谢阿蒙的帮助,我欢迎任何批评或建议。我是新来的

模块
HTML::Strip
使用XS glue语言将Perl代码与C代码连接起来。您可以在(元)cpan上找到例如。它包括一个实现实际算法的文件。由于XS文件中的定义,Perl代码中有一个
strip_html
sub,作为
html::strip
包的一部分。因此,它可以作为适当对象上的方法调用

对那段代码的解释 这将调用
$text
内容上的C函数来去除所有HTML标记。剥离数据随后将分配给
$stripped

if( $self->decode_entities && $_html_entities_p ) {
  $stripped = HTML::Entities::decode($stripped);
}
-p
作为变量名的后缀是一种表示布尔变量(或数学中的谓词)的方法。在这里,它指示是否可以加载
HTML::Entities
my$\u HTML\u Entities\u p=eval'require HTML::Entities'。如果配置选项
decode\u entities
设置为真值,并且可以加载
HTML::entities
,则实体将在剥离数据中解码

示例:给定输入

<code> $x &lt; $y </code>
那么剥离就会产生

$x &lt; $y
解码实体会使它

$x < $y
$x<$y

太棒了。谢谢你的解释。非常彻底。不幸的是,strip_html.c有点让我不知所措,我似乎无法操纵或模仿它。所以我仍然坚持我原来的问题:剥离html,操纵文本,返回html。在这方面有什么建议吗?@Nick你想做的很可能是一个非常困难的问题。我可能会以这样一种方式编写NLP代码,即它在预标记化的输入上工作,并将通过空白标记。然后,标记信息可以保留为空白标记,例如foo&;条形图

可以做成
[p=>{style=>“…”}]、“”、“foo”、“”、“&”、“”、“bar”、[unde,”p“]
,其中数组引用和空白被视为空白。当处理过程中添加的标记跨越半个标记(例如,
foo&bar

baz
)时,这会发生故障,这是无效的。当然,可以通过将输出清理为类似
foo&bar

baz
的内容来缓解。这并不太复杂,应该可以通过一个简单的下推自动机来实现。但这可能会产生您不想要的输出。此外,使用特殊的no-op令牌可能无法与外部lib一起使用。想办法正确地做这件事,玩得开心!标记化是一个好主意。是否有一种方便的方法来标记所有不在html标记的<和>范围内的单词?我能想到的最好的方法是
$text=“foo&bar

baz”$剥离=$hs->parse($text)@array1=拆分(/,$text)@array2=拆分(/,$剥离);对于我的$a(@array1){对于我的$b(@array2){$a=join('''.$a,\^),如果$a=~/$b/;}}
现在@array1用'^'符号标记了所有非html单词,我的NLP处理可以忽略非标记化单词,并且我可以在完成后删除标记。你能想出一个更好的方法吗?当然,我必须确保标记和文本单词之间用空格隔开。
$x &lt; $y
$x < $y