| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Description • Installation • Usage • License
RapidFuzz is a fast string matching library for Python and C++, which is using the string similarity calculations from FuzzyWuzzy. However, there are two aspects that set RapidFuzz apart from FuzzyWuzzy:
The Library is split across multiple repositories for the different supported programming languages:
There are severals ways to integrate rapidfuzz in your CMake project.
git clone https://github.com/rapidfuzz/rapidfuzz-cpp.git rapidfuzz-cpp
cd rapidfuzz-cpp
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
cmake --build . --target installThen in your CMakeLists.txt:
find_package(rapidfuzz REQUIRED)
add_executable(foo main.cpp)
target_link_libraries(foo rapidfuzz::rapidfuzz)git submodule add https://github.com/rapidfuzz/rapidfuzz-cpp.git 3rdparty/RapidFuzzThen you can either:
add_subdirectory(3rdparty/RapidFuzz)
add_executable(foo main.cpp)
target_link_libraries(foo rapidfuzz::rapidfuzz)FetchContent_Declare(
rapidfuzz
SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/RapidFuzz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/rapidfuzz
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> "${CMAKE_OPT_ARGS}"
)
FetchContent_MakeAvailable(rapidfuzz)
add_executable(foo main.cpp)
target_link_libraries(foo PRIVATE rapidfuzz::rapidfuzz)If you don't want to add rapidfuzz-cpp as a submodule, you can also download it with FetchContent:
FetchContent_Declare(rapidfuzz
GIT_REPOSITORY https://github.com/rapidfuzz/rapidfuzz-cpp.git
GIT_TAG main)
FetchContent_MakeAvailable(rapidfuzz)
add_executable(foo main.cpp)
target_link_libraries(foo PRIVATE rapidfuzz::rapidfuzz)It will be downloaded each time you run CMake in a blank folder.
There are CMake options available:
#include <rapidfuzz/fuzz.hpp>using rapidfuzz::fuzz::ratio;
// score is 96.55171966552734
double score = rapidfuzz::fuzz::ratio("this is a test", "this is a test!");// score is 100
double score = rapidfuzz::fuzz::partial_ratio("this is a test", "this is a test!");// score is 90.90908813476562
double score = rapidfuzz::fuzz::ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
// score is 100
double score = rapidfuzz::fuzz::token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")// score is 83.8709716796875
double score = rapidfuzz::fuzz::token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
// score is 100
double score = rapidfuzz::fuzz::token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")In the Python implementation, there is a module process, which is used to compare e.g. a string to a list of strings. In Python, this both saves the time to implement those features yourself and can be a lot more efficient than repeated type conversions between Python and C++. Implementing a similar function in C++ using templates is not easily possible and probably slower than implementing them on your own. That's why this section describes how users can implement those features with a couple of lines of code using the C++ library.
The following function compares a query string to all strings in a list of choices. It returns all elements with a similarity over score_cutoff. Generally make use of the cached implementations when comparing a string to multiple strings.
template <typename Sentence1,
typename Iterable, typename Sentence2 = typename Iterable::value_type>
std::vector<std::pair<Sentence2, double>>
extract(const Sentence1& query, const Iterable& choices, const double score_cutoff = 0.0)
{
std::vector<std::pair<Sentence2, double>> results;
rapidfuzz::fuzz::CachedRatio<typename Sentence1::value_type> scorer(query);
for (const auto& choice : choices) {
double score = scorer.similarity(choice, score_cutoff);
if (score >= score_cutoff) {
results.emplace_back(choice, score);
}
}
return results;
}The following function compares a query string to all strings in a list of choices.
template <typename Sentence1,
typename Iterable, typename Sentence2 = typename Iterable::value_type>
std::optional<std::pair<Sentence2, double>>
extractOne(const Sentence1& query, const Iterable& choices, const double score_cutoff = 0.0)
{
bool match_found = false;
double best_score = score_cutoff;
Sentence2 best_match;
rapidfuzz::fuzz::CachedRatio<typename Sentence1::value_type> scorer(query);
for (const auto& choice : choices) {
double score = scorer.similarity(choice, best_score);
if (score >= best_score) {
match_found = true;
best_score = score;
best_match = choice;
}
}
if (!match_found) {
return nullopt;
}
return std::make_pair(best_match, best_score);
}It is very simple to use those scorers e.g. with open OpenMP to achieve better performance.
template <typename Sentence1,
typename Iterable, typename Sentence2 = typename Iterable::value_type>
std::vector<std::pair<Sentence2, double>>
extract(const Sentence1& query, const Iterable& choices, const double score_cutoff = 0.0)
{
std::vector<std::pair<Sentence2, double>> results(choices.size());
rapidfuzz::fuzz::CachedRatio<typename Sentence1::value_type> scorer(query);
#pragma omp parallel for
for (size_t i = 0; i < choices.size(); ++i) {
double score = scorer.similarity(choices[i], score_cutoff);
results[i] = std::make_pair(choices[i], score);
}
return results;
}RapidFuzz is licensed under the MIT license since I believe that everyone should be able to use it without being forced to adopt the GPL license. That's why the library is based on an older version of fuzzywuzzy that was MIT-licensed as well. This old version of fuzzywuzzy can be found here.
| Back | FazBrowse Home | New Git URL |