Найти порядок, в котором подстроки упоминаются в тексте - PullRequest
0 голосов
/ 06 апреля 2020

'У меня есть список подстрок (каждая может содержать несколько токенов). Я хочу найти в тексте в качестве примера, скажем, мой список подстрок:

[
    'apple',
    'banana smoothie',
    'citrus orange fruit'
]

У меня также есть список фрагментов текста, который может не содержать ни одной, некоторых или всех подстрок, вот несколько возможных примеров:

[
    'I like apple',
    'I like apple and banana smoothie',
    'I like banana smoothie, apple and citrus orange fruit',
    'I like none',
    'I like citrus orange fruit and apple'
]

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

[    
    ['apple']
    ['apple', 'banana smoothie'],
    ['banana smoothie', 'apple', 'citrus orange fruit'],
    [],
    ['citrus orange fruit', 'apple']
]

Я могу только представить, что могу сделать это с помощью какого-то подхода со скользящим окном, но я надеюсь, что есть более простое решение

Ответы [ 4 ]

1 голос
/ 06 апреля 2020

На самом деле, re.findall уже должен обработать это требование:

terms = ['apple', 'banana smoothie', 'citrus orange fruit']
inp = 'I like banana smoothie, apple and citrus orange fruit'
regex = r'\b(?:' + '|'.join(terms) + r')\b'
matches = re.findall(regex, inp)
print(matches)

Это печатает:

['banana smoothie', 'apple', 'citrus orange fruit']

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

1 голос
/ 06 апреля 2020

Вы можете сгенерировать регулярное выражение из списка строк поиска, а затем использовать re.findall, чтобы найти все вхождения этих строк в каждом тексте:

import re

search = [
    'apple',
    'banana smoothie',
    'citrus orange fruit'
]

regex = re.compile(r'\b' + '|'.join(search) + r'\b', re.I)

text = [
    'I like apple',
    'I like apple and banana smoothie',
    'I like banana smoothie, apple and citrus orange fruit',
    'I like none',
    'I like citrus orange fruit and apple'
]

res = [regex.findall(t) for t in text]

print(res)

Вывод:

[
 ['apple'],
 ['apple', 'banana smoothie'],
 ['banana smoothie', 'apple', 'citrus orange fruit'],
 [],
 ['citrus orange fruit', 'apple']
]
0 голосов
/ 06 апреля 2020

Поскольку слова - это список слов, который вы указали, а строки - это список строк, это должно работать для вас:

def getSequence(words, string):
    sequence = dict()
    for word in words:
        try:
            sequence[string.index(word)] = word
        except:
            pass

    indices = list(sequence.keys())
    indices.sort()

    return [sequence[idx] for idx in indices]

for string in strings:
    print(getSequence(words, string))
0 голосов
/ 06 апреля 2020

Попробуйте

>>> [[sub for sub in substrings if sub in s] for s in strings]
[['apple'], ['apple', 'banana smoothie'], ['apple', 'banana smoothie', 'citrus orange fruit'], [], ['apple', 'citrus orange fruit']]

Предполагая, что substrings это ваш список подстрок, а strings это ваш список полных строк.

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