RapidFuzz は、FuzzyWuzzy の文字列類似性計算を使用する、Python および C++ 用の高速文字列マッチング ライブラリです。ただし、RapidFuzz が FuzzyWuzzy と異なる点がいくつかあります。
MIT ライセンスを取得しているため、プロジェクトに選択したいライセンスを使用できますが、FuzzyWuzzy を使用する場合は GPL ライセンスを採用する必要があります。
FuzzyWuzzy には含まれていない、hamming や jaro_winkler などの多くの string_metrics を提供します。
これは主に C++ で書かれており、これに加えて、同じ結果を提供しながら文字列のマッチングをさらに高速化するために多くのアルゴリズムの改善が加えられています。詳細なベンチマークについては、ドキュメントを確認してください。
partial_ratio
実装の複数のバグを修正しました。
これは主に、 fuzzywuzzy
のドロップイン代替品として使用できます。ただし、ここで説明する API の違いがいくつかあります
Python 3.9以降
Windows では、Visual C++ 2019 再頒布可能パッケージが必要です
RapidFuzz をインストールするにはいくつかの方法があります。推奨される方法は、 pip
(Python パッケージ マネージャー) またはconda
(オープンソース、クロスプラットフォーム、パッケージ マネージャー) を使用することです。
RapidFuzz は、次の方法でpip
を使用してインストールできます。
pip インストール Rapidfuzz
MacOS (10.9 以降)、Linux x86_64、Windows 用の RapidFuzz のビルド済みバイナリ (ホイール) があります。 armv6l (Raspberry Pi Zero) および armv7l (Raspberry Pi) 用のホイールは piwheels で入手できます。
✖️失敗「インポートエラー: DLL のロードに失敗しました」
Windows でこのエラーが発生した場合、その理由として最も可能性が高いのは、C++ ライブラリを見つけるために必要な Visual C++ 2019 再頒布可能パッケージがインストールされていないことです (C++ 2019 バージョンには 2015、2017、および 2019 バージョンが含まれます)。
RapidFuzz はconda
でインストールできます。
conda install -c conda-forge Rapidfuzz
RapidFuzz は、リポジトリのクローンを作成することで、ソース ディストリビューションから直接インストールできます。これには、C++17 対応コンパイラが必要です。
git clone --recursive https://github.com/rapidfuzz/rapidfuzz.gitcd Rapidfuzz pip インストール 。
いくつかの簡単な関数を以下に示します。すべての関数の完全なドキュメントはここにあります。
RapidFuzz 3.0.0 以降、デフォルトでは文字列は前処理 (英数字以外の文字の削除、空白のトリミング、すべての文字の小文字への変換) が行われないことに注意してください。つまり、文字は同じだが大文字と小文字が異なる 2 つの文字列 (「これは単語です」、「THIS IS A WORD」) を比較する場合、類似性スコア値が異なる可能性があるため、そのような文字列を比較するとスコアに違いが見られる可能性があります。以前のバージョンと比較した値。前処理を使用した文字列マッチングの例をいくつかここに示します。
RapidFuzz のスコアラーは、モジュールfuzz
およびdistance
にあります。
> from Rapidfuzz import fuzz> fuzz.ratio("これはテストです", "これはテストです!")96.55172413793103
> from Rapidfuzz import fuzz> fuzz.partial_ratio("これはテストです", "これはテストです!")100.0
> from Rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")100.0
> from Rapidfuzz import fuzz> fuzz.token_sort_ratio("ファジーはクマでした", "ファジー ファジーはクマでした")84.21052631578947> fuzz.token_set_ratio("ファジーはクマでした", "ファジー ファジーはクマでした")100.0# 100.0 を返します一方の文字列がもう一方の文字列のサブセットであるかどうかに関係なく、長い文字列の余分なコンテンツ> fuzz.token_set_ratio("ファジーはクマだが犬ではない", "ファジーはクマ")100.0# スコアは 2 つの文字列に明示的な不一致がある場合にのみ減ります> fuzz.token_set_ratio( 「ファジーはクマでしたが犬ではありませんでした」、「ファジーはクマでしたが犬ではありませんでした」猫")92.3076923076923
> from Rapidfuzz import fuzz> fuzz.WRatio("this is a test", "this is a new test!!!")85.5> from Rapidfuzz import fuzz, utils> # 英数字以外の文字 ("!") をstring> fuzz.WRatio("これはテストです", "これは新しいテストです!!!",processor=utils.default_process) # ここで "これは新しいテストです!!!"は "this is a new test" に変換されます 95.0> fuzz.WRatio("this is a test", "this is a new test")95.0> # 文字列を小文字に変換> fuzz.WRatio("this is a word" , "これは単語です")21.42857142857143> fuzz.WRatio("これは単語です", "これは単語です", processor=utils.default_process) # ここで「THIS IS A WORD」は「this is a word」に変換されます100.0
> from Rapidfuzz import fuzz> fuzz.QRatio("this is a test", "this is a new test!!!")80.0> from Rapidfuzz import fuzz, utils> # 英数字以外の文字 ("!") をstring> fuzz.QRatio("これはテストです", "これは新しいテストです!!!",processor=utils.default_process)87.5> fuzz.QRatio("thisこれはテストです", "これは新しいテストです")87.5> # 文字列を小文字に変換します> fuzz.QRatio("これは単語です", "THIS IS A WORD")21.42857142857143> fuzz.QRatio("これは単語です単語"、"これは単語です"、プロセッサ=utils.default_process)100.0
プロセス モジュールは、文字列を文字列のリストと比較します。これは通常、Python から直接スコアラーを使用するよりもパフォーマンスが高くなります。 RapidFuzz でのプロセッサの使用例をいくつか示します。
> Rapidfuzz インポート プロセスから、fuzz> 選択肢 = ["アトランタ ファルコンズ", "ニューヨーク ジェッツ", "ニューヨーク ジャイアンツ", "ダラス カウボーイズ"]> process.extract("ニューヨーク ジェッツ", 選択肢, スコアラー=fuzz. WRatio、limit=2)[('ニューヨーク・ジェッツ', 76.92307692307692, 1), ('ニューヨーク・ジャイアンツ', 64.28571428571428, 2)]> process.extractOne("cowboys", Choices,scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # 前処理あり> from Rapidfuzz import process, fuzz, utils> process.extract( 「ニューヨーク・ジェッツ」、選択肢、スコアラー=fuzz.WRatio, リミット=2, プロセッサ=utils.default_process)[('ニューヨーク・ジェッツ', 100.0, 1), ('ニューヨーク・ジャイアンツ', 78.57142857142857, 2)]> process.extractOne("カウボーイズ",選択肢、スコアラー = fuzz.WRatio、プロセッサ = utils.default_process)('ダラスカウボーイズ、90.0、3)
プロセッサの完全なドキュメントはここにあります
次のベンチマークは、RapidFuzz と FuzzyWuzzy のパフォーマンスを簡単に比較します。文字列メトリクスのより詳細なベンチマークについては、ドキュメントを参照してください。この単純な比較のために、長さ 10 の 10,000 個の文字列のリストを生成し、このリストの 100 個の要素のサンプルと比較しました。
Words = ["".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))for _ in range(10_000) ]サンプル = 単語[:: len(単語) // 100]
最初のベンチマークでは、次の方法で FuzzyWuzzy と RapidFuzz のスコアラーを Python から直接使用した場合のパフォーマンスを比較します。
サンプル内のサンプルの場合:単語内の単語の場合:スコアラー(サンプル、単語)
次のグラフは、各スコアラーで 1 秒あたりに処理される要素の数を示しています。異なるスコアラーの間には大きなパフォーマンスの差があります。ただし、各スコアラーは RapidFuzz の方が高速です
2 番目のベンチマークは、次の方法でスコアラーを cdist と組み合わせて使用した場合のパフォーマンスを比較します。
cdist(サンプル、単語、スコアラー=スコアラー)
次のグラフは、各スコアラーで 1 秒あたりに処理される要素の数を示しています。 RapidFuzz では、 cdist
などのプロセッサを介してスコアラーを使用すると、スコアラーを直接使用するよりもはるかに高速になります。そのため、可能な限りこれらを使用する必要があります。
RapidFuzz を仕事に使用していて、プロジェクトをサポートするために自分の利益を少しでも還元したいと思われる場合は、GitHub スポンサーまたは PayPal を通じて私たちに送金することを検討してください。この素晴らしいライブラリのメンテナンスのための自由時間を購入するために使用できます。ソフトウェアのバグを修正したり、コードの貢献をレビューして統合したり、機能やドキュメントを改善したり、時々深呼吸してお茶を飲んだりすることもできます。ご支援ありがとうございます。
GitHub スポンサーまたは PayPal を通じてプロジェクトをサポートします。
RapidFuzz は、GPL ライセンスの採用を強制されることなく誰もが使用できるべきだと考えているため、MIT ライセンスに基づいてライセンスされています。そのため、ライブラリは MIT ライセンスも取得した fuzzywuzzy の古いバージョンに基づいています。 fuzzywuzzy の古いバージョンはここにあります。