问题标签 [stringdist]

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 回答
179 浏览

r - 如何模糊字符串匹配来自不同大小数据帧的多个字符串?

我想将我的第一个数据集中的字符串与所有最接近的常见匹配项进行匹配。

数据如下:

数据集1:

数据集2:

期望的结果是:

问题是:

  • 如何搜索第一个数据集和第二个数据集之间的公共字符串,并在第二个数据集中生成与第一个数据集中的每个术语对齐的术语列表?

提前致谢。

0 投票
2 回答
389 浏览

r - 通过 stringmatch 与 dplyr 和 stringdist 合并两个数据帧

我正在尝试基于非常相似的语言对两个数据帧进行 dplyr 左连接(这不准确)。

DF1:

DF2:

我执行此操作以使用 stringdist 包/库将字符串距离作为向量获取:

向量看起来像......好吧,一个整数向量:

通常,如果我有完全匹配,我会这样做:

如何使用向量作为记录选择器进行左连接,以便最终结果为:

由于向量 (NA) 中没有可能的匹配项,因此排除了第三个不匹配项。

0 投票
1 回答
236 浏览

r - 获取两个列表之间最接近的字符串匹配

我是 R 的真正初学者,我只有这两个列表,其中包含城市名称。一个列表包含用户生成的名称(人们拼写混乱),另一个列表包含名称的拼写。

我尝试使用包stringdist,最后我得到了一个循环(for)并给出最接近匹配的代码。但我只能输入向量,我真的需要使用数据框。

这是我的代码(哦,男孩,感觉很尴尬):

想法是使用此代码有一个想法,我想从这个到在我的数据框的每一行中使用stringdist。我什至不知道这是否是个好主意,如果这需要太多的处理能力,不要害怕说它很愚蠢。谢谢!

0 投票
2 回答
207 浏览

r - 从 R 中的 stringdist 算法中删除 for 循环

我已经制定了一个算法来确定 R 中 2 个数据帧中匹配字符串的分数。它将在 test_ech 中搜索每一行在 test_data 中其分数高于 0.75 的匹配行(基于每个数据帧中 3 列的匹配) .

好吧,我的代码与小数据框完美配合,但我正在处理 12m 行的数据框,这个过程至少需要 5 天才能完成。所以我认为如果我丢弃“for循环”它会起作用,但我真的不知道该怎么做。(如果我需要做一些额外的改变来减轻这个过程)

谢谢。

test_ech:65k 行和 test_data:12m 行

预期的输出是一个数据框,其中包含来自 test_ech 的 3 个参考列,以及来自 test_data 的 3 个匹配列,并且分数应该>0.75

输出链接

0 投票
1 回答
157 浏览

r - 在 R 中使用 stringdist 和 data.table 时出现回收错误

我正在尝试对包含作者姓名的 data.table 执行近似字符串匹配,基于“名字”的字典。我还设置了一个高于 0.9 的高阈值,以提高匹配质量。

但是,我收到以下错误消息:

即使我使用 signif(similarity_score,4) 将相似度匹配向下舍入到 4 位,也会发生此错误。

有关输入数据和方法的更多信息:

  1. author_corrected_df 是一个包含列的 data.table:“Author”和“Author_Corrected”。Author_Corrected 是相应作者的字母表示(例如:如果 Author = Jack123,则 Author_Corrected = Jack)。
  2. Author_Corrected 列可以有正确名字的变体,例如:Jackk 而不是 Jack,我想在这个名为 Gender_Dict 的 author_corrected_df 中填充相应的性别。
  3. 另一个名为 first_names_dict 的 data.table 包含“姓名”(即名字)和性别(0 表示女性,1 表示男性,2 表示关系)。
  4. 我想从每行的“Author_Corrected”中找到与 first_names_dict 中的“名称”最相关的匹配,并填充相应的性别(0、1、2 之一)。
  5. 为了使字符串匹配更严格,我使用了 0.9720 的阈值,否则在后面的代码中(未在下面显示),不匹配的值然后表示为 NA。
  6. first_names_dict 和 author_corrected_df 可以从以下链接访问: https ://wetransfer.com/downloads/6efe42597519495fcd2c52264c40940a20190612130618/0cc87541a9605df0fcc15297c4b18b7d20190617130619/6498a

执行时我收到以下错误消息:

希望在了解错误所在以及是否有更快的方法来执行这种匹配方面提供帮助(尽管后者是第二优先级)。

提前致谢。

0 投票
0 回答
380 浏览

r - 有没有办法显着加快 R 包 stringdist 的速度,例如使用 Rcpp?

我有一个循环,我必须在其中计算一个字符串和许多字符串的向量之间的距离。我使用包“stringdist”和同名函数,效果很好。

但是,每次计算距离都需要相当长的时间。例如,要获得一个单词和 350 万个其他单词之间的距离大约需要 0.5 秒。这似乎并不多,但做 350 万次确实需要太长时间。

