跳转到主要内容

在两个序列之间找到最佳匹配元素对

项目描述

模糊序列匹配器

https://img.shields.io/pypi/v/fuzzy_sequence_matcher.svg https://img.shields.io/travis/catherinedevlin/fuzzy_sequence_matcher.svg Documentation Status

目的

在两个序列之间找到最佳匹配元素对。

每个元素最多只能使用一次,并且元素的顺序被保留。也就是说,如果X1 -> Y2,则X2不能匹配到Y1或Y2;它必须匹配到Y3或更高。这对于Y是X的杂乱或突变副本的序列是合适的。

示例

>>> from fuzzy_sequence_matcher.fuzzy_sequence_matcher import best_matches
>>> from jellyfish import jaro_distance
>>> declaration = "We hold these truths to be self evident".split()
>>> degradation = ("I guess wee hold them tooths and stuff "
...     "for being sort of evidence, y'know?").split()
>>> best_matches(declaration, degradation, scorer=jaro_distance)
[('We', 'wee'), ('hold', 'hold'), ('these', 'them'), ('truths', 'tooths'), ('to', 'for'), ('be', 'being'), ('self', 'sort'), ('evident', 'evidence,')]

功能

  • 匹配任何您可以为其编写评分函数的对象

  • 无外部依赖项(仅标准库)

评分函数

匹配是通过您指定的评分函数完成的。它看起来可能像

def score(element_from_seq1: Any, element_from_seq2: Any) -> float

高分数表示更好的匹配。

对于比较字符串,您可能使用 jellyfish.jaro_distance。对于比较数字,-abs(n1 - n2) 工作。

阈值

默认情况下,fuzzy_sequence_matcher找到所有配对的总分数之和最大的组合。但是,当一个序列比另一个序列长得多时,可能组合的数量会变得不切实际地大,以至于尝试所有这些组合。Python itertools 文档给出当 len(Y) >= len(X) 时的组合数如下

len(Y)! / len(X)! / (len(Y) - len(X))!

when len(Y) >= len(X).

此函数作为 fuzzy_sequence_matcher.n_combinations 公开。

如果可能的组合数量超过阈值(默认为1_000_000),这通常发生在长序列比短序列长15个或更多元素时,则将完全排除较长序列的元素,从与较短序列最佳匹配但最差的元素开始,直到n_combinations低于阈值。这可能导致的结果不是理想得分的匹配集。

致谢

此包是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板创建的。

感谢Dayton Dynamic Languages提供建议和头脑风暴

历史

0.1.0 (2019-12-14)

  • 首次发布在PyPI上。

0.1.1 (2019-12-26)

  • 允许处理参数不同的评分器。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

fuzzy_sequence_matcher-0.1.1.tar.gz (13.7 kB 查看哈希)

上传时间

构建分布

fuzzy_sequence_matcher-0.1.1-py2.py3-none-any.whl (6.5 kB 查看哈希)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面