fuzzywuzzy计算文本相似度

清疚 2022-09-09 09:55 269阅读 0赞

目录

    • 简介
    • 示例
    • 其他函数
    • 加速
    • 相似度比较http服务

简介

fuzzywuzzy 是用来计算两个字符串之间的相似度的,它是依据Levenshtein Distance算法来进行计算的。

Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。

许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
一般来说,编辑距离越小,两个串的相似度越高。

示例

  1. from fuzzywuzzy import fuzz
  2. # 调用fuzz.ratio即可计算两个字符串之间的相似度
  3. print(fuzz.ratio("古明地觉", "古明地恋")) # 75
  4. # 我们看到ratio是完全匹配的,它把字符串的长度也考虑在内了
  5. print(fuzz.ratio("古明地觉", "古明地觉aa")) # 80
  6. # partial_ratio是非完全匹配,如果一方结束了,那么剩下的就不考虑了
  7. print(fuzz.partial_ratio("古明地觉", "古明地觉也叫小五萝莉")) # 100
  8. # token_sort_ratio表示忽略顺序匹配,但前提是多个词,以空格进行分隔。所以明显是针对英文的
  9. print(fuzz.ratio("古 明 地 觉", "古 明 地 觉"[:: -1])) # 25
  10. print(fuzz.token_sort_ratio("古 明 地 觉", "古 明 地 觉"[:: -1])) # 100
  11. # token_set_ratio表示去重匹配,同样:前提是多个词,以空格进行分隔
  12. print(fuzz.ratio("a a a he", "a he")) # 67
  13. print(fuzz.token_set_ratio("a a a he", "a he")) # 100

其他函数

fuzzywuzzy 模块还提供了一个 extract 函数。

  1. from fuzzywuzzy import process
  2. words = ["hello python", "hello java", "hello golang", "hello php"]
  3. # 会自动和words里面的每一个元素进行比较,然后按照相似度从高到低排列
  4. print(process.extract("hello thon", words))
  5. # [('hello python', 91), ('hello php', 74), ('hello golang', 73), ('hello java', 64)]
  6. # 还可以传入一个limit参数,表示只返回前limit个,默认为5
  7. print(process.extract("hello thon", words, limit=2)) # [('hello python', 91), ('hello php', 74)]
  8. # 返回分数最高的
  9. print(process.extractOne("hello thon", words)) # ('hello python', 91)

加速

另外使用fuzzywuzzy这个模块的时候,若弹出警告:

  1. UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning

可以通过pip install python-Levenshtein 解决

python-Levenshtein是一个用于加速字符串匹配的库,可提供 4 到 10 倍的加速

当然即使没有这个库也是可以的, fuzzywuzzy 底层默认会使用 Python 的标准库difflib进行匹配,只是会弹出警告罢了。

参考

相似度比较http服务

  1. from flask import Flask, jsonify, request
  2. from flask_cors import CORS
  3. from fuzzywuzzy import fuzz
  4. app = Flask(__name__)
  5. CORS(app)
  6. @app.route('/', methods=['GET', 'POST'])
  7. def similar():
  8. text1 = request.args.get("text1")
  9. text2 = request.args.get("text2")
  10. print(request.method, text1, text2)
  11. ratio = fuzz.token_set_ratio(text1, text2)
  12. return jsonify(ratio=ratio)
  13. if __name__ == '__main__':
  14. app.run(host='0.0.0.0', port=5000, debug=True)

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 用java计算文本相似

    遇到这样一个需求,需要计算两个文本内容的相似度,以前也接触过,下面列举几种方式,也是我在网上查了很多内容整理的,直接上代码,供大家参考,如果你也有这样的需求,希望能帮到你: