当前位置:   article > 正文

fuzzywuzzy计算文本相似度_fuzzy_wuzzy_wuzza_writer

fuzzy_wuzzy_wuzza_writer

简介

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

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

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

示例

from fuzzywuzzy import fuzz

# 调用fuzz.ratio即可计算两个字符串之间的相似度
print(fuzz.ratio("古明地觉", "古明地恋"))  # 75

# 我们看到ratio是完全匹配的,它把字符串的长度也考虑在内了
print(fuzz.ratio("古明地觉", "古明地觉aa"))  # 80

# partial_ratio是非完全匹配,如果一方结束了,那么剩下的就不考虑了
print(fuzz.partial_ratio("古明地觉", "古明地觉也叫小五萝莉"))  # 100

# token_sort_ratio表示忽略顺序匹配,但前提是多个词,以空格进行分隔。所以明显是针对英文的
print(fuzz.ratio("古 明 地 觉", "古 明 地 觉"[:: -1]))  # 25
print(fuzz.token_sort_ratio("古 明 地 觉", "古 明 地 觉"[:: -1]))  # 100

# token_set_ratio表示去重匹配,同样:前提是多个词,以空格进行分隔
print(fuzz.ratio("a a a he", "a he"))  # 67
print(fuzz.token_set_ratio("a a a he", "a he"))  # 100


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

其他函数

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

from fuzzywuzzy import process

words = ["hello python", "hello java", "hello golang", "hello php"]
# 会自动和words里面的每一个元素进行比较,然后按照相似度从高到低排列
print(process.extract("hello thon", words))
# [('hello python', 91), ('hello php', 74), ('hello golang', 73), ('hello java', 64)]

# 还可以传入一个limit参数,表示只返回前limit个,默认为5
print(process.extract("hello thon", words, limit=2))  # [('hello python', 91), ('hello php', 74)]

# 返回分数最高的
print(process.extractOne("hello thon", words))  # ('hello python', 91)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

加速

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

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

可以通过pip install python-Levenshtein 解决

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

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

参考

相似度比较http服务

from flask import Flask, jsonify, request
from flask_cors import CORS
from fuzzywuzzy import fuzz


app = Flask(__name__)
CORS(app)


@app.route('/', methods=['GET', 'POST'])
def similar():
    text1 = request.args.get("text1")
    text2 = request.args.get("text2")
    print(request.method, text1, text2)

    ratio = fuzz.token_set_ratio(text1, text2)
    return jsonify(ratio=ratio)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/424172
推荐阅读
相关标签
  

闽ICP备14008679号