textcompare 并非真实存在的 composer 包,应通过 packagist 搜索 similarity 等关键词,筛选更新及时、下载量高、配置完善的包;php 原生 similar_text() 适合简单场景,但需注意中文编码处理;中文匹配推荐 xiaobeicn/text-similarity-php;预处理(清洗、归一化)比算法选择更重要。

TextCompare 并不是 Composer 官方仓库中真实存在的包名——目前 Packagist 上没有维护良好、广泛使用的 textcompare 包。直接运行 composer require textcompare 会报错:Could not find package textcompare。
你真正需要的,是根据场景选对工具,而不是硬套一个不存在的包名。
怎么确认一个 PHP 文本相似度包是否可用?
别信标题党,先去 Packagist 搜关键词,比如 similarity、levenshtein、cosine。重点看三点:
- 最后更新时间(超过 2 年没维护的基本不建议用)
- 下载量(周下载 >500 的相对靠谱)
- 是否有
autoload配置和清晰的README.md
例如 rap2hpoutre/similar-text-finder 就符合这三条,而 textcompare 在 Packagist 搜索结果为空。
计算两个字符串的相似度,用哪个函数最稳?
PHP 原生就带 similar_text(),不用装任何包,适合简单场景:
- 输入两个字符串,返回相同字符数(不是百分比)
- 加第三个参数可获取相似度百分比:
similar_text($a, $b, $percent) - 注意:它按字符逐个比对,对中文支持弱(会把 UTF-8 多字节当乱码拆开)
- 如果要处理中文,必须先用
mb_convert_encoding($str, 'UTF-8', 'auto')统一编码
示例:
$a = '今天天气很好'; $b = '今天阳光明媚'; similar_text($a, $b, $p); echo round($p, 2); // 输出约 50.0
想找最像的候选文本?用 similar-text-finder
这是目前最轻量、文档最清楚的候选匹配方案,安装和调用都干净:
- 安装:
composer require rap2hpoutre/similar-text-finder - 使用前确保
$haystack是数组,$needle是字符串,且不含 null 或非字符串元素 - 默认用
levenshtein()算法,对拼写纠错友好;如需语义级匹配(比如“苹果”≈“水果”),这个包做不到 - 结果排序依赖内部实现,不保证严格按编辑距离升序,但
first()返回的确实是最高分项
常见翻车点:
- 传入空数组 → 抛
InvalidArgumentException - 候选文本含 HTML 标签或换行符 → 先用
strip_tags()和trim()清洗 - 中文短句匹配不准 → 改用
xiaobeicn/text-similarity-php(基于 TF-IDF + 余弦)
为什么不能只靠算法,还得预处理?
相似度数值本身没意义,关键在输入质量。同一组文本,不同清洗方式结果可能差 40% 以上:
- 统一全角/半角(如“ABC”→“ABC”)
- 过滤停用词(“的”、“了”、“在”等)对长文本影响大
- 小写转换(
strtolower())对英文必要,对中文无效但无害 - 正则清理多余空白:
preg_replace('/\s+/', ' ', $text)
漏掉任意一步,similar_text() 或 Finder 都可能把“测试 123”和“测试123”判为低相似。











