Fast Word Mover's Distance

Calculates Word Mover's Distance as described in From Word Embeddings To Document Distances by Matt Kusner, Yu Sun, Nicholas Kolkin and Kilian Weinberger.
The high level logic is written in Python, the low level functions related to linear programming are offloaded to the bundled native extension. The native extension can be built as a generic shared library not related to Python at all. Python 2.7 and older are not supported. The heavy-lifting is done by google/or-tools.
Installation
pip3 install wmd
Tested on Linux and macOS.
Usage
You should have the embeddings numpy array and the nbow model - that is, every sample is a weighted set of items, and every item is embedded.
import numpy
from wmd import WMD
embeddings = numpy.array([[0.1, 1], [1, 0.1]], dtype=numpy.float32)
nbow = {"first": ("#1", [0, 1], numpy.array([1.5, 0.5], dtype=numpy.float32)),
"second": ("#2", [0, 1], numpy.array([0.75, 0.15], dtype=numpy.float32))}
calc = WMD(embeddings, nbow, vocabulary_min=2)
print(calc.nearest_neighbors("first"))
[('second', 0.10606599599123001)]
embeddings must support __getitem__ which returns an item by it's
identifier; particularly, numpy.ndarray matches that interface.
nbow must be iterable - returns sample identifiers - and support
__getitem__ by those identifiers which returns tuples of length 3.
The first element is the human-readable name of the sample, the
second is an iterable with item identifiers and the third is numpy.ndarray
with the corresponding weights. All numpy arrays must be float32. The return
format is the list of tuples with sample identifiers and relevancy
indices (lower the better).
It is possible to use this package with spaCy:
import spacy
import wmd
nlp = spacy.load('en_core_web_md')
nlp.add_pipe(wmd.WMD.SpacySimilarityHook(nlp), last=True)
doc1 = nlp("Politician speaks to the media in Illinois.")
doc2 = nlp("The president greets the press in Chicago.")
print(doc1.similarity(doc2))
Besides, see another example which finds similar Wikipedia pages.
Building from source
Either build it as a Python package:
pip3 install git+https://github.com/src-d/wmd-relax
or use CMake:
git clone --recursive https://github.com/src-d/wmd-relax
cmake -D CMAKE_BUILD_TYPE=Release .
make -j
Please note the --recursive flag for git clone. This project uses source{d}'s
fork of google/or-tools as the git submodule.
Tests
Tests are in test.py and use the stock unittest package.
Documentation
cd doc
make html
The files are in doc/doxyhtml and doc/html directories.
Contributions
...are welcome! See CONTRIBUTING and code of conduct.
License
README {#ignore_this_doxygen_anchor}
Metadata
Release files for wmd 1.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| wmd-1.3.2.tar.gz | 104.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wmd-1.3.2-cp37-cp37m-manylinux1_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | Linux glibc 2.5+ x86-64 | Details |
Total release size: 741.6 kB
Release files / wmd-1.3.2.tar.gz
| Download URL | wmd-1.3.2.tar.gz |
|---|---|
| Size | 104.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a85736214e2c8b7ad650727ab2d08f937c791fe48b1eb11e964a9aee9d79569f
|
|
BLAKE2b-256 checksum How to use checksums |
e514e1d122e56607ae49999041f372fa14166eb1e3b838122118d706f9bf1620
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.28.1 CPython/3.7.3
|
Release files / wmd-1.3.2-cp37-cp37m-manylinux1_x86_64.whl
| Download URL | wmd-1.3.2-cp37-cp37m-manylinux1_x86_64.whl |
|---|---|
| Size | 637.1 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
865054ad3404275858183f5f2ea1a0a2af70f1aea6565bd6849c51063cf6f9db
|
|
BLAKE2b-256 checksum How to use checksums |
6f6a57e4c9258402481bdb02c370cec1b67bd2981fb68eb6e141fbb3d461415f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.28.1 CPython/3.7.3
|
Security for wmd 1.3.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.