Elixir 或 Ecto 中最接近的字符串匹配

问题描述 投票:0回答:1

我正在尝试比较两个基本上是地址的字符串。

我正在尝试使用

jaro_distance

iex(1)> String.jaro_distance("4420 West Main Street", "EUTECTIC CORPORATION QA testing1")
0.49107142857142855

但是这两个字符串之间没有相似之处。

我也尝试过 PSQL

SIMILAR TO
。就这样

  def find_match(seeker_company_id, string, type) do
    search = "%(" <> string <> ")%"
    base_query =
      from op in OpenCorporates,
        where: op.seeker_company_id == ^seeker_company_id

    base_query
    |> type_query(type, search)
    |> Repo.aggregate(:count)
  end

  defp type_query(query, :name, value) do
    from op in query,
      where: fragment("? SIMILAR TO ?", op.name, ^value)
  end

  defp type_query(query, :address, value) do
    from op in query,
      where: fragment("? SIMILAR TO ?", op.registered_address, ^value)
  end

但是如果搜索字符串和实际字符串是这样的

搜索字符串:'

29 SANTA CRUZ COURT PITTSBURG CA 662354553
'和实际地址字符串:'
29 SANTA CRUZ COURT PITTSBURG CA 94565
'

它也失败了。但这里不应该失败,因为大多数字符串都匹配。

那么这里有什么解决方案吗?有没有办法计算匹配的百分比?在上面的例子中,我们可以说它是80%的匹配。

任何指导都会有所帮助,谢谢。

elixir ecto
1个回答
0
投票

您可能想看看通过 Levenshtein 距离计算或 Hamming 得到了什么。我还要指出 Jaro 距离的计算方式(至少根据维基百科)“分数经过标准化,0 表示完全匹配,1 表示不存在相似性”——分数为 0.49似乎确实表明存在显着差异。

© www.soinside.com 2019 - 2024. All rights reserved.