Skip to main content

library for fast approximate string matching using Jaro and Jaro-Winkler similarity

Project description

JaroWinkler

Continous Integration PyPI package version Python versions
GitHub license

JaroWinkler is a library to calculate the Jaro and Jaro-Winkler similarity. It is easy to use, is far more performant than all alternatives and is designed to integrate seemingless with RapidFuzz.

:zap: Quickstart

>>> from jarowinkler import *

>>> jaro_similarity("Johnathan", "Jonathan")
0.8796296296296297

>>> jarowinkler_similarity("Johnathan", "Jonathan")
0.9037037037037037

🚀 Benchmarks

The implementation is based on a novel approach to calculate the Jaro-Winkler similarity using bitparallelism. This is significantly faster than the original approach used in other libraries. The following benchmark shows the performance difference to jellyfish and python-Levenshtein.

Benchmark JaroWinkler

⚙️ Installation

You can install this library from PyPI with pip:

pip install jarowinkler

JaroWinkler provides binary wheels for all common platforms.

Source builds

For a source build (for example from a SDist packaged) you only require a C++14 compatible compiler. You can install directly from GitHub if you would like.

pip install git+https://github.com/maxbachmann/JaroWinkler.git@main

📖 Usage

Any algorithms in JaroWinkler can not only be used with strings, but with any arbitary sequences of hashable objects:

from jarowinkler import jarowinkler_similarity


jarowinkler_similarity("this is an example".split(), ["this", "is", "a", "example"])
# 0.8666666666666667

So as long as two objects have the same hash they are treated as similar. You can provide a __hash__ method for your own object instances.

class MyObject:
    def __init__(self, hash):
        self.hash = hash

    def __hash__(self):
        return self.hash

jarowinkler_similarity([MyObject(1), MyObject(2)], [MyObject(1), MyObject(2), MyObject(3)])
# 0.9111111111111111

All algorithms provide a score_cutoff parameter. This parameter can be used to filter out bad matches. Internally this allows JaroWinkler to select faster implementations in some places:

jaro_similarity("Johnathan", "Jonathan", score_cutoff=0.9)
# 0.0

jaro_similarity("Johnathan", "Jonathan", score_cutoff=0.85)
# 0.8796296296296297

JaroWinkler can be used with RapidFuzz, which provides multiple methods to compute string metrics on collections of inputs. JaroWinkler implements the RapidFuzz C-API which allows RapidFuzz to call the functions without any of the usual overhead of python, which makes this even faster.

from rapidfuzz import process

process.cdist(["Johnathan", "Jonathan"], ["Johnathan", "Jonathan"], scorer=jarowinkler_similarity)
array([[1.       , 0.9037037],
       [0.9037037, 1.       ]], dtype=float32)

👍 Contributing

PRs are welcome!

  • Found a bug? Report it in form of an issue or even better fix it!
  • Can make something faster? Great! Just avoid external dependencies and remember that existing functionality should still work.
  • Something else that do you think is good? Do it! Just make sure that CI passes and everything from the README is still applicable (interface, features, and so on).
  • Have no time to code? Tell your friends and subscribers about JaroWinkler. More users, more contributions, more amazing features.

Thank you :heart:

⚠️ License

Copyright 2021 - present maxbachmann. JaroWinkler is free and open-source software licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jarowinkler-1.0.0.tar.gz (75.3 kB view hashes)

Uploaded Source

Built Distributions

