textdistance

GitHub
3.5k 257 非常简单 1 次阅读 5天前MIT图像
AI 解读 由 AI 自动生成,仅供参考

TextDistance 是一款专为 Python 开发者打造的文本序列距离计算库,旨在帮助用户量化两个或多个字符串之间的相似度与差异。在数据清洗、模糊匹配、拼写纠错及生物信息学分析等场景中,如何准确衡量文本间的“距离”往往是个难题,而 TextDistance 通过提供统一的调用接口,轻松解决了这一痛点。

该库最大的亮点在于其丰富的算法储备,内置了超过 30 种经典算法,涵盖基于编辑距离(如莱文斯坦、Jaro-Winkler)、基于令牌(如 Jaccard、余弦相似度)以及基于序列比对(如 Smith-Waterman)等多种策略。它不仅支持纯 Python 实现,确保环境部署简单无忧,还可选配 NumPy 以提升大规模计算时的运行速度。此外,TextDistance 突破了传统库仅能对比两个序列的限制,支持同时比较多个序列,且部分算法在同一个类中提供了多种实现方式,灵活性极高。

无论是需要快速原型验证的软件工程师,还是从事自然语言处理或基因序列研究的数据科学家,TextDistance 都能成为你手中高效、可靠的得力助手,让复杂的文本对比工作变得简单直观。

使用场景

某电商公司的数据团队正在清洗来自不同渠道的用户评论,需要将新收到的评论与数据库中的历史差评进行匹配,以自动识别重复投诉或恶意刷单行为。

没有 textdistance 时

  • 开发人员需手动查找并分别安装多个独立的算法库(如专门计算 Levenshtein 或 Jaro-Winkler 的包),导致依赖管理混乱且环境臃肿。
  • 面对“拼写错误”、“词序颠倒”或“部分重合”等不同噪声场景,难以快速切换算法验证哪种相似度计算最准确,试错成本极高。
  • 代码中充斥着各异的函数调用方式,缺乏统一接口,使得批量对比成千上万条评论的逻辑复杂且难以维护。
  • 纯 Python 实现的处理速度在大数据量下成为瓶颈,而引入 NumPy 加速往往需要重写大量底层逻辑。

使用 textdistance 后

  • 仅需安装一个库即可调用 30 多种算法(从编辑距离到余弦相似度),极大简化了项目依赖和环境配置。
  • 通过统一的接口轻松切换 Hamming、Levenshtein 或 Monge-Elkan 等算法,迅速找到最适合中文评论模糊匹配的策略。
  • 利用其支持多序列对比的特性,用简洁的代码一次性将新评论与历史库进行高效比对,显著提升了开发效率。
  • 按需启用可选的 NumPy 后端支持,在不修改业务逻辑的前提下,将大规模文本距离计算的吞吐量提升数倍。

textdistance 通过提供统一、多样且高效的算法接口,让复杂的文本相似度分析变得像调用标准数学函数一样简单快捷。

运行环境要求

操作系统
  • 未说明
GPU

不需要 GPU

内存

未说明

依赖
notes该库为纯 Python 实现,无需特殊硬件。默认安装仅包含纯 Python 代码,速度较慢;建议通过 'pip install textdistance[extras]' 安装可选依赖以调用外部 C/C++ 库获得最大速度。部分算法(如基于压缩的距离)依赖系统自带的压缩工具(如 bz2, lzma, zlib)。
python未说明
numpy (可选,用于加速)
jellyfish (可选,外部加速库)
py_stringmatching (可选,外部加速库)
pylev (可选,外部加速库)
Levenshtein (可选,外部加速库)
pyxDamerauLevenshtein (可选,外部加速库)
rapidfuzz (基准测试中提到的高性能替代库)
textdistance hero image

快速开始

文本距离

TextDistance logo

构建状态 PyPI版本 状态 许可证

TextDistance —— 一个用于通过多种算法比较两个或多个序列之间距离的 Python 库。

特性:

  • 30 多种算法
  • 纯 Python 实现
  • 使用简单
  • 支持多于两个序列的比较
  • 部分算法在一个类中提供多种实现
  • 可选使用 NumPy 以获得最大速度。

