在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术。换句话说,字符串模糊匹配是一种搜索,即使用户拼错单词或只输入部分单词进行搜索,也能够找到匹配项。因此,它也被称为字符串近似匹配。

字符串模糊搜索可用于各种应用程序,例如:

拼写检查和拼写错误,拼写错误纠正程序。例如,用户在Google中键入“Missisaga”,将返回文字为“Showing results for mississauga”的点击列表。也就是说,即使用户输入缺少字符、有多余的字符或者有其他类型的拼写错误,搜索查询也会返回结果。

可以使用软件检查重复的记录。例如,如果客户由于他们的名称拼写不同(例如Abigail Martin和Abigail Martinez)(也可能由于错误输入电话号码)在数据库中被多次列出了不同的购买行为,那么就会出现一个新地址。

重复数据删除技术,它可不像听起来那么容易,尤其是如果你有数十万条记录的话。即便是Expedia也没法100%正确:

这篇文章将解释字符串模糊匹配及其用例,并使用Python中Fuzzywuzzy库给出示例。

每个酒店都有自己的命名方法来命名它的房间,在线旅行社(OTA)也是如此。例如,同一家酒店的一间客房Expedia将之称为“Studio, 1 King Bed with Sofa Bed, Corner”,Booking.com(缤客)则简单地将其显示为“Corner King Studio”。

不能说有谁错了,但是当我们想要比较OTA之间的房价时,或者一个OTA希望确保另一个OTA遵循费率平价协议时(rate parity agreement),这可能会导致混乱。换句话说,为了能够比较价格,我们必须确保我们进行比较的东西是同一类型的。

对于价格比较网站和应用程序来说,最令人头条的问题之一就是试图弄清楚两个项目(比如酒店房间)是否是同一事物。

FuzzyWuzzy

Fuzzywuzzy是一个Python库,使用编辑距离(Levenshtein Distance)来计算序列之间的差异。

为了演示,我创建了自己的数据集,也就是说,对于同一酒店物业,我从Expedia拿一个房间类型,比如说“Suite, 1 King Bed (Parlor)”,然后我将它与Booking.com中的同类型房间匹配,即“King Parlor Suite”。只要有一点经验,大多数人都会知道他们是一样的。按照这种方法,我创建了一个包含100多对房间类型的小数据集,可以访问Github下载。

GitHub:https://github.com/susanli2016/NLP-with-Python/blob/master/room_type.csv

我们使用这个数据集测试Fuzzywuzzy的做法。换句话说,我们使用Fuzzywuzzy来匹配两个数据源之间的记录。

import pandas as pd

df = pd.read_csv('room_type.csv')

df.head(10)

数据集是我自己创建的,非常干净无需清理。

有几种方法可以比较Fuzzywuzzy中的两个字符串,让我们一个一个地进行尝试。

ratio ,按顺序比较整个字符串的相似度。

from fuzzywuzzy import fuzz

fuzz.ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

62

它告诉我们“Deluxe Room, 1 King Bed”和“Deluxe King Room”的相似度约62%。

fuzz.ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')

69

“Traditional Double Room, 2 Double Beds”和“Double Room with Two Double Beds”的相似度约69%。

fuzz.ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

74

“Room, 2 Double Beds (19th to 25th Floors)”和“Two Double Beds — Location Room (19th to 25th Floors)”相似度约74%。

显然效果不怎么样。事实证明,简单的方法对于词序,缺失或多余词语以及其他类似问题的微小差异太过敏感。

partial_ratio,比较部分字符串的相似度。

我们仍在使用相同的数据对。

fuzz.partial_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

69

fuzz.partial_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')

83

fuzz.partial_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

63

对于我的数据集来说,比较部分字符串并不能带来更好的整体效果。让我们尝试下一个。

token_sort_ratio,忽略单词顺序。

fuzz.token_sort_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

84

fuzz.token_sort_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')

78

fuzz.token_sort_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

83

这是迄今为止最好的。

token_set_ratio,忽略重复的单词。它与token_sort_ratio类似,但更加灵活。

fuzz.token_set_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

100

fuzz.token_set_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')

78

fuzz.token_set_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

97

看来token_set_ratio最适合我的数据。根据这一发现,我决定将token_set_ratio应用到我的整个数据集。

def get_ratio(row):

name = row['Expedia']

name1 = row['Booking.com']

