Regexは走るために5日を取っていました.それで、私は15分でそれをしたツールを作りました.


開発者がテキストで動作するとき、彼らはしばしば最初にそれをきれいにする必要があります.時々、それはキーワードを取り替えることによってあります.「JavaScript」を「JavaScript」に置き換えるように.他の回、私たちはただ「JavaScript」がドキュメントで言及されたかどうか知りたいです.
これらのようなデータクリーニングタスクは、テキストを扱うほとんどのデータサイエンスプロジェクトの標準です.

データサイエンスはデータクリーニングから始まる
私は最近仕事をするのと同じような仕事をした.私はデータ科学者として働いていますBelong.co 自然言語処理は私の仕事の半分です.
私たちのドキュメントコーパスでWord 2 Vecモデルを訓練したとき、それは類義語を類似語として与え始めました.「JavaScript」は「JavaScript」に類似した用語として来ていました.
これを解決するために、私はすべての既知の同義語を標準化された名前で置き換えるために正規表現(regex)を書きました.regexは“JavaScript”を“JavaScript”に置き換えました.
Some people, when confronted with a problem, think 
“I know, I’ll use regular expressions.” Now they have two problems.
上記引用はこれからですstack-exchange question そして、それは私のために来ました.
検索対象となるキーワードの数が100 sであれば,regexは高速であることが分かった.しかし、私のコーパスは数千人以上のキーワードと数百万の文書を持っていました.
Regexコードをベンチマークしたとき、私は1回の実行を完了するまでに5日間かかるとわかった.私の反応

明らかに何かを行う必要があります.
[更新]
私は、私が使っていたregexを最適化しようとし始めました.コンパイルされたregexが速くなったので、私はそれに切り替えました.複数の条件を一緒に置き換えるには、グループのオプションと私はそれを適応されます.私はまだ' C++'、'のような特殊文字を持つキーワードに問題を抱えていました.正味のLink .
Regexにロードするとき、キーワードを分類することは、パフォーマンスを改善しました.
私の最高の学びはこれから来ましたLink . trieベースのregexは高速ですLink 私がプロジェクトを始めたとき、私はこれを知りませんでした、しかし、私はtrieを使うことと同じ方向に行きました.
私は一般的にregexが悪いと言うつもりではありません、それは本当に本当に多くの異なる実装を理解するのは難しいです.私は、Pythonのバージョンを使用していた、ここでは、錆は、さらに高速なコンパイルされたバージョンがあります.また、より速くなっているC +のバージョンがあります.
あなただけの速度を探している場合は、おそらくそれらのいずれかを試すことができます.私はより多くの制御とシンプルさを使用する必要があるので、私はツールを構築した.これは私がregexのほとんど知識を持つ誰もがそれを使用することができることを確認して詳細を抽象化に役立った.
[更新終了]
私はオフィスでスタックオーバーフローを尋ねました.そして、2、3の提案がやって来ました.両方ともStack Overflow と呼ばれるこの美しいアルゴリズムに向けて指摘Aho-Corasick algorithm and Trie 辞書アプローチ.私はいくつかの既存の解決策を探しましたが、多くを見つけることができませんでした.
だから私は自分自身の実装を書きましたFlashText -生まれ.
FlashTextとどのように動作するかに入る前に、それがどのように実行するか見てみましょう.
時間がFlashTextでregexと比較して用語を見つけるために撮影.

上に示されたチャートは、1つの文書のために簡潔なregexとフラッシュテキストの比較です.キーワードの数が増えるにつれて,regexの時間はほぼ直線的に増加する.まだFlashTextでそれは重要ではない.

Flashtextは、5日から15分まで我々の実行時間を減らしました!

時間は、Regexに比較して条件を置き換えるためにFlashTextで撮影.

上記のベンチマークに使用されるコードはリンクされますhere , and here .

