【问题标题】:Mapping arbitrary strings to RGB values将任意字符串映射到 RGB 值
【发布时间】:2009-01-30 14:27:36
【问题描述】:

我有大量任意自然语言字符串。为了让我的工具分析它们,我需要将每个字符串转换为唯一的颜色值(RGB 或其他)。我需要颜色对比来取决于字符串的相似性(字符串与其他字符串不同,它们各自的颜色应该越不同)。如果我总是为同一个字符串获得相同的颜色值,那将是完美的。

关于如何解决这个问题的任何建议?

更新字符串之间的距离

我可能需要将“相似性”定义为类似 Levenstein 的距离。不需要自然语言解析。

即:

"I am going to the store" and 
"We are going to the store"

类似。

"I am going to the store" and 
"I am going to the store today"

类似(但略少)。

"I am going to the store" and 
"J bn hpjoh up uif tupsf"

很不相似。

(谢谢,Welbog!)

我可能会确切地知道只有当我看到程序输出时我才需要什么距离函数。所以让我们从更简单的事情开始吧。

任务简化更新

我已经删除了我自己将任务一分为二的建议——绝对距离计算和颜色分布。这不会很好地工作,因为首先我们将维度信息减少到单个维度,然后尝试将其合成到三个维度。

【问题讨论】:

  • 色调并不是真正的三维。您可能更希望改变色调而不是改变其他值,因为当您获得低值或高饱和度时,您无法真正区分颜色。我的主要建议是使用 HSV 空间而不是 RGB,主要使用色调。

标签: algorithm colors string-metric


【解决方案1】:

您需要详细说明“相似字符串”的含义,以便提出适当的转换函数。是字符串

 "I am going to the store" and 
"We are going to the store" 

认为类似?字符串呢

 "I am going to the store" and 
"J bn hpjoh up uif tupsf" 

(原始+1中的所有字母),或

 "I am going to the store" and 
"I am going to the store today"

?根据您所说的“相似”,您可能会考虑不同的功能。

如果差异仅基于字符的值(Unicode 或它们来自的任何空间),那么您可以尝试将这些值相加并将结果用作 HSV 空间的色调。如果字符串较长会导致颜色更加不同,您可以考虑按字符在字符串中的位置来衡量字符。

如果差异更复杂,例如某些字母或单词的出现,那么您需要识别这一点。如果您的域中有很多这些值,也许您可​​以根据字符串中 Es、Ss 和 Rs 的数量来决定红色、绿色和蓝色值。或者根据元音与辅音或单词与音节的比例来选择色调。

有很多很多不同的方法来解决这个问题,但最好的方法实际上取决于您所说的“相似”字符串的含义。

