Проверьте, существуют ли элементы списка со словами и фразами в другом списке - PullRequest
0 голосов
/ 01 мая 2020

У меня есть список слов и фраз:

words = ['hi', 'going on', 'go']

И у меня есть расшифровка:

transcript ="hi how are you. I am good. what's going on.".split('.')

Мне нужно найти совпадения в этом транскрипте. Для приведенного выше примера совпадения находятся в первом и третьем элементах стенограммы.

Я следовал за ответами здесь и пытался использовать следующий код:

for i in range(len(transcript)):
    if any(word in transcript[i] for word in words):
        print(i)

Его вывод:

1
2
3

Но это это не то, что я хочу. Я хочу исключить предложения «я хороший» из вывода. Ожидаемый результат:

1
3

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Вы можете попробовать

for i in range(len(transcript)):
    if any(word in [i for i in transcript[i].split(" ")] if len(word.split(" ")) < 2 else word in transcript[i] for word in words):
        print(i+1)

Это выдаст

1
3

Этот код не будет проверять, является ли слово только частью транскрипта [i], как 'go «хорошо».

0 голосов
/ 01 мая 2020

Проблема в том, что вы не ограничиваете свой поиск целыми выражениями. Это означает, что любое слово, которое может появиться как подстрока другого слова (например, "go" является подстрокой слова "good"), будет рассматриваться как совпадение.

Это потребует использования регулярных выражений (модуль re)

В качестве альтернативы вы можете преобразовать все не-буквенные символы в пробелы, а затем выполнить поиск с пробелами вокруг слов и текста, чтобы найти только целое слово (целые выражения в вашем случае ).

Например:

# translation table for all non-letters to spaces
from string import printable,ascii_letters
spaces     = str.maketrans({nl:" " for nl in set(printable)-set(ascii_letters)})

words       = ['hi', 'going on', 'go']
paddedWords = [f" {word} " for word in words]

transcript = "hi how are you. I am good. what's going on.".split('.')
for i,text in enumerate(transcript,1):
    paddedText = f" {text.lower().translate(spaces)} "
    if any( word in paddedText for word in paddedWords):
        print(i)

# 1
# 3
0 голосов
/ 01 мая 2020

Ошибка есть, потому что go присутствует как подстрока в I am good.

. Вы можете попробовать это в if условии: -

if any(word in transcript[i].split() if len(word.split()) < 2 else word in transcript[i] for word in words):
    print(i+1)

Это даст Вам желаемый вывод.

1
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...