0

このコードを改善して機能を維持する方法はありますか? その一部は、Windows と Linux でそのコードと出力を確認した結果であるため、「マルチ OS」である必要があります。

// 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' Study 修飾子を使用すると、マッチングがかなり高速化されます。以下は、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ステートメントにある可能性があります。(ベンチマークには 4 つの要素を持つ単純な配列を使用しました: ['one','two','three','four'])。アレイがはるかに大きい$stopwordsと、改善はほとんど見られません。

クラシックには、次のような便利な効率に関するヒントがたくさんあります: Mastering Regular Expressions (第 3 版) -定期的に正規表現を使用するすべての人にとって必読です

8^)

于 2012-11-14T03:23:10.540 に答える
2

これがアプリケーションのボトルネックであると確信していますか? 何もないパフォーマンスの最適化を行う前に、必ずプロファイルを作成する必要があります。

これによりパフォーマンスが大幅に向上するかどうかはわかりませんが、少なくともコードが少し簡素化されます。Replace enters最後の 2 つのステートメントを呼び出しに折りたたむことで、それらを取り除くことができます。

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

その後、2 つの置換を組み合わせることができます。

// 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 内でさらに 2 つの選択肢を使用して を実行することもできますが、preg_replaceこれはかなりわかりにくいと思います。繰り返しますが、それがパフォーマンスに適しているかどうかもわかりません。

于 2012-11-14T01:23:26.810 に答える
1

以下を見てください。

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

PHP、Perl、Python の正規表現の速度を比較します。特に、PHP が必要とする時間の約 20% しかかからない Perl の驚異的な速度に注目してください。

于 2012-12-08T19:44:51.543 に答える