Python: найти комбинацию ключевых слов в тексте - PullRequest
0 голосов
/ 26 февраля 2019

Я использую следующую функцию, чтобы определить, есть ли в тексте слова (или выражения) из списка:

def is_in_text(text, lista=[]):
    return any(i in text for i in lista)

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

text_a = 'There are white clouds in the sky'
print(is_in_text(text_a, ['clouds in the sky']))

Вернет

True

Это работает, если меня интересуют тексты, в которых упоминаются «облака» и «небо».Однако, если текст немного меняется, я больше не могу его обнаружить.Например:

text_b = 'There are white clouds in the beautiful sky'
print(is_in_text(text_b, ['clouds in the sky']))

Вернет значение False.

Как я могу изменить эту функцию, чтобы иметь возможность находить тексты, содержащие оба слова, но не обязательно в заданном порядке?В этом примере я хотел бы искать «облака» + «небо».

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Лучший способ сделать это - сначала преобразовать текст в список, например,

a = ["white", "clouds"]

. Затем укажите список ключевых слов:

b = ["clouds", "red"]

Затем выполните:

>>> set(a).intersection(b)

, который возвращает:

{'clouds'}

0 голосов
/ 26 февраля 2019

Вы можете переписать is_in_text, чтобы проверить, что каждое слово в любом списке слов, которые вы хотите проверить, находится в строке:

def is_in_text(text, lista=[]):
    isin = True
    for word in lista:
        isin = isin and (word in text)
    return isin

Например,

text_a = 'There are white clouds in the sky'
print(is_in_text(text_a, ['cloud', 'sky']))

возвращаетTrue

, в то время как

text_a = 'There are white clouds in the sky'
print(is_in_text(text_a, ['dog', 'sky']))

возвращает False

Это требует, чтобы вы знали, каким словам вы хотите сопоставить две строки.Если вы хотите проверить все слова в вашей строке, вы можете разбить ее на пробелы.

Например,

text_b = 'There are white clouds in the beautiful sky'
print(is_in_text(text_b, 'clouds in the sky'.split(' ')))

теперь возвращается True

Редактировать:

Итак, я думаю, вам, вероятно, следует переосмыслить то, что вы пытаетесьделать, так как это будет довольно хрупким, но в зависимости от того, что вы описываете, это работает:

def is_in_text(text, lista=[]):
    isin = False
    for string in lista:
        sub_isin = True
        for substr in string.split(' '):
            sub_isin = sub_isin & (substr in text)

        isin = isin or sub_isin
    return isin

Например

text_a = 'There are white clouds in the sky'
print(is_in_text(text_a, ['rain', 'cloud sky']))

оценивается как True

в то время как

text_a = 'There are white clouds in the sky'
print(is_in_text(text_a, ['rain', 'dog sky']))

оценивается как False

...