算法

基于编辑距离

算法 函数
汉明距离 Hamming hamming
MLIPNS MLIPNS mlipns
莱文斯坦距离 Levenshtein levenshtein
达默劳-莱文斯坦距离 DamerauLevenshtein damerau_levenshtein
贾罗-温克勒距离 JaroWinkler jaro_winkler, jaro
Strcmp95 StrCmp95 strcmp95
尼德尔曼-温施算法 NeedlemanWunsch needleman_wunsch
后藤算法 Gotoh gotoh
史密斯-沃特曼算法 SmithWaterman smith_waterman

基于标记

算法 函数
雅卡尔指数 Jaccard jaccard
索伦森-戴斯系数 Sorensen sorensen, sorensen_dice, dice
特弗斯基指数 Tversky tversky
重叠系数 Overlap overlap
塔尼莫托距离 Tanimoto tanimoto
余弦相似度 Cosine cosine
蒙格-埃尔坎 MongeElkan monge_elkan
袋距离 Bag bag

基于序列

算法 函数
最长公共子序列相似度 LCSSeq lcsseq
最长公共子串相似度 LCSStr lcsstr
拉特克利夫-奥伯斯赫普相似度 RatcliffObershelp ratcliff_obershelp

基于压缩

归一化压缩距离 使用不同的压缩算法。

经典压缩算法:

算法 函数
算术编码 ArithNCD arith_ncd
游程编码 RLENCD rle_ncd
BWT 游程编码 BWTRLENCD bwtrle_ncd

普通压缩算法:

算法 函数
平方根 SqrtNCD sqrt_ncd
EntropyNCD entropy_ncd

正在进行中的算法,将两个字符串视为位数组进行比较:

算法 函数
BZ2 BZ2NCD bz2_ncd
LZMA LZMANCD lzma_ncd
ZLib ZLIBNCD zlib_ncd

更多关于 NCD 的详细信息,请参阅 博客文章

音韵学

算法 函数
MRA MRA mra
Editex Editex editex

简单

算法 函数
前缀相似度 Prefix prefix
后缀相似度 Postfix postfix
长度距离 Length length
身份相似度 Identity identity
矩阵相似度 Matrix matrix

安装

稳定版

仅使用纯 Python 实现:

pip install textdistance

若需借助额外库以获得最佳性能:

pip install "textdistance[extras]"

若需所有依赖库(用于基准测试运行测试):

pip install "textdistance[benchmark]"

若仅需特定算法的扩展包:

pip install "textdistance[Hamming]"

支持扩展的算法包括:DamerauLevenshteinHammingJaroJaroWinklerLevenshtein

开发版

通过 pip 安装:

pip install -e git+https://github.com/life4/textdistance.git#egg=textdistance

或者克隆仓库并安装包含部分扩展的版本:

git clone https://github.com/life4/textdistance.git
pip install -e ".[benchmark]"

使用方法

所有算法均提供两种接口:

  1. 带有算法特有参数的类,用于自定义配置。
  2. 具有默认参数的类实例,适合快速简便的使用场景。

所有算法都具有一些通用方法:

  1. .distance(*sequences) -- 计算序列之间的距离。
  2. .similarity(*sequences) -- 计算序列之间的相似度。
  3. .maximum(*sequences) -- 距离与相似度的最大可能值。对于任意序列,均有 distance + similarity == maximum
  4. .normalized_distance(*sequences) -- 归一化后的序列间距离。返回值为 0 到 1 之间的浮点数,其中 0 表示完全相同,1 表示完全不同。
  5. .normalized_similarity(*sequences) -- 归一化后的序列间相似度。返回值为 0 到 1 之间的浮点数,其中 0 表示完全不同,1 表示完全相同。

最常见的初始化参数:

  1. qval -- 用于将序列分割成 q-gram 的 q 值。可选值:
    • 1(默认)-- 按字符比较序列。
    • 2 或更高 -- 将序列转换为 q-gram。
    • None -- 按单词分割序列。
  2. as_set -- 适用于基于标记的算法:
    • True -- tttt 视为相等。
    • False(默认)-- tttt 视为不同。

