问题标签 [fuzzy-comparison]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3403 浏览

mysql - 如何加入具有容差的时间戳列

我怎样才能允许 1 - 10 秒的容差?

我有 2 个带有时间戳的表,但延迟了 1-10 秒。我正在使用内部连接来比较它们。我在两个表中都有电话号码(列)匹配但不能使它们与时间戳匹配(仅限时间)。为了允许一定的容忍度,我可以使用类似的表达式cast(DateCreated as Time) = cast(TIMESTAMP as time) + 5。但我不想每一秒都这样做。

如果可能的话,我希望看到以下结果:

如果满足条件,则将其发送到表 3,但如果不满足条件,则不会将其发送到表 3。

使用 Zoho 报告,因此我不确定他们使用的是什么类型的数据库。Postgres、MySQL 等

0 投票
0 回答
281 浏览

r - R:可变大小的模糊名称匹配

我一直在努力将源集与客户名称的主集相匹配,而这可以通过-adist在 R 中使用来实现,但现在我一直在使用 200 万个源集和 500k 个主集,这里我们不能使用它,adist因为它没有支持长向量,所以我已将数据分块为小集,现在我有 70 k 的源集和 20k 的主集,而这里的数据集大小不同,因此不能使用adist,因为它不支持可变大小的集,我已经尝试了各种其他方法来实现相同的效果amatch,但没有太大帮助pmatchagrep我参考了这些我找到但找不到解决方案的网站。

我已经尝试过levenshteinDist,但是在实现巨大的数据框时遇到问题levenshteinSimjarowinkler我可以为我的数据框找到类似于这个解决方案的解决方案,使用 jarowinkler 来处理不同大小的集合

0 投票
1 回答
1203 浏览

python - 匹配 2 个简短描述并返回置信度

我有一些使用 Yodlee 从银行获得的数据以及手机上的相应交易消息。两者都有一些描述 - 简短的描述。

例如 -

如果一个完全在另一个内部,它们可以匹配。但是,一些字符串如

还是需要搭配的。是否有算法可以给出匹配 2 个描述的置信度?

0 投票
0 回答
927 浏览

r - agrep 匹配如何工作?

agrep 函数给出了一些令人费解的结果,我想更好地理解它的行为。例如:

回报: [1] "abc" "abcde" "abcef"

但是“abcd”和“abcef”之间的距离是2。所以我不确定为什么会出现第三场比赛。

另外,我假设如果距离上限设置为 0,该函数将仅返回完全匹配:

但是,我得到[1] "abcde"了比赛

如果有人可以解释 agrep 中的匹配是如何工作的,那将非常有帮助。

0 投票
2 回答
2768 浏览

python - 模糊比较两列

我有一个包含搜索词(数字和文本)的 CSV 文件,我想将其与其他词(数字和文本)的列表进行比较,以确定是否有任何匹配项或潜在匹配项。然后我想将所有结果写入一个新的 CSV 以供手动审查。我正在使用fuzzywuzzy 插件来创建一个“分数”,以确定术语之间的匹配程度。理想情况下,我将能够过滤比率。

我当前的代码将文件行一对一而不是第一个文件中的一行与第二个文件中的所有行进行比较;这就是我需要的。

如何针对 file2 中的所有行对 file1 中的每一行进行模糊查找?

下面是上述代码的一个更简洁的版本,但它仍然存在问题。代码给出了错误

IndexError:列表索引超出范围

知道如何使列表在范围内并且代码工作吗?

0 投票
1 回答
1639 浏览

lucene - 搜索数百万个模糊哈希的最佳方法

我在数据库表中有大约一千万个文件的垃圾邮件复合哈希,我想找到彼此相当相似的文件。Spamsum 哈希由两个最大 64 字节的 CTPH 哈希组成,如下所示:

它们可以分为三个部分(在冒号上拆分字符串):

  1. 块大小:384在上面的哈希中
  2. 第一个签名:w2mhnFnJF47jDnunEk3SlbJJ+SGfOypAYJwsn3gdqymefD4kkAGxqCfOTPi0ND
  3. 第二个签名:wemfOGxqCfOTPi0ND

块大小是指第一个签名的块大小,第二个签名的块大小是第一个签名的两倍(这里:384 x 2 = 768)。每个文件都有这些复合哈希之一,这意味着每个文件都有两个具有不同块大小的签名。

只有当它们的块大小对应时,才能比较垃圾邮件签名。也就是说,上面的复合散列可以与任何其他包含块大小为 384 或 768 的签名的复合散列进行比较。对于具有相似块大小的散列,签名字符串的相似性可以作为两者之间相似性的度量。由哈希表示的文件。

所以如果我们有:

  • file1.blk2 = 768
  • file1.sig2 = wemfOGxqCfOTPi0ND
  • file2.blk1 = 768
  • file2.sig1 = LsmfOGxqCfOTPi0ND

我们可以通过计算两个签名的一些加权编辑距离(如 Levenshtein 距离)来了解两个文件的相似程度。这两个文件似乎非常相似。

还可以计算两个哈希之间的归一化相似度得分(请参阅此处的详细信息)。