【讨论】:

    【解决方案2】:

    听起来你想要某种哈希值。它不需要是安全的(所以没有像 MD5 或 SHA 那样复杂的东西),而是类似于以下内容:

    char1 + char2 + char3 + ... + charN % MAX_COLOUR_VALUE
    

    将作为简单的第一步。您还可以按照让每个字符充当 R、G 和 B 的“幅度”(e 可以是 +1R、+2G 和 -4B 等)的方式做一些更有趣的事情,然后简单地将所有值相加一个字符串...将它们夹在最后,您就有一种方法可以将任意长度的字符串转换为颜色作为“颜色哈希”类的过程。

    【讨论】:

    • 不 - MD5 故意破坏局部性。如果 S1 和 s2 相似,则 color(s1) 和 color(s2) 应该相似。 MD5(s1) 和 MD5(s2) 不相似。
    • 很公平......但我没有建议使用 MD5,这只是为了更清楚地说明原因:)
    【解决方案3】:

    首先,您需要选择一种测量字符串相似度的方法。 Minimal edit distance 是传统的,但不足以对字符串进行良好排序,如果您想每次都为相同的字符串分配相同的颜色,则需要这样做 - 也许您可以通过字母距离来衡量编辑成本。此外,如果您所追求的是语音而非书面形式的相似性(如果是这样,请首先考虑词干/soundex pass)或其他某种“相似性”意义,那么最小编辑距离本身可能不是很有用。

    然后,您需要根据该指标选择一种遍历可见色彩空间的方法。考虑使用HSL or HSV colour representation 可能会有所帮助 - 该算法可以变得像选择一个起始色调并遍历排序的语料库一样简单,将当前色调分配给每个字符串,然后通过字符串与前一个字符串的差异来抵消它。

    【讨论】:

      【解决方案4】:

      你永远不会得到两个具有相同颜色的不同字符串有多重要?

      如果它不是那么重要,那么也许这可以工作?

      您可以选择一个与圆“同伦”的一维颜色空间:假设颜色函数c(x) 是为x01 之间定义的。然后你会想要c(0) == c(1)

      现在您将所有字符值的总和以某个缩放因子取模,并将其包装回颜色空间:

      c( (SumOfCharValues(word) modulo ScalingFactor) / ScalingFactor )

      如果您定义了更高维度的“包装”颜色空间,并且为每个维度选择不同的SumOfCharValues 函数,这可能会更好;有人建议交替使用 sum 和 length。

      只是一个想法...... HTH

      【讨论】:

      • 哦,我看到其他人也建议这样做,但换句话说.. 对不起!
      【解决方案5】:

      这是我的建议(我觉得这个算法有一个通用的名字,但是我太累了记不住了):

      您希望将每个字符串转换为 3D 点节点 (r, g, b)(您可以缩放这些值以使其适合您的范围),从而最大限度地减少以下错误:

      Error = \sum_i{\sum_j{(dist(node_i, node_j) - dist(str_i, str_j))^2}}
      

      你可以这样做:

      1. 首先为每个字符串分配一个随机颜色(r、g、b)
      2. 重复直到你认为合适(例如,误差调整小于 \epsilon = 0.0001):
        1. 随机选择一个节点
        2. 调整它的位置 (r, g, b) 使误差最小化
      3. 缩放坐标系,使每个节点的坐标在 [0., 1.) 或 [0, 256] 范围内

      【讨论】:

        【解决方案6】:

        您可以使用MinHash 或其他LSH method 之类的东西,并将相似性定义为shingles 集合之间的交集,由Jaccard coefficient 测量。 Rajaraman 和 Ullman 在Mining of Massive data sets, Ch.3 中有很好的描述。

        【讨论】:

          【解决方案7】:

          我可能会在两个字符串之间定义一些增量。我不知道您将什么定义为两个字符串的差异(或“不等式”),但我能想到的最明显的事情是字符串长度和特定字母的出现次数(以及它们在字符串中的索引) .实现它应该不会很棘手,以便它在相等的字符串中返回相同的颜色代码(如果你先做一个相等,然后在进一步比较之前返回)。

          当涉及到实际的 RGB 值时,我会尝试将字符串数据转换为 4 个字节(RGBA),如果只使用 RGB,则为 3 个字节。我不知道每个字符串是否都适合它们(因为这可能是特定于语言的?)。

          【讨论】:

            【解决方案8】:

            抱歉,您无法使用 levenshtein distance 或类似的方法来做您正在寻找的事情。 RGB 和 HSV 是 3 维几何空间,但 levenshtein 距离描述了一个度量空间 - 一组更宽松的约束,没有固定的维数。无法在始终保留局部性的同时将度量空间映射到固定数量的维度。

            不过,就近似值而言,对于单个术语,您可以使用 soundex 或 metaphone 等算法的修改来选择颜色;例如,对于多个术语,您可以将 soundex 或 metaphone 分别应用于每个单词,然后将它们相加(使用溢出)。

            【讨论】:

              猜你喜欢
              • 2012-08-21
              • 2018-07-09
              • 2021-11-09
              • 2019-06-09
              • 2012-01-23
              • 2021-01-15
              • 2019-07-03
              • 1970-01-01
              • 2017-07-28
              相关资源
              最近更新 更多