示例

汉明距离 为例:

import textdistance

textdistance.hamming('test', 'text')
# 1

textdistance.hamming.distance('test', 'text')
# 1

textdistance.hamming.similarity('test', 'text')
# 3

textdistance.hamming.normalized_distance('test', 'text')
# 0.25

textdistance.hamming.normalized_similarity('test', 'text')
# 0.75

textdistance.Hamming(qval=2).distance('test', 'text')
# 2

其他算法也具有相同的接口。

文章

以下是一些介绍如何在实际中使用 textdistance 的文章:

额外库

对于主要算法,textdistance 会优先尝试调用已知的外部库(按速度从快到慢排序),前提是这些库已安装在您的系统中且适用(即该实现可以处理当前类型的序列)。请通过安装带扩展的 textdistance 来启用此功能。

您也可以通过在初始化时传入 external=False 参数来禁用此功能:

import textdistance
hamming = textdistance.Hamming(external=False)
hamming('text', 'testit')
# 3

支持的库包括:

  1. jellyfish
  2. py_stringmatching
  3. pylev
  4. Levenshtein
  5. pyxDamerauLevenshtein

支持的算法:

  1. DamerauLevenshtein
  2. Hamming
  3. Jaro
  4. JaroWinkler
  5. Levenshtein

基准测试

未安装扩展时的结果如下:

算法 时间
DamerauLevenshtein rapidfuzz 0.00312
DamerauLevenshtein jellyfish 0.00591
DamerauLevenshtein pyxdameraulevenshtein 0.03335
DamerauLevenshtein textdistance 0.83524
Hamming Levenshtein 0.00038
Hamming rapidfuzz 0.00044
Hamming jellyfish 0.00091
Hamming textdistance 0.03531
Jaro rapidfuzz 0.00092
Jaro jellyfish 0.00191
Jaro textdistance 0.07365
JaroWinkler rapidfuzz 0.00094
JaroWinkler jellyfish 0.00195
JaroWinkler textdistance 0.07501
Levenshtein rapidfuzz 0.00099
Levenshtein Levenshtein 0.00122
Levenshtein jellyfish 0.00254
Levenshtein pylev 0.15688
Levenshtein textdistance 0.53902

总计:24 个库。

确实很慢。请仅在安装了扩展的情况下将 TextDistance 用于生产环境。

Textdistance 会根据基准测试结果优化算法,并优先调用最快的外部库(如果可行)。

您也可以在本地手动运行基准测试:

pip install textdistance[benchmark]
python3 -m textdistance.benchmark

Textdistance 会显示针对您系统的基准测试结果表,并将库的优先级保存到 Textdistance 文件夹中的 libraries.json 文件中。此文件将用于选择最快的算法实现。默认的 libraries.json 已包含在软件包中。

运行测试

您只需要 task 工具即可。有关可用命令列表,请参阅 Taskfile.yml。例如,要运行包含第三方库的测试,可以执行 task pytest-external:run

贡献

欢迎提交 PR!

  • 发现了 bug?请修复它!
  • 想添加更多算法?当然可以!只需确保新算法与库中现有算法采用相同的接口,并编写相应的测试用例。
  • 能让某些功能更快吗?太好了!请尽量避免引入外部依赖,并记住所有功能不仅应适用于字符串。
  • 还有其他您认为有益的想法吗?尽管去做吧!只要确保 CI 测试通过,并且 README 中的所有内容仍然适用(接口、特性等)。
  • 没时间写代码?那就告诉您的朋友和关注者关于 textdistance 吧!用户越多,贡献越多,就越能带来更多令人惊叹的功能。

感谢您的支持 :heart:

版本历史

4.6.32024/07/16
4.6.22024/04/24
4.6.12023/12/29
4.6.02023/09/28
4.5.02022/09/18
4.4.02022/08/21
4.3.02022/06/29
v.4.2.12021/01/29
v.4.2.02020/04/13
v.4.1.52019/10/03
v4.1.02019/03/09
3.0.02018/03/31
2.0.12018/02/10

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

109.2k|★★☆☆☆|今天
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|1周前
语言模型图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|1周前
开发框架图像Agent