Skip to main content

expected-levenshtein

Python application License

This repository contains empirically determined approximate expected Levenshtein distances between random strings over alphabets of different sizes, as well as simple python code to generate them.

Dependencies

To use the code, you will need numpy and numba.

Installing

Simply clone this repo:

git clone https://github.com/nickmachnik/expected-levenshtein.git [TARGET DIR]

and then install via pip

pip install [TARGET DIR]

or install directly from PyPI (this won't include unreleased changes as specified in the changelog):

pip install expected-levenshtein

Testing

Test the cloned package:

cd [TARGET DIR]
python -m unittest

Geting started

Use precomputed models

This package comes with precomputed models for certain alphabet sizes k and string lengths n. Currently the following models are available:

  • k = 20, 25 ≤ n ≤ 6000

Note: A model for a specific value of n only fits values for m (the length of the second string) such that m ≤ n.

The following example shows how a models can be loaded and used to compute the expected levenshtein distances for k = 20, n = 5000:

import expected_levenshtein.fit as efit
import numpy as np

# load all models for k = 20
row_indices, coefficients, mean_squared_deviations = efit.load_precomputed(20)

# get the specific model for n = 5000. Here we consider an index row offset.
coeff_5k = coefficients[5000 - row_indices[0]]

# predict expected distance for n=5000, m=876
single_distance = efit.poly(876, coeff_5k)

# predict expected distances for n=5000, m ≤ 5000
range_distances = efit.poly(np.arange(5000), coeff_5k)

Computing average levenshtein distances

To compute the approximate expected Levenshtein distances of random strings of lengths 1 ≤ lengths ≤ n, use random_average_levenshtein in sample.py.

This example shows how to compute the distances of random strings up to length 100 over a 4-letter alphabet, averaged over 1000 replicates.

from sample import random_average_levenshtein
import numpy as np

random_average_levenshtein(100, 1000, np.arange(4))

Generating models for expected distances

For long sequences, the distance matrix returned by random_average_levenshtein can get quite large. If you prefer not to load and query a large matrix object every time you need an expected distance, fit.model_average_levenshtein generates a polynomial model for each row in the distance matrix. That way, the information that needs to be stored to compute approximate expected levenshtein distances is reduced to the coefficients of the polynomials. Once computed, these can be used to predict expected distances with fit.poly.

This example shows how to generate and use such models for random strings from length 25 to length 50.

from sample import random_average_levenshtein
from fit import poly, model_average_levenshtein
import numpy as np

# sample distances
average_distances = random_average_levenshtein(50, 1000, np.arange(4))

# make models
row_indices, coefficients, mean_squared_deviations = model_average_levenshtein(
    average_distances, model_rows=np.arange(25, 51))

# predict expected distance for n=50, m=44
coeff_n_50 = coefficients[-1]
predicted_expected_distance = poly(44, coeff_n_50)

License

MIT license (LICENSE or https://opensource.org/licenses/MIT)

Metadata

Release files for expected-levenshtein 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for expected-levenshtein 0.1.2
File Size Uploaded
expected-levenshtein-0.1.2.tar.gz 402.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for expected-levenshtein 0.1.2
File Interpreter ABI Platform
expected_levenshtein-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 800.4 kB

Release files / expected-levenshtein-0.1.2.tar.gz

Download URL expected-levenshtein-0.1.2.tar.gz
Size 402.2 kB
Tags Source
SHA-256 checksum
How to use checksums
12f2f9a93775e88d9dea9646d512eb335d0f765402b20bb95a25c9e71fb048f7
BLAKE2b-256 checksum
How to use checksums
6331a626279db8b0cf8af00390c4c5fd4b5d32017b0f784481b6e85891c6f400
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.3

Release files / expected_levenshtein-0.1.2-py3-none-any.whl

Download URL expected_levenshtein-0.1.2-py3-none-any.whl
Size 398.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7706399088192cb3f7db45bc73d437da93e238c279d30c925a0dcb2a469040ca
BLAKE2b-256 checksum
How to use checksums
1cb04ee90921e84f57a6c5eb8585eea52dee68303b0df36edd4d5b6e01d2ed02
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.3

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page