A small package that enables super-fast TF-IDF based string matching.
Project description
tfidf_matcher
is a package for fuzzymatching large datasets together. Most fuzzy
matching libraries like fuzzywuzzy
get great results, but perform very poorly
due to their O(n2) complexity.
How does it work?
This package provides two functions:
ngrams()
: Simple ngram generator.matcher()
: Matches a list of strings against a reference corpus. Does this by:- Vectorizing the reference corpus using TF-IDF into a term-document matrix.
- Fitting a K-NearestNeighbours model to the sparse matrix.
- Vectorizing the list of strings to be matched and passing it in to the KNN
model to calculate the cosine distance (the OOTB
cosine_similarity
function in sklearn is very memory-inefficient for our use case). - Some data manipulation to emit
k_matches
closest matches.
Yeah ok, but how do I use it?
Define two lists; your original list (list you want matches for) and your
lookup list (list you want to match against). Typically your lookup list will
be much longer than your original list. Pass them into the matcher
function
along with the number of matches you want to display from the lookup list
using the k_matches
argument. The result will be a pandas DataFrame containing
1 row per item in your original list, along with `kmatches` columns
containing the closest match from the lookup list, and a match score for the
closest match (which is 1 - the cosine distance between the matches normalised
to [0,1])
Simply import with import tfidf_matcher as tm
, and call the matcher function
with tm.matcher()
.
Strengths and Weaknesses
- Quick. Very quick.
- Can emit however many closest matches you want. I found that 3 worked best.
- Not very well tested so potentially unstable results. Worked well for 640 company names matched against a lookup corpus of >700,000 company names.
- It’s pretty complicated to get to grips with the method if you wanted to apply
it in different ways. The underlying algorithms are pretty hard to reason
about when you jump to the definition of, say,
TfidfVectorizer
from sklearn. I just about understand the method, which I adapted from this blog post by Josh Taylor, which itself was adapted from another blog post.
Who do I thank?
As above, credit for the method goes to Josh Taylor and van den Blog. I wanted to adapt the methods to work nicely on a company mathcing problem I was having, and decided to build out my resultant code into a package for two reasons:
- Package building experience.
- Utility for future projects which may require large-domain fuzzy matching.
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
Built Distribution
Hashes for tfidf_matcher-0.2.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b39564b8ec0b3f0bb4bae5b275b3bab92e6770fa7459be43fb828416f772a048 |
|
MD5 | 1e371ef865c1fc70145e53848303d785 |
|
BLAKE2b-256 | 338ec0546fe276165cdf868dd38ce17eb1437e306545c392a455fec0f08ee7a1 |