Как вы можете проверить, похож ли список со строковыми значениями на другой список?

#python #list #string-comparison

Вопрос:

Я пытаюсь написать алгоритм, который берет образец заказа (строку) и извлекает из него название продукта и размер количества.

Проблема, с которой я сталкиваюсь, заключается в том, что, если образец заказа содержит множественную версию продукта, мой алгоритм не считает его совпадающим. Например, если он ищет банан и находит бананы, он не считает это бананом.

Посмотрите, как мой код может получить правильный вывод sample_order1 , но не sample_order2

 sample_order1 = 'Can I have a mango and three banana'
sample_order2 = 'Can I have a mango and three bananas'
output for sample_order1 = {'mango': 'one', 'banana': 'three'} <- correct
output for sample_order2 = {'mango': 'one'} <- incorrect (should be the same output as sample_order1 )
 

Вот мой код:

 # List of items served in the restraunt
food_names = ['banana', 'orange', 'apple', 'mango']

# Sample orders
sample_order1 = 'Can I have a mango and three banana'
sample_order2 = 'Can I have a mango and three bananas'

number = ['one', 'two', 'three', 'four', 'five']
final = {}


def order_format(sample_order, num_list, final_output):
    prev_pointer = 0
    current_pointer = 0
    so_fixed = sample_order.split()

    for num in range(0, len(so_fixed)):
        # checks if current word is in list of food names
        if so_fixed[current_pointer] in food_names:
            # if numbers from 0 - current pointer identify food or last identified food to current identified food
            # has a number anywhere in front of food
            for i in range(prev_pointer,current_pointer):
              if so_fixed[i] in num_list:
                new_quantity = so_fixed[i]
                # {found food : quantity of order}
                final_output[so_fixed[current_pointer]] = new_quantity
              else:
                # {found food : default quantity of 1}
                final_output[so_fixed[current_pointer]] = "one"
            prev_pointer = current_pointer
            current_pointer  = 1
        else:
            current_pointer  = 1
    return final_output


if any(word in sample_order1 for word in food_names):
    order_format(sample_order1, number, final)
    print(final)
# clear final{}
final = {}
if any(word in sample_order2 for word in food_names):
    order_format(sample_order2, number, final)
    print(final)
 

Комментарии:

1. Возможно, вы сможете использовать метрику расстояния Левенштейна для определения «расстояния» между парами слов (при условии, что они не слишком отличаются). Другим вариантом было бы использовать фонетический алгоритм Soundex pypi доступны некоторые сторонние модули). Наконец, вы могли бы просто посмотреть, отличаются ли эти два слова только тем, что одно заканчивается на s или es , но не на другое.

2. Спасибо, я закончил тем, что проверил, совпадут ли слова, заканчивающиеся на s/es, если они уже не совпадают. В будущем я думаю, что мог бы обучить для этого модель ML

Ответ №1:

Ваша проблема в том, что ваша программа не распознает значение слов правильно?

чтобы решить эту проблему, вы можете использовать for-loop и if утверждения и пуралы

Вот код:

 for i in range(len(food_names)):
    if food_names[i] in sample_order2 or f"{food_names[i]}s" in sample_order2 or f"{food_names[i]}es" in sample_order2 or f"{food_names[i]}'s" in sample_order2 or f"{food_names[i]}'es" in sample_order2:
        # You can place your code here