我不能做一个距离矩阵,因为这太大了,我将计算分开以避免必须计算一个完整的矩阵,即 350 万乘 350 万。

是否有可能使用 Rcpp 来计算 Levenshtein 和/或 Hamming 距离以加快速度(很多)?

我已经尝试过编译器包并使用“cmpfun”,但这不会改变速度。我假设我必须使用 C++ 编写函数 stringdist?不幸的是我不知道怎么做。

stringdist 是循环的一部分,它占用了该循环步骤 95% 以上的时间,因此减少会非常有帮助。

任何帮助,将不胜感激。

编辑1:

这是一个小的字符串向量,例如:

编辑 2:我使用@Andrew 的评论重新思考问题,这就是我现在的处理方式:

因为我现在只需要 1 的距离,所以我只使用长度相同、短一个字母或长一个字母的字符串来计算我手头的字符串的距离。这大大减少了时间。大型数据集仍然需要很长时间,但它已经有所帮助。

0 投票
1 回答
226 浏览

r - 如何显式构建稀疏 stringdistmatrix 以避免内存不足?

将“数据”向量中的大量略有不同的餐厅名称匹配到适当的“匹配”向量:

包中的stringdistmatrix功能stringdist很棒,但是内存不足几个 10k x 10k 并且我的数据更大。

尝试as(stringdistmatrix(data, match),'sparseMatrix')会给出希望的结果,但内存不足。因此,我想使用sparseMatrix(i,j,x,dims,dimnames)withx计算adist()或类似的字符串距离显式索引对,希望它适合内存。

R

试:

希望输出匹配:

0 投票
1 回答
217 浏览

r - 通过分组变量计算 Levenshtein/Hamming 距离

我正在尝试MEM_Response根据正确的响应(列)计算参与者响应(列)的准确性MEM_Correct。分组变量将是参与者的 ID(在本例中为列SERIAL--> 每个参与者 15 个案例)。

我尝试使用多种方法计算准确度(即正确响应和实际响应之间的距离),但到目前为止我没有收到令人满意的输出。

stringdist用于 Hamming & Levenshtein 距离:

文史丹:

汉明:

问题:我有每个案例的汉明距离,但我将如何计算每个参与者的准确度,最终得到 0 到 1 之间的范围(即 0 到 100% 准确度)?汉明距离的问题还在于不同长度的情况(参见第 5 行:WRKTJWRKLTJ)产生inf。所以我可能会更好地使用 Levenshtein 距离,对吗?

然后我尝试with()了 Levensthein 距离的函数:

这一次,值介于 0 和 1 之间,我认为这是向前迈出的一步。再看第 5 行:WRKTJ(5 个字母)与 WRKLTJ(6 个字母)的不同之处在于后者在中间有一个额外的“L”。因此,需要进行 1 次编辑(在这种情况下是删除)才能匹配正确的响应。它的 Levenshtein 值 0.8333 对应于 5/6 正确(即使正确值只有 5)。我是否使用了正确的距离功能?

最后,我的最后一个问题是:

如何匹配/计算每个参与者的平均准确度?我有另一个与所有参与者一起的 df,我想将示例的输出与每个人的数据框合并,其中 1 行 = 1 个参与者。

我希望这是有道理的 - 如果没有,我可以尝试包含更多信息。如果您认为我没有使用正确的方法,请随时提出其他方法。

先感谢您!

0 投票
3 回答
1626 浏览

r - 如何知道计算字符串之间的 Levenshtein 距离的操作?

使用该函数stringdist,我可以计算字符串之间的 Levenshtein 距离:它计算将字符串转换为另一个字符串所需的删除、插入和替换的次数。例如,stringdist("abc abc","abcd abc") = 1因为“d”被插入到第二个字符串中。

是否有可能知道获得两个字符串之间的 Levenshtein 距离的操作?或者要知道两个字符串之间不同的字符(在这个例子中,只有“d”)?谢谢。

我想知道:

  • 插入了“d”

  • 插入了“e”

  • “b”被替换为“c”

或者更简单地说,我想要列表(“d”、“e”、“c”)。

0 投票
0 回答
263 浏览

python - Postgres Join 基于 Levenshtein 距离

我正在尝试在我的加入条件中利用 levenshtein 距离。

由于 sqlalchemy 不提供 func 模块中的实现,我将方法 stringdist.rdlevenshtein_norm 设置为 func.rdlevenshtein_norm 并在我的 sqlalchemy 连接中使用它,如下所示。

但是该函数stringdist.rdlevenshtein_norm需要 2 个字符串作为输入,因此不能很好地与 sqlalchemy 一起比较 2 个连接列中的所有值。

所以我得到的 on_cond 错误是TypeError('argument 1 must be str, not Column',)

我在这里做错了什么?如何让 sqlalchemy 在执行连接操作时使用此功能?