0

有没有办法改进此代码并维护功能?其中一些是在 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);

输入:

<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>

输出:

esperanto esperanto povodne lingvo internacia medzinarodny jazyk najrozsirenejsi medzinarodny planovy jazyk nazov odvodeny pseudonymu ktorym roku zverejnil lekar zamenhof zaklady tohto 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 esperanto uradny jazyk pouziva komunita odhadovanym poctom hovoriacich coho priblizne tvoria rodeni hovoriaci ziskalo iste medzinarodne uznania napriklad dve rezolucie unesco podporu znamych osobnosti verejneho zivota sucasnosti esperanto vyuziva cestovani dopisovani medzinarodnych stretnutiach kulturnych vymenach kongresoch vedeckych diskusiach povodnej prekladovej

4

3 回答 3

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阵列将显示更少的改进。

在经典中还有更多有用的效率花絮:掌握正则表达式(第 3 版) -定期使用正则表达式的每个人都必须阅读。

8^)

于 2012-11-14T03:23:10.540 回答
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在 last 中使用另外两个替代方案preg_replace,但我觉得这相当模糊,而且我不知道这是否对您的表现有好处。

于 2012-11-14T01:23:26.810 回答
1

Take a look at the following:

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

It compares the speed of regexes for PHP, Perl and Python. Note especially the tremendous speed of Perl, which takes only around 20% of the time required by PHP.

于 2012-12-08T19:44:51.543 回答