我正在尝试使用Python 2.6和PIL 计算两个图像的相似度(读取:Levenshtein距离).
我计划用python-levenshtein库进行快速比较.
主要问题:
比较图像的好策略是什么?我的想法是这样的:
当然,这不会处理镜像图像,裁剪图像等情况.但是对于基本比较,这应该是有用的.
在某处记录了更好的策略吗?
编辑: Aaron H对速度问题是正确的.对于大于几百乘几百像素的图像,计算Levelshtein需要永远.但是,在我的示例中缩小到100x100和200x200之后的结果之间的差异小于1%,因此将最大图像大小设置为~100px左右可能是明智的...
编辑:感谢PreludeAndFugue,这个问题就是我想要的.
顺便说一句,Levenshtein的距离似乎可以优化,但它给了我一些非常糟糕的结果,也许是因为背景中有很多冗余元素.要看一些其他算法.
EIDT:均方根偏差和峰值信噪比似乎是另外两个选项,不是很难实现,看起来不是很昂贵.但是,似乎我需要某种上下文分析来识别形状等.
无论如何,感谢所有的链接,并指出朝向NumPy/SciPy的方向.
是否有任何工具可以在Python中进行URL比较?
例如,如果我有http://google.com,google.com/我想知道他们可能是同一个网站.
如果我要手动构建一个规则,我可能会大写它,然后剥离该http://部分,并删除最后一个字母数字字符后的任何内容..但我可以看到这个失败,因为我相信你也可以.
有没有这样做的图书馆?你会怎么做?
我有比较两个文件的问题.基本上,我想要做的是两个文件之间类似于UNIX的差异,例如:
$ diff -u左文件右文件
但是我的两个文件包含浮点数; 并且因为这些文件是在不同的体系结构上生成的(但是计算相同的东西),浮动值并不完全相同(它们可能因1e-10而不同).但我通过'差异'文件寻找的是找到我认为是显着差异的东西(例如差异大于1e-4); 使用UNIX命令diff时,几乎所有包含浮动值的行都不同!这是我的问题:我如何得到像'diff -u'提供的结果差异,但对浮点数比较的限制较少?
我以为我会写一个Python的脚本来做到这一点,并找到了模块difflib,它提供了类似diff的比较.但是我发现的文档解释了如何按原样使用它(通过单一方法),并解释了内部对象,但我找不到任何关于如何自定义difflib对象以满足我的需求(比如仅重写比较方法或...)我想解决方案可能是检索统一的差异,然后"手动"解析它以消除我的"错误"差异,这不是优雅的; 我更愿意使用现有的框架.
那么,有没有人知道如何自定义这个lib,以便我可以做我想要的东西?或者至少指出我正确的方向......如果不是在Python中,也许shell脚本可以完成工作?
任何帮助将不胜感激!提前感谢您的回答!
给定数据集 1
name,x,y
st. peter,1,2
big university portland,3,4
Run Code Online (Sandbox Code Playgroud)
和数据集 2
name,x,y
saint peter3,4
uni portland,5,6
Run Code Online (Sandbox Code Playgroud)
目标是合并
d1.merge(d2, on="name", how="left")
Run Code Online (Sandbox Code Playgroud)
虽然没有完全匹配的名称。所以我想做一种模糊匹配。在这种情况下,技术无关紧要,更重要的是如何将其有效地合并到 Pandas 中。
例如,st. peter可能与saint peter另一个匹配,但big university portland可能偏差太大,我们不会将其与uni portland.
考虑它的一种方法是允许以最低的 Levenshtein 距离加入,但前提是编辑次数低于 5(st. --> saint是 4)。
生成的数据框应仅包含 row st. peter,并包含“名称”变体以及x和y变量。
有没有办法使用熊猫进行这种合并?
假设我有一个大字符串和一个子串数组,当连接时等于大字符串(差异很小).
例如(注意字符串之间的细微差别):
large_str = "hello, this is a long string, that may be made up of multiple
substrings that approximately match the original string"
sub_strs = ["hello, ths is a lng strin", ", that ay be mad up of multiple",
"subsrings tat aproimately ", "match the orginal strng"]
Run Code Online (Sandbox Code Playgroud)
如何最好地对齐字符串以从原始字符串生成一组新的子字符串large_str?例如:
["hello, this is a long string", ", that may be made up of multiple",
"substrings that approximately ", "match the original string"]
Run Code Online (Sandbox Code Playgroud)
附加信息
用例是从PDF文档中提取的文本的现有分页符中查找原始文本的分页符.从PDF中提取的文本是OCR并且与原始文本相比具有较小的错误,但原始文本没有分页符.目标是准确地分页原文,避免PDF文本的OCR错误.
如何衡量 r 中名称的相似程度?换句话说,可以进行模糊匹配的程度。
例如,我正在使用如下所示的数据框:
Name.1 <- c("gonzalez", "wassermanschultz", "athanasopoulos", "armato")
Name.2 <- c("gonzalezsoldevilla", "schultz", "anthanasopoulos", "strain")
df1 <- data.frame(Name.1, Name.2)
Run Code Online (Sandbox Code Playgroud)
df1
Name.1 Name.2
1 gonzalez gonzalezsoldevilla
2 wassermanschultz schultz
3 athanasopoulos anthanasopoulos
4 armato strain
Run Code Online (Sandbox Code Playgroud)
从数据中可以清楚地看出,第 1 行和第 2 行足够相似,足以确信名称相同。第三行是相同的名称,尽管拼写错误,第四行完全不同。
作为输出,我想创建第三列来描述名称之间的相似程度或返回某种布尔值以指示可以进行模糊匹配。
受到statar包中的实验fuzzy_join函数的启发,我自己编写了一个函数,它结合了精确和模糊(通过字符串距离)匹配.我必须做的合并工作非常大(导致多个字符串距离矩阵,小于10亿个单元格),我的印象是函数编写效率不高(关于内存使用情况)和并行化以奇怪的方式实现(字符串距离矩阵的计算,如果存在多个模糊变量,而不是字符串距离本身的计算并行化).至于功能,想法是在可能的情况下匹配精确变量(以保持矩阵更小),然后在这个精确匹配的组内进行模糊匹配.我实际上认为这个功能是不言自明的.我在这里发布它是因为我希望得到一些反馈来改进它,因为我想我并不是唯一一个尝试在R中做类似事情的人(虽然我承认Python,SQL和类似的东西可能在这种情况下要更有效率.但是必须坚持一个人感觉最舒服的事情,并且使用相同的语言进行数据清理和准备在再现性方面是很好的) fuzzy_joinfuzzy_join
merge.fuzzy = function(a,b,.exact,.fuzzy,.weights,.method,.ncores) {
require(stringdist)
require(matrixStats)
require(parallel)
if (length(.fuzzy)!=length(.weights)) {
stop(paste0("fuzzy and weigths must have the same length"))
}
if (!any(class(a)=="data.table")) {
stop(paste0("'a' must be of class data.table"))
}
if (!any(class(b)=="data.table")) {
stop(paste0("'b' must be of class data.table"))
}
#convert everything to lower
a[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]
b[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]
a[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]
b[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]
#create ids
a[,"id.a":=as.numeric(.I),by=c(.exact,.fuzzy)]
b[,"id.b":=as.numeric(.I),by=c(.exact,.fuzzy)]
c <- unique(rbind(a[,.exact,with=FALSE],b[,.exact,with=FALSE]))
c[,"exa.id":=.GRP,by=.exact]
a <- merge(a,c,by=.exact,all=FALSE)
b <- merge(b,c,by=.exact,all=FALSE)
##############
stringdi <- function(a,b,.weights,.by,.method,.ncores) {
sdm <- list()
if (is.null(.weights)) {.weights <- …Run Code Online (Sandbox Code Playgroud) parallel-processing r fuzzy-comparison data.table stringdist
我有两组数据。现有客户和潜在客户。
我的主要目标是弄清楚是否有任何潜在客户已经是现有客户。但是,跨数据集的客户命名约定是不一致的。
现有客户
Customer / ID
Ed's Barbershop / 1002
GroceryTown / 1003
Candy Place / 1004
Handy Man / 1005
Run Code Online (Sandbox Code Playgroud)
潜在客户
Customer
Eds Barbershop
Grocery Town
Candy Place
Handee Man
Beauty Salon
The Apple Farm
Igloo Ice Cream
Ride-a-Long Bikes
Run Code Online (Sandbox Code Playgroud)
我想写一些像下面这样的选择语句来达到我的目标:
SELECT a.Customer, b.ID
FROM PotentialCustomers a LEFT JOIN
ExistingCustomers B
ON a.Customer = b.Customer
Run Code Online (Sandbox Code Playgroud)
结果将类似于:
Customer / ID
Eds Barbershop / 1002
Grocery Town / 1003
Candy Place / 1004
Handee Man / 1005
Beauty Salon / NULL …Run Code Online (Sandbox Code Playgroud) 我正在使用两个要基于阈值合并的不同数据集。假设两个数据帧如下所示:
library(dplyr)
library(fuzzyjoin)
library(lubridate)
df1 = data_frame(Item=1:5,
DateTime=c("2015-01-01 11:12:14", "2015-01-02 09:15:23",
"2015-01-02 15:46:11", "2015-04-19 22:11:33",
"2015-06-10 07:00:00"),
Count=c(1, 6, 11, 15, 9),
Name="Sterling",
Friend=c("Pam", "Cyril", "Cheryl", "Mallory", "Lana"))
df1$DateTime = ymd_hms(df1$DateTime)
df2 = data_frame(Item=21:25,
DateTime=c("2015-01-01 11:12:15", "2015-01-02 19:15:23",
"2015-01-02 15:46:11", "2015-05-19 22:11:33",
"2015-06-10 07:00:02"),
Count=c(3, 7, 11, 15, 8),
Name="Sterling",
Friend=c("Pam", "Kreger", "Woodhouse", "Gillete", "Lana"))
df2$DateTime = ymd_hms(df2$DateTime)
Run Code Online (Sandbox Code Playgroud)
我现在想,是能够左连接df2与df1基于的模糊匹配DateTime,并Count为各自的价值在两秒钟内,而除了所有其他值Item都相同。我以为我可以做到以下几点:
df1 %>%
difference_left_join(df2, by=c("DateTime", "Count"), max_dist=2)
Run Code Online (Sandbox Code Playgroud)
但这给了我以下输出:
# A tibble: 8 …Run Code Online (Sandbox Code Playgroud) 我在企业级使用 python fuzzywuzzy 来匹配 2 个字符串。它在大多数情况下工作正常,但在下面提到的场景中会产生意想不到的结果:
fuzz.partial_ratio('ja rule:mesmerize','ja rule feat. ashanti:mesmerize') gives output 65
Run Code Online (Sandbox Code Playgroud)
和
fuzz.partial_ratio('ja rule:mesmerize','jennifer lopez feat. ja rule:im real ') gives the output 67
Run Code Online (Sandbox Code Playgroud)
有什么解释为什么第二场比赛的模糊分数比第一场比赛更好吗?
非常感谢任何帮助/建议。
fuzzy-comparison ×10
python ×6
fuzzy-logic ×4
r ×3
algorithm ×1
data.table ×1
fuzzy-search ×1
fuzzyjoin ×1
fuzzywuzzy ×1
lcs ×1
merge ×1
pandas ×1
python-2.7 ×1
sql ×1
string ×1
stringdist ×1
t-sql ×1