代码之家  ›  专栏  ›  技术社区  ›  Junaid Farooq

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

  •  0
  • Junaid Farooq  · 技术社区  · 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%的匹配。

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

    0 回复  |  直到 1 年前
        1
  •  0
  •   Onorio Catenacci    1 年前

    你可能想看看你得到了什么 Levenshtein 距离计算或 Hamming 。我还想指出Jaro距离的计算方式(至少根据维基百科) "The score is normalized such that 0 means an exact match and 1 means there is no similarity" --好吧,.49的分数似乎表明了一个显著的差异。