文本预处理的性能改进

时间:2012-11-14 01:05:51

标签: php regex linux windows text-processing

有没有办法改进此代码并维护功能?其中一些是在Windows和Linux上检查代码和输出的结果,因此需要“多操作系统”。

// Remove tags
$input = strip_tags($input);
// Converts accented to non-accented
$input =  iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
// String to lower
$input = strtolower($input);
// Remove all non-word and non-space chars
$input = preg_replace('/[^\sa-z]/', '', $input);
// Replace enters
$input = preg_replace('/[\r\n]/', ' ', $input);
// Remove stopwords
$input = preg_replace('/\b(' . implode('|', $stopwords) . ')\b/', '', $input);
// Remove individual chars
$input = preg_replace('/\b([a-z])\b/', '', $input);
// Trim it
$input = trim($input);
// Remove multiple spaces
$input = preg_replace("/[[:blank:]]+/", " ", $input);

INPUT:

<doc id="603" url="http://it.wikipedia.org/wiki/Esperanto">
Esperanto.
Esperanto (pôvodne Lingvo Internacia – „medzinárodný jazyk“) je najrozšírenejší <a     href="Medzin%C3%A1rodn%C3%BD_pomocn%C3%BD_jazyk">medzinárodný</a> <a     href="Umel%C3%BD_jazyk">plánový jazyk</a>. Názov je odvodený od <a     href="Pseudonym">pseudonym</a>u, pod ktorým v roku <a href="1887">1887</a> zverejnil lekár     <a href="Ludwik_Lejzer_Zamenhof">L. L. Zamenhof</a> základy tohto jazyka. Zámerom tvorcu     bolo vytvoriť ľahko naučiteľný a použiteľný neutrálny jazyk, vhodný na použitie v     medzinárodnej komunikácii. Cieľom nebolo nahradiť <a href="N%C3%A1rodn%C3%BD_jazyk">národné     jazyky</a>, čo bolo neskôr aj deklarované v <a     href="Boulonsk%C3%A1_deklar%C3%A1cia">Boulonskej deklarácii</a>.
Hoci žiaden <a href="%C5%A1t%C3%A1t">štát</a> neprijal esperanto ako <a href="%C3%BAradn%C3%BD_jazyk">úradný jazyk</a>, používa ho komunita s odhadovaným počtom hovoriacich 100 000 až 2 000 000, z čoho približne 1 000 tvoria rodení hovoriaci. Získalo aj isté medzinárodné uznania, napríklad dve rezolúcie <a href="UNESCO">UNESCO</a> či podporu známych osobností verejného života. V súčasnosti sa esperanto využíva pri <a href="Cestovanie">cestovaní</a>, dopisovaní, medzinárodných stretnutiach a kultúrnych výmenách, <a href="Kongres">kongres</a>och, <a href="Veda">vedeckých</a> diskusiách, v pôvodnej aj prekladovej
</doc>

输出:

  

世界语世界语povodne国际语medzinarodny jazyk najrozsirenejsi medzinarodny planovy jazyk nazov odvodeny pseudonymu ktorym Roku公司zverejnil礼加柴门霍夫ZAKLADY东都jazyka zamerom tvorcu vytvorit lahko naucitelny pouzitelny neutralny jazyk vhodny pouzitie medzinarodnej komunikacii cielom nebolo nahradit narodne jazyky neskor deklarovane boulonskej deklaracii HOCI ziaden STAT neprijal世界语uradny jazyk pouziva komunita odhadovanym poctom hovoriacich银鲑priblizne tvoria rodeni hovoriaci ziskalo ISTE medzinarodne uznania napriklad DVE rezolucie UNESCO podporu znamych osobnosti verejneho zivota sucasnosti世界语vyuziva cestovani dopisovani medzinarodnych stretnutiach kulturnych vymenach kongresoch vedeckych diskusiach povodnej prekladovej

3 个答案:

答案 0 :(得分:2)

您确定这是您的应用程序的瓶颈吗?在进行无性能优化之前,您一定要对其进行概要分析。

我不确定这是否会显着提高性能,但至少它会略微简化代码。您可以通过将它们折叠到Replace enters调用中来删除最后两个语句:

// Replace all (consecutive) whitespace characters with a single space:
$input = preg_replace('/\s+/', ' ', $input);

之后你可以将两个替换组合起来:

// Remove all stopwords and single letters:
$input = preg_replace('/\b(' . implode('|', $stopwords) . '|[a-z])\b/', '', $input);

所以你最终得到了这个:

// Remove tags
$input = strip_tags($input);
// Converts accented to non-accented
$input =  iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
// String to lower
$input = strtolower($input);
// Remove all non-word and non-space chars
$input = preg_replace('/[^\sa-z]/', '', $input);
// Replace all (consecutive) whitespace characters with a single space:
$input = preg_replace('/\s+/', ' ', $input);
// Remove all stopwords and single letters:
$input = preg_replace('/\b(' . implode('|', $stopwords) . '|[a-z])\b/', '', $input);
// Trim it
$input = trim($input);

事实上你可以在上一个trim内再添加两个替代preg_replace,但我发现这个相当模糊,而且我不知道这对你的表现是否有益

答案 1 :(得分:2)

m.buettner的回答是个好的开始。通过该解决方案,我的基准测试速度提高了25%以上。

PCRE'S'“学习”修饰语

对于某些正则表达式,PCRE 'S' 研究修饰符可以加快匹配速度。这是m.buettner代码的增强版本:

// Remove tags
$input = strip_tags($input);
// Converts accented to non-accented
$input =  iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
// String to lower
$input = strtolower($input);
// Remove all non-word and non-space chars
$input = preg_replace('/[^\sa-z]+/S', '', $input);
// Replace all (consecutive) whitespace characters with a single space:
$input = preg_replace('/\s+/S', ' ', $input);
// Remove all stopwords and single letters:
$input = preg_replace('/\b('.implode('|', $stopwords).'|[a-z])\b/', '', $input);
// Trim it
$input = trim($input);

这进一步提高了速度,比原版速度提高了约45%。请注意,S Study 修饰符对以文字文本或锚点开头的正则表达式没有帮助。可能是瓶颈在$stopwords语句中,取决于你在那里有多少。 (我使用了一个带有四个元素的简单数组进行基准测试:['one','two','three','four'])。一个更大的$stopwords数组将显示出更少的改进。

对于经常使用正则表达式的每个人来说,经典中有许多有用的效率花絮:Mastering Regular Expressions (3rd Edition) - 必读

8 ^)

答案 2 :(得分:1)

看看以下内容:

http://stuffivelearned.org/doku.php?id=programming:general:phpvspythonvsperl

它比较了PHP,Perl和Python的正则表达式的速度。特别注意Perl的巨大速度,它只需要PHP的大约20%的时间。