だから何FlashTextですか?
FlashTextは私がオープンソースのライブラリですGitHub . 抽出したキーワードは効率的で,置換する.
FlashTextを最初に使用するには、キーワードのリストを渡す必要があります.このリストは、trie辞書をビルドするために内部的に使用されます.それから、あなたはストリングをそれに渡して、あなたが交換か検索を実行するかどうか言います.
For replace 置き換えられたキーワードで新しい文字列を作成します.For search それはストリングで見つかるキーワードのリストを返します.これは入力文字列の上の1パスで起こります.
ここでは、幸せなユーザーがライブラリについて言っていたものです

ラディンイェ
@ radimrehurerek

1 kのキーワードのためのコンパイルされた正規表現とドキュメントあたり10 kトークンより速い28 x.いいね純粋なPython t ...twitter.com/i/web/status/9…
午前8時58分
Radim RehurekはGensimの作成者です.

なぜFlashTextので、高速ですか?
この部分を試してみましょう.我々には、3つの語がある文があると言いますI like Python , そして、4つの単語を持つコーパス{Python, Java, J2ee, Ruby} .
我々がコーパスから各々の語をとって、それが文の中にあるかどうかチェックするならば、それは4つのトライをします.
is 'Python' in sentence? 
is 'Java' in sentence?
...
もしコーパスがn それが取った言葉n ループ.また、各検索ステップis <word> in sentence? それは自分自身の時間がかかります.これはレグックスの試合で起こることの種類です.
第1のものの逆のもう一つのアプローチが、あります.文の各単語について、それがコーパスに存在するかどうかチェックしてください.
is 'I' in corpus?
is 'like' in corpus?
is 'python' in corpus?
もし文がm それが取った言葉m ループ.この場合、それがかかる時間は、文の語の数に依存するだけです.そして、このステップis <word> in corpus? 辞書のルックアップを使用して高速にすることができます.
FlashTextアルゴリズムは、第2のアプローチに基づいています.これは、AHO corasickアルゴリズムとtrieデータ構造に触発されます.
それが動作する方法です:最初のトライ辞書は、コーパスで作成されます.このように見える
Start and EOT 単語の境界を表すspace , period and new_line . それが両側に単語境界を持つならば、キーワードはマッチするだけです.これはパイナップルのリンゴのマッチングを防ぐことができます.
次に入力文字列を取るI like Python 文字で文字を検索します.
Step 1: is <start>I<EOT> in dictionary? No
Step 2: is <start>like<EOT> in dictionary? No
Step 3: is <start>Python<EOT> in dictionary? Yes

これはキャラクタバイマッチですので、簡単にスキップできました<start>like<EOT> アット<start>l だってl が接続されていないstart . これは本当に速く欠けている単語をスキップします.
FlashTextアルゴリズムは、入力文字列' i ' python 'の各文字を越えただけです.辞書は、ランタイムに影響を与えずに、100万のキーワードを持ちました.これは、フラッシュテキストアルゴリズムの真のパワーです.
あなたはtrieベースのregexを構築することによって同様の速度を得ることができますLink

それで、あなたはFlashTextを使うべきですか?
シンプルな答え:ときにキーワードの数

正規回答:正規表現のような正規表現の特殊文字に基づいて検索することができます^,$,*,\d,. これはすべてFlashTextでサポートされていません.すべてのFlashTextは、用語の開始と終了を理解しています.簡単に言えば\w,\b .
だから、あなたのような部分的な言葉と一致したい場合は良いことだword\dvec . しかし、それはような完全な単語を抽出するために優れていますword2vec .

フラッシュテキストの使い方
用語を見つける
< div >
用語を置き換えるために: < P >
< div class ="LagagCount - gig - Link - tag "
"スクリプトのID "https://gist.github.com/vi3k6i5/eebf91c643adfb1b38ae04a6c5d01e77.js//>
< div >
< H >

次は?
<高橋潤子>
あなたがエンティティ認識、NLP、Word 2 Vec、Keras、TensorFlowで働く誰かを知っているならば、彼らとこのブログを共有してください.このライブラリは、私たちのために本当に便利です.他にも役に立つでしょう.p >
本来はPhere


< q > : wq