jarowinkler-1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (91.5 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (86.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (122.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (64.1 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

jarowinkler-1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (91.5 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (86.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (122.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (64.1 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

jarowinkler-1.0.0-cp310-cp310-win_amd64.whl (58.8 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

jarowinkler-1.0.0-cp310-cp310-win32.whl (67.0 kB view hashes)

Uploaded CPython 3.10 Windows x86

jarowinkler-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl (626.9 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

jarowinkler-1.0.0-cp310-cp310-musllinux_1_1_s390x.whl (683.3 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ s390x

jarowinkler-1.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl (668.8 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ppc64le

jarowinkler-1.0.0-cp310-cp310-musllinux_1_1_i686.whl (712.0 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

jarowinkler-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl (609.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

jarowinkler-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (103.2 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (101.0 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

jarowinkler-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (111.6 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

jarowinkler-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (96.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (133.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-cp310-cp310-macosx_11_0_arm64.whl (55.5 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

jarowinkler-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl (71.2 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

jarowinkler-1.0.0-cp310-cp310-macosx_10_9_universal2.whl (122.6 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

jarowinkler-1.0.0-cp39-cp39-win_amd64.whl (58.9 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

jarowinkler-1.0.0-cp39-cp39-win32.whl (67.3 kB view hashes)

Uploaded CPython 3.9 Windows x86

jarowinkler-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl (626.4 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

jarowinkler-1.0.0-cp39-cp39-musllinux_1_1_s390x.whl (685.3 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ s390x

jarowinkler-1.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl (667.3 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ppc64le

jarowinkler-1.0.0-cp39-cp39-musllinux_1_1_i686.whl (711.8 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

jarowinkler-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl (609.9 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

jarowinkler-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (103.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (100.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

jarowinkler-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (112.4 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

jarowinkler-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (97.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (133.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-cp39-cp39-macosx_11_0_arm64.whl (56.2 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

jarowinkler-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl (71.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

jarowinkler-1.0.0-cp39-cp39-macosx_10_9_universal2.whl (123.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

jarowinkler-1.0.0-cp38-cp38-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

jarowinkler-1.0.0-cp38-cp38-win32.whl (67.4 kB view hashes)

Uploaded CPython 3.8 Windows x86

jarowinkler-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl (626.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

jarowinkler-1.0.0-cp38-cp38-musllinux_1_1_s390x.whl (683.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ s390x

jarowinkler-1.0.0-cp38-cp38-musllinux_1_1_ppc64le.whl (669.1 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ppc64le

jarowinkler-1.0.0-cp38-cp38-musllinux_1_1_i686.whl (712.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

jarowinkler-1.0.0-cp38-cp38-musllinux_1_1_aarch64.whl (610.1 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

jarowinkler-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (103.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (101.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

jarowinkler-1.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (112.4 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

jarowinkler-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (97.3 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (133.8 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-cp38-cp38-macosx_11_0_arm64.whl (56.0 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

jarowinkler-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl (71.8 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

jarowinkler-1.0.0-cp38-cp38-macosx_10_9_universal2.whl (123.6 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

jarowinkler-1.0.0-cp37-cp37m-win_amd64.whl (59.4 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

jarowinkler-1.0.0-cp37-cp37m-win32.whl (67.5 kB view hashes)

Uploaded CPython 3.7m Windows x86

jarowinkler-1.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl (626.7 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

jarowinkler-1.0.0-cp37-cp37m-musllinux_1_1_s390x.whl (685.0 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ s390x

jarowinkler-1.0.0-cp37-cp37m-musllinux_1_1_ppc64le.whl (669.3 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ppc64le

jarowinkler-1.0.0-cp37-cp37m-musllinux_1_1_i686.whl (713.4 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

jarowinkler-1.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl (610.4 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ARM64

jarowinkler-1.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (102.9 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl (101.8 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ s390x

jarowinkler-1.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (111.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ppc64le

jarowinkler-1.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (97.5 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (134.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-cp37-cp37m-macosx_10_9_x86_64.whl (72.0 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

jarowinkler-1.0.0-cp36-cp36m-win_amd64.whl (57.8 kB view hashes)

Uploaded CPython 3.6m Windows x86-64

jarowinkler-1.0.0-cp36-cp36m-win32.whl (66.1 kB view hashes)

Uploaded CPython 3.6m Windows x86

jarowinkler-1.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl (624.0 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

jarowinkler-1.0.0-cp36-cp36m-musllinux_1_1_s390x.whl (685.4 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ s390x

jarowinkler-1.0.0-cp36-cp36m-musllinux_1_1_ppc64le.whl (665.1 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ppc64le

jarowinkler-1.0.0-cp36-cp36m-musllinux_1_1_i686.whl (708.7 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

jarowinkler-1.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl (607.1 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ARM64

jarowinkler-1.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (99.3 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

jarowinkler-1.0.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl (98.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ s390x

jarowinkler-1.0.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (107.4 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ppc64le

jarowinkler-1.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (94.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

jarowinkler-1.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (132.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

jarowinkler-1.0.0-cp36-cp36m-macosx_10_9_x86_64.whl (69.6 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page