Найти целую часть элемента списка, а не части, в строке? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть словарь ключей и значений (массивно усеченный для удобства чтения):

responsePolarities = {'yes':0.95, 'hell yes':0.99, 'no':-0.95, 'hell no':-0.99, 'okay':0.70}

Я проверяю, есть ли какой-либо ключ в строке, переданной моей функции:

for key, value in responsePolarities.items():
    if key in string:
        return value

Проблема в том, что если в переданной строке есть слово типа «знать», функция видит «нет» в слове «знает» и возвращает -0,95.

Я не могу добавить пробелы вокруг клавиши «нет», потому что это может быть единственным ответом.

Как я могу заставить функцию видеть «нет» как «нет», но не «знать»?Правильно ли я считаю, что это, вероятно, будет работа RegExp, или я упускаю что-то более простое?

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

1 Ответ

0 голосов
/ 07 июля 2019

Если я правильно понимаю, вы хотите сопоставить текст, содержащий ваши ключи, но только если все слово совпадает.Вы можете сделать это, используя разделитель границ регулярного выражения \b.Он будет совпадать, когда слово отделено пунктуацией, например :no,, но не другими словами, например know.Здесь вы перебираете несколько строк и для каждого находите соответствующие ключи в словаре:

responsePolarities = {'yes':0.95, 'hell yes':0.99, 'no':-0.95, 'hell no':-0.99, 'okay':0.70}

strings = [
    'I know nothing',
    'I now think the answer is no',
    'hell, mayb yes',
    'or hell yes',
    'i thought:yes or maybe--hell yes--'
]

for s in strings:
    for k,v in responsePolarities.items():
        if re.search(rf"\b{k}\b", s):
            print(f"'{s}' matches: {k} : {v}")

'I know nothing' не должно ничего совпадать.Совпадения должны выглядеть следующим образом:

«Теперь я думаю, что ответ« нет »»: нет: -0,95
совпадения «черт, может да»: да: 0,95
или чертда 'соответствует: да: 0,95
' или ад да 'соответствует: ад да: 0,99
' я подумал: да или возможно - ад да-- 'соответствует: да: 0,95
' я подумал:да или возможно - черт возьми да - 'соответствует: ад да: 0,99

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

...