return fuzz.token_set_ratio(name, name1)

len(df[df.apply(get_ratio, axis=1) > 70]) / len(df)

0.9029126213592233

当设定相似度> 70时,超过90%的房间对超过这个匹配分数。还很不错!

Github:https://github.com/susanli2016/NLP-with-Python/blob/master/Fuzzy%20String%20Matching.ipynb

python字符串模糊匹配_NLP教程:用Fuzzywuzzy进行字符串模糊匹配相关推荐

  1. python 字符串 数字_Python基础教程:数字、字符串

    Python 数字 Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 以下实例在变量赋值时数字对象将被创建: var1 = 1 ...

  2. Swift3.0语言教程比较、判断字符串

    Swift3.0语言教程比较.判断字符串 Swift3.0语言教程比较.判断字符串,在一个程序中字符串很多时,常常会做的操作就是对这些字符串进行比较和判断.本小节将讲解这些内容. 1.不区分大小写比较 ...

  3. 原 python实现模糊匹配_使用python中的fuzzywuzzy库进行模糊匹配实例

    fuzzywuzzy库是Python中的模糊匹配库,它依据 Levenshtein Distance 算法 计算两个序列之间的差异. Levenshtein Distance 算法,又叫 Edit D ...

  4. python基础教程:数值与字符串类型

    Python3 中有六个标准的数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictionary(字典). 不可变数据(四个):Num ...

  5. python 字符串替换_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  6. python字符串函数的find方法_Python string模块 字符串函数方法操作教程

    我们在Python编程过程中,经常会处理一些字符串的相关操作,例如:查找.替换.分隔.截取以及英文的大小写转换等,这个时候Python程序员首选的一定是 string模块 . 一.string模块简单 ...

  7. python获取字符串首字母_Python中用startswith()函数判断字符串开头的教程

    Python中用startswith()函数判断字符串开头的教程 函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(s ...

  8. python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换

    1. 字符串分割 将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的. str.split() 和 re.split() string 对象的 split() 方法只适应于非常简单的 ...

  9. python文本关键词匹配_NLP利剑篇之模式匹配

    模式匹配:查找字符串中是否存在某个(些)子字符串 在NLP任务中,经常会遇到判断某些关键词是否在文本中以及在文本中的位置,还有些类似分词的应用场景,这时就可以利用模式匹配这种小而美的方式.本文主要涉及 ...

最新文章

  1. Linux06-服务、守护进程和systemd
  2. python快速编程入门黑马-500G 史上最全的JAVA全套教学视频网盘分享
  3. C语言怎么保留n位小数并且四舍五入(附带两种简单方法)
  4. 微信小程序签名(横屏+竖屏)
  5. 使用PySpark搭建机器学习模型
  6. 线段树POJ3468(成段更新,区间求和)
  7. 移动端中使用调试控制台
  8. Exchange安装过程中经常遇到的服务器需要重启问题
  9. 【Oracle】恢复重做日志组
  10. oracle 游标取字段名称,Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串...
  11. crossover卸载 linux,Ubuntu中卸载CrossOver困难?那是你没学会这个命令
  12. 兴趣爱好-常用的10种算法
  13. 哈工大车万翔教授:NLPer的核心竞争力是什么?
  14. Yii2.0 获取当前url和域名
  15. 苹果手机怎么设置来电铃声?4个步骤,快速学会
  16. 布局:px to vw、vh
  17. 解决Redis缓存穿透之布隆过滤器详解
  18. KITTI数据集学习笔记
  19. 我对于UI设计这个领域的理解
  20. 中国网络优化行业发展前景预测分析及投资风险评估报告2021-2027年

热门文章

  1. MySQL数据库 第5章:单表操作
  2. 和尤雨溪一起进阶vue
  3. sci论文检索及获取论文的主要方式
  4. IntelliJ IDEA【前端必备插件】
  5. mysql 获取唯一值_mysql 获取全局唯一值
  6. SAP动态下载数据库表字段及文本至EXCEL程序
  7. 【C语言】C语言实现一个函数 判断是否是素数
  8. 注解 @Deprecated、@deprecated 的使用、说明
  9. 基于Oracle的SQL优化(崔华著)-整理笔记-工具集
  10. 《企业IT架构转型之道》随笔之SOA、ESB、微服务、API网关(2019-08-07)