textdistance
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
未说明

快速开始
文本距离

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]"
支持扩展的算法包括:DamerauLevenshtein、Hamming、Jaro、JaroWinkler、Levenshtein。
开发版
通过 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]"
使用方法
所有算法均提供两种接口:
- 带有算法特有参数的类,用于自定义配置。
- 具有默认参数的类实例,适合快速简便的使用场景。
所有算法都具有一些通用方法:
.distance(*sequences)-- 计算序列之间的距离。.similarity(*sequences)-- 计算序列之间的相似度。.maximum(*sequences)-- 距离与相似度的最大可能值。对于任意序列,均有distance + similarity == maximum。.normalized_distance(*sequences)-- 归一化后的序列间距离。返回值为 0 到 1 之间的浮点数,其中 0 表示完全相同,1 表示完全不同。.normalized_similarity(*sequences)-- 归一化后的序列间相似度。返回值为 0 到 1 之间的浮点数,其中 0 表示完全不同,1 表示完全相同。
最常见的初始化参数:
qval-- 用于将序列分割成 q-gram 的 q 值。可选值:- 1(默认)-- 按字符比较序列。
- 2 或更高 -- 将序列转换为 q-gram。
- None -- 按单词分割序列。
as_set-- 适用于基于标记的算法:- True --
t和ttt视为相等。 - False(默认)--
t和ttt视为不同。
- True --
示例
以 汉明距离 为例:
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
支持的库包括:
支持的算法:
- DamerauLevenshtein
- Hamming
- Jaro
- JaroWinkler
- 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/164.6.22024/04/244.6.12023/12/294.6.02023/09/284.5.02022/09/184.4.02022/08/214.3.02022/06/29v.4.2.12021/01/29v.4.2.02020/04/13v.4.1.52019/10/03v4.1.02019/03/093.0.02018/03/312.0.12018/02/10相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
Deep-Live-Cam
Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。