与字符串匹配的单词

时间:2015-04-14 10:14:03

标签: python

我试图将一些字符串/字符串与字符串匹配到一个类别。我已经创建了一个简单的例子,说明我正在尝试做什么以及我遇到的问题。

我正在尝试根据单词进行匹配,并为匹配指定一个类别,然后选择匹配率最高的类别。

不止一个类别的问题可以具有最高价值,我的代码只选择列表中的第一个。获得两个项目然后再次开始检查字典似乎是错误的。

如果我正朝着正确的方向前进,或者有更好的方法,有人可以建议我吗?

categorys = {
    'fruits': ['apple', 'banana', 'orange', 'pear'],
    'chocolate': ['mars', 'kitkat', 'areo'],
    'drinks': ['coffee', 'tea', 'orange', 'coke']
}

# create a diction of points for each category and set to 0
points = {}
for key, value in categorys.items():
    points[key] = 0

# calulate points for category
# key = category, value = style
for key, values in categorys.items():
    if 'orange' in key.lower() or 'drink' in values:
        points[key] += 1

# get category with the highest point although it just grabs the first item
calculated_category = max(points.iterkeys(), key=(lambda key: points[key]))
print calculated_category

修改

更新了答案中的代码

    categorys = {
    'fruits': ['apple', 'banana', 'orange', 'pear'],
    'chocolate': ['mars', 'kitkat', 'areo'],
    'drinks': ['coffee', 'tea', 'orange', 'coke']
}

# create a diction of points for each category and set to 0
points = {}
for key, value in categorys.items():
    points[key] = 0

# calulate points for category
# key = category, value = style
for key, values in categorys.items():
    if 'drink' in key.lower()
        points[key] += 1
    if 'orange' in values:
        points[key] += 1

# get category with the highest point although it just grabs the first     item
# max(points.iterkeys(), key=(lambda key: points[key]))
max_value = max(points.values())
[k for k, v in points.iteritems() if v == max_value]

4 个答案:

答案 0 :(得分:0)

您可以使用max获取最大points值,然后使用列表推导来获取具有该值的所有项目。

max_value = max(points.values())
calculated_category = [k for k, v in points.iteritems() if v == max_value]
print calculated_category

输出为['fruits', 'drinks', 'chocolate'],如您的示例所示,它们似乎都具有相同的points 0值;不确定这是故意还是其他问题。如果您将条件更改为if 'drink' in key.lower() or 'orange' in values:,这似乎更有意义,那么输出为['fruits', 'drinks']

答案 1 :(得分:0)

我在考虑您的输入将是: -

  1. 水果,香蕉
  2. 饮料,茶......等。
  3. 您可以继续: -

    cat, item = raw_input()  #you enter fruits, banana
    for key, values in categorys.items():
        if cat == key.lower() and item in values:
            points[key] += 1
    
    # get category with the highest point although it just grabs the first item
    calculated_category = max(points.items(), key = lambda item_tuple: item_tuple[1])
    print calculated_category 
    

答案 2 :(得分:0)

代码中的一些附加点:

  1. 字典理解创建字典:
  2. 演示:

    >>> points = { key:0 for key in categorys }
    >>> points
    {'fruits': 0, 'drinks': 0, 'chocolate': 0}
    >>> 
    

    1. 使用集合模块创建默认的int字典
    2. 无需为每个键分配0值。 Link

      演示:

      >>> import collections
      >>> points = collections.defaultdict(int)
      >>> points["drink"]
      0
      >>> points["drink"] += 1
      >>> points["drink"]
      1
      

      1. 使用iteritems()方法迭代键和值字典(iteams()将返回元组列表)

答案 3 :(得分:0)

如果您想要针对您的类别测试许多像"orange""drink"这样的字词,我建议制作另一个字词,从字词映射到类别列表(反之)你当前的词典)这将允许您进行非常快速的测试,以查看单词所在的类别(如果有),而无需进行大量迭代。

from collections import Counter

categorys = {
    'fruits': ['apple', 'banana', 'orange', 'pear'],
    'chocolate': ['mars', 'kitkat', 'areo'],
    'drinks': ['coffee', 'tea', 'orange', 'coke']
}

words_to_cats = {}
for cat, words in categorys.items():
    for word in words:
        words_to_cats.setdefault(word, []).append(cat)

def find_best_category(iterable_of_words):
    score = Counter()
    for word in iterable_of_words:
        score.update(words_to_cats.get(word, [])) # count matches in the word list

        for cat in categorys: # check for partial matches in the category name
            if word in cat:
                score[cat] += 1

    return score.most_common(1)

请注意,这将只返回一个项目,如果有一个确切的关​​系,它将在得分最高的那些中任意选择一个获胜类别。在您的示例中(输入为['orange', 'drink']),没有关系,它会选择"drinks",因为这两个词都与该类别匹配(一个与“橙色”相关,一个在与类别名称的部分匹配。)