我想根据这些哈希值找到任何两个相似度超过 70% 的文件,并且我非常喜欢使用可用的软件包(或 API/SDK),尽管我不害怕通过代码编写自己的方式问题。

我尝试使用 Lucene (4.7.0) 分解散列并索引它们,但搜索似乎缓慢而乏味。这是我尝试过的 Lucene 查询的示例(对于每个单个签名 - 每个哈希两次并使用区分大小写的 KeywordAnalyzer):

似乎 Lucene非常快的 Levenshtein 自动机不接受超过 2 的编辑距离限制(我需要它支持高达 0.7 x 64 ≃ 19),并且它的正常编辑距离算法没有针对长搜索词进行优化(使用蛮力方法一旦达到距离限制,就不会切断计算。)也就是说,可能是我的查询没有针对我想做的事情进行优化,所以请不要犹豫,纠正我。

我想知道是否可以使用 Lucene 提供的任何算法来完成我需要的工作,而不是直接计算编辑距离。我听说 BK-trees 是索引此类搜索的最佳方式,但我不知道该算法的可用实现(Lucene 是否使用这些实现?)。我还听说一个可能的解决方案是使用 n-gram 方法缩小搜索列表,但我不确定在包容性和速度方面与编辑距离计算相比如何(我很确定 Lucene 支持那个)。顺便说一句,有没有办法让 Lucene 在并行模式下运行术语搜索?

鉴于我仅使用 Lucene 来预匹配哈希,并且稍后使用适当的算法计算真正的相似度得分,我只需要一种至少与相似度得分计算中使用的 Levenshtein 距离一样具有包容性的方法——即,我不希望预匹配方法排除会被评分算法标记为匹配的哈希。

任何帮助/理论/参考/代码或线索都值得赞赏。

0 投票
0 回答
59 浏览

javascript - 检查与宽大处理的文本匹配?

我正在开发一个应用程序,它向用户读取一个琐事问题,然后要求用户输入答案以查看它们是否正确。我希望能够将用户答案与实际答案进行比较,看看它们是否在一定程度上与一些宽大处理相匹配。例如,如果答案是“rachmaninoff”并且用户输入“rakmaninoff”或“rachmaninof”......我希望它们被视为正确。有没有什么方法或软件可以做到这一点?

0 投票
0 回答
53 浏览

regex - 正则表达式排除 2 个连续变体

我正在尝试做一些模糊匹配(在 R 中),并想制定一些关于允许多少连续变化的规则。例如,如果我使用 Levenshtein 距离并且距离大于 2,我想排除这 2 个变体彼此相邻发生的任何匹配项。

一个例子:

如果我们试图匹配字符串“James Madison”,

-“Jame Madisan”会产生距离=2的匹配

-“Jans Madison”也将具有距离=2,但不会产生命中,因为 2 个连续变化(“n”需要更改为“m”,并且必须在“s”中的“s”之前插入“e”詹姆士”)

0 投票
1 回答
2534 浏览

r - R - 基于不一致的全名格式的部分匹配合并两个数据文件

这是我以前用 R 格式转贴的问题。

我正在寻找一种基于参与者全名的部分匹配来合并两个数据文件的方法,这些全名有时以不同的格式输入,有时拼写错误。我知道部分匹配(例如 agrep 和 pmatch)和合并数据文件有一些不同的功能选项,但我需要帮助 a) 将两者结合起来;b) 进行可以忽略中间名的部分匹配;c) 在合并的数据文件中存储原始名称格式和 d) 保留唯一值,即使它们没有匹配项。

例如,我有以下两个数据文件:

文件名:员工数据(R 中的 df1)

文件名:评估数据(R 中的 df2)

我想根据名称(df1 中的全名和 df2 中的候选人)合并它们,忽略中间名(例如 Eilen Cowie = Eileen Mary Cowie)、额外空格(Laura Cumming = Laura Cumming);拼写错误(例如 Elena Popa = Elena Pope)等。

理想的输出如下所示:

任何建议将不胜感激!

0 投票
2 回答
2954 浏览

r - R: Using plyr to perform fuzzy string matching between matching subsets of two data sources

Say I have a list of counties with varying amounts of spelling errors or other issues that differentiate them from the 2010 FIPS dataset (code to create fips dataframe below), but the states in which the misspelled counties reside are entered correctly. Here's a sample of 21 random observations from my full dataset:

I've used adist to create a fuzzy string matching algorithm that matches around 80% of my counties to the county names in fips. However, sometimes it will match two counties with similar spelling, but from different states (e.g., "Webster, LA" gets matched to "Webster, GA" rather than "Webster Parrish, LA").

Therefore, I want to restrict fuzzy string matching of county to the correctly spelled versions with matching state.

My current algorithm makes one big matrix which calculates standard Levenshtein distances between both sources and then selects the value with the minimum distance.

To solve my problem, I'm guessing I'd need to create a function that could be applied to each 'state' group by ddply, but I'm confused as to how I should indicate that the group value in the ddply function should match another dataframe. A dplyr solution or solution using any other package would be appreciated as well.

Code to create FIPS dataset: