【问题标题】:Getting unique values from an array with words containing diacritics in Ruby从包含 Ruby 中包含变音符号的单词的数组中获取唯一值
【发布时间】:2018-12-02 21:45:17
【问题描述】:

如何通过在没有正确变音符号的情况下忽略相同单词的存在来从数组中获取 uniq 值?

现在它是这样工作的:

["Poznan", "Poznań", "Gdańsk"].uniq 
=> ["Poznan", "Poznań", "Gdańsk"]

这就是我想要实现的目标:

["Poznan", "Poznań", "Gdańsk"].uniq 
=> ["Poznań", "Gdańsk"]

【问题讨论】:

  • ["Poznań", "Poznañ", "Pôznan"].uniq 应该返回什么?
  • 波兹南,我对波兰语特别感兴趣。
  • 好吧,你可以从指定规则开始。
  • 根据我刚刚从谷歌快速搜索中了解到的情况,波兰字母表中的小写字母与英文字母表有两个不同之处:1)前者没有英文字母“q "、"v" 和 "x"; 2) 前者有附加字母“ą”、“ć”、“ę”、“ł”、“ń”、“ó”、“ś”、“ź”和“ż”。假设我们要下载一个英语到波兰语词典,并开始尝试根据一组匹配规则找到一个与给定英语单词 word 不同的波兰语单词。如果在波兰语词典中找到word,我们显然有一个匹配项。 (续)
  • ...如果word 匹配/[qvx]/ 似乎没有类似的波兰语单词(除非规则以波兰语字母显示“q”、“v”和“x”映射。)剩下的要检查的情况是查看波兰语词典中是否存在针对规则指定的每个字符替换组合的单词。例如,如果word #=> "conifer" 可能必须考虑用一个或多个值替换散列{ "c"=>"ć", "o"=>"ó", "n"=>"ń", "f"=>"ł", "e"=>"ę", } 中的键的所有组合,其中有2**5-1 #=> 31

标签: arrays ruby unicode diacritics uniq


【解决方案1】:

您可以将 Unicode 规范化为 NFKD 形式,以将重音与基础字符分开,然后删除重音。这会将'Poznań' 转换为'Poznan',同时留下'Poznan'。然后使用Array#uniq的块形式:

array = %w[Poznan Poznań Gdańsk]
array.uniq { |s| s.unicode_normalize(:nfkd).gsub(/[^\p{L}\p{N}]/, '') }
# ["Poznan", "Gdańsk"] 

请注意,选择 Poznan 而不是 Poznań。如果您更喜欢某个单词的一种形式而不是另一种形式,那么您可以使用规范化和重音去除来比较单词并实现您自己的 uniq 版本,以优先考虑您的首选形式。

【讨论】:

  • 是的。这就是我要找的东西,然后我需要创建 Hash 来注册哪个拉丁词被翻译成哪个非拉丁词,然后将其用作字典。谢谢
【解决方案2】:

如何使用 I18n.transliterate : Transliterates UTF-8 字符到 ASCII。默认情况下,此方法只会将拉丁字符串音译为 ASCII 近似值:

> require "i18n"
> I18n.config.available_locales = :en
> ["Poznan", "Poznań", "Gdańsk"].map{|e| I18n.transliterate(e)}.uniq
#=> ["Poznan", "Gdansk"] 

【讨论】:

  • 答案也很好。你有什么技巧可以返回拉丁语而不是非拉丁语吗?
  • @sonic : 不知道反向,需要探索这个方法
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多