gpt4 book ai didi

perl - 在 perl 中替换文本中的一组单词的速度 -

转载 作者:行者123 更新时间:2023-12-04 15:07:32 25 4
gpt4 key购买 nike

上下文优先:我试图在维基百科页面中突出显示歌曲标题。首先,我从页面上获取引用的部分,我检查它们是否存在于歌曲标题数据库中,然后我突出显示我找到的那些。数据库部分出奇地快,提取歌曲标题(引用)也是如此。

因此(我认为)我需要替换 HTML 中的一组单词(标题)并将它们包装在这样的范围内(对于每个单词):

s/word/<span class="something">word<\/span>/gi

文本大约有 100k 长,列表大约有 300 个单词(都不是预先确定的),因此一次替换一个单词的迭代过程太慢了(如果可能,我需要保持 < 1 秒)。

我已经完成了

my $re = join '|', map { quotemeta($_) } @words;
$dom =~ s/($re)/<span class="something">$1<\/span>/gi;

这似乎有效并且速度很快(在我的基准案例中为 0.64)。

现在我想替换 \"$word\" 而不仅仅是 $word 所以我尝试了这个:

my $re = join '|', map { quotemeta(join '', '"', $_, '"') } @words;

速度下降了 10 倍。将速度与 NYTProf 进行比较,所有差异似乎都在 CORE:substcont

这是为什么?

(非常感谢有关如何避免替换标签内文本的建议,例如 id="word_to_be_replaced")

最佳答案

我不知道您实际上在做什么,因为您只提出了您认为的问题所在(而我们看不到其余部分)。

首先,您有 join '', '"', $_, '"',但这只是 qq("$_")

接下来,如果您有一个用引号括起来的单词交替,则不需要在每个单词周围加上引号。将单词 alteration 分组并在其周围加上引号:

s/ " (?: word1 | word2 | ... ) " /.../x;

我的第一个怀疑是无论你的模式做什么都涉及更多的回溯。

为了避免替换 HTML 中可能存在的相同文本,我会使用 HTML 解析器并且只查看文本。但是,这将比已经发生的事情花费更长的时间。

关于perl - 在 perl 中替换文本中的一组单词的速度 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65823375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com