【问题标题】:Python string to a colourPython字符串到颜色
【发布时间】:2016-10-16 07:15:46
【问题描述】:

我有一个包含数千种不同颜色的数据库。我想将它们映射到列表中的一种颜色。

在这个颜色数据库只有几百个之前,我用下面的代码来管理它。现在越来越无法维护,因为这个未分类颜色的数据库正在增长,并且每周都要花很多时间来绘制地图。

我该如何改进这一点,或者有什么更好的方法?

mapped_colours = ['Red', 'Green', 'Yellow', 'Blue', 'White', 'Black', 'Pink', 'Purple'...]

colour_map_dict = {
    'olive': 'Green',
    'khaki': 'Green'
}

def classify_colour(colour):
    for mp in mapped_colours:
        if mp.lower() in colour.lower():
            return mp

    for map, colour in colour_map_dict.items():
        if map in colour.lower():
            return colour

以下是传入数据的示例。

 Resin Dark Wash Indi
 Filtered Canyon
 999 Black
 Winter White/Dove Grey
 Midnight/min
 White & black
 Green/White
 Red/White
 Multicolor
 royal blue
 Black Plum Grey
 Rose/ Gold
 Red And White
 Offwht/Gg
 Black Gunmetal
 Berry/Black
 Caramel
 Blue Stone Bleached
 All Tan
 Pale Blush
 Tee
 White / Multi
 00-black
 Flat Foundation
 Baby Blue
 Beige Melange

【问题讨论】:

  • 措辞比上次好多了:-)
  • @MartijnPieters 谢谢 :)
  • 能否将映射也存储在数据库中?
  • 在您的数据库中创建此映射并使用数据库引擎对其进行管理?
  • 这似乎是一项或多或少不可能完成的任务。在您提供的几个示例中,有几个示例无法映射到列表中的单一颜色(“Multicolor”?!)除非您可以获得所描述的实际颜色的 RGB/HSV,否则很难看看您如何以自动化的方式前进。也许您可以使用 Mechanical Turk 或 CrowdFlower 之类的工具来众包分类?

标签: python


【解决方案1】:

我会从一个不错的颜色字典开始,将名称映射到给定颜色空间(如 RGB 或 CMYK 或 HSV)中的颜色定义。互联网上有各种可用的套装;您必须预先进行工作以获取它们并将每个数据标准化以使用相同的色彩空间。您可以获得的资源越多,您的映射就越丰富;您的输入集中似乎有很多时尚颜色(油漆?布料?),而(商业)时尚总是试图通过发明新的颜色名称来区分。

由于色彩空间是有限的,因此您可以通过算法将该空间划分为一组有限的组。然后每个颜色名称将自动映射到给定的组。

环顾四周,一个好的起点是Wikipedia lists of colour namescompact list 应该很容易被机器解析,即使是在基本的 HTML 表单中,或者您可以使用 MediaWiki API 来获得更容易解析的原始格式。然后也许添加other standardised colour name dictionaries;这里的目标是获得尽可能多的名称​​所有映射到相同的颜色空间

我会将这些名称存储在数据库表中,并准备好一个简单的数学公式来将颜色空间划分为您的基本组。这样,表格中的任何颜色都可以映射到(比如说)RGB,而 RGB 可以映射到简单的名称。

接下来,build a simple spell-checker trained on your database of names,首先运行您的输入。那里有一些很难处理的数据,但是经过培训的颜色名称拼写检查器可能会将 Offwht/Gg 清理为可以匹配的内容。并使用natural text search 查找部分匹配项。

请注意,如果您的 图像 数据包含您收到的颜色名称,您会找到 most prevalent colour in that image,然后您有另一个名称(来自您的输入数据)-> 颜色空间映射使用。

【讨论】:

  • 谢谢,这似乎是我目前最好的方法。我试试看:)
  • @lennard:我添加了更多信息;一旦你有了一个颜色名称的数据库,你还可以根据这些名称构建一个拼写检查器,以将你似乎必须的许多 许多 拼写错误和缩写映射到数据库中存在的东西。
  • 拼写检查器的好主意。我没有想到。是的,我确实有图像数据,并且已经完成了根据图像找到最主要颜色的工作。这些图像是衣服,所以某些类别的工作非常好,而其他包含大量皮肤(比基尼)的我的准确度非常低。感谢您提供如此详细的答案。
  • @lennard:在这种情况下使用image classification
【解决方案2】:

一旦您拥有一个庞大的姓名数据库来纠正答案(请参阅 Martijn 的回答),您就可以使用该数据库来训练分类算法,例如来自 scikit-learn 的分类算法:

#!/usr/bin/env python3

from sklearn import svm
from sklearn.feature_extraction.text import CountVectorizer

mapped_colours = ['Red', 'Green', 'Yellow', 'Blue', 'White', 'Black', 'Pink', 'Purple']

colour_map = [
    ('olive', 'Green'),
    ('khaki', 'Green'),
    ('snow white', 'White'),
    ('alice white', 'White'),
    ('pale blush', 'Pink'),
    ('baby blue', 'Blue'),
    ('midnight', 'Blue'),
    # ...and so on and so on - you'll need a lot of these
]

# A classifier classifies inputs into categories (colors in this case)
clf = svm.SVC(gamma=0.001, C=100.)

# A vectorizer turns strings into arrays which can be used as input
vectorizer = CountVectorizer()

# Train both the classifier and the vectorizer. This can take some time.
training = vectorizer.fit_transform([k for (k, v) in colour_map])
clf.fit(training, [mapped_colours.index(v) for (k, v) in colour_map])

# Predict some colors!
while True:
    query = input('Enter a color: ')
    guess = clf.predict(vectorizer.transform([query]))[0]
    print('Maybe', mapped_colours[guess])

示例运行:

输入颜色:雪
也许是白色
输入颜色:深卡其色
也许是绿色
输入颜色:婴儿卧室
也许是蓝色

如果您的输入数据已经是 RGB 格式,您也可以让您的模型尝试预测 RGB 颜色,并在那里工作。

由于输入非常短,分类器可能不会变得很聪明,但如果数据库足够大,它可能会使添加颜色的工作更容易一些:如果分类器猜测正确,只需将其猜测添加为一种颜色。如果没有,您仍然需要手动对其进行分类,但分类器会在以后的运行中选择正确的答案。


免责声明:我不确定 SVC 是否适合(呵呵)解决您的问题,但它可能足够好,值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2012-03-16
    • 2012-04-13
    • 2021-03-16
    相关资源
    最近更新 更多