Как найти строку из нескольких слов и пометить ее в Python? - PullRequest
0 голосов
/ 26 ноября 2018

Например, предложение "The corporate balance sheets data are available on an annual basis", и мне нужно пометить "corporate balance sheets", который является подстрокой, найденной в данном предложении.

Итак, шаблон, который мне нужно найти:

"corporate balance sheets"

С учетом строки:

"The corporate balance sheets data are available on an annual basis".

Последовательность меток вывода, которую я хочу, будет:

[0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]

Существует несколько предложений (более 2 ГБ),и кучу шаблонов, которые мне нужно найти.Я понятия не имею, как сделать это эффективно в Python.Может кто-нибудь дать мне хороший алгоритм?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Поскольку все слова в подстроке должны совпадать, вы можете использовать all, чтобы проверить это и обновить соответствующие индексы при повторении предложения:

def encode(sub, sent):
    subwords, sentwords = sub.split(), sent.split()
    res = [0 for _ in sentwords]    
    for i, word in enumerate(sentwords[:-len(subwords) + 1]):
        if all(x == y for x, y in zip(subwords, sentwords[i:i + len(subwords)])):
            for j in range(len(subwords)):
                res[i + j] = 1
    return res


sub = "corporate balance sheets"
sent = "The corporate balance sheets data are available on an annual basis"
print(encode(sub, sent))
# [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]

sent = "The corporate balance data are available on an annual basis sheets"
print(encode(sub, sent))
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 голосов
/ 26 ноября 2018

Понимание списка и использование разделения:

import re
lst=[]
search_word = 'corporate balance sheets'
p = re.compile(search_word)
sentence="The corporate balance sheets data are available on an annual basis"

lst=[1 for i in range(len(search_word.split()))]
vect=[ lst if items == '__match_word' else 0 for items in re.sub(p,'__match_word',sentence).split()]
vectlstoflst=[[vec] if isinstance(vec,int) else vec for vec in vect]
flattened = [val for sublist in vectlstoflst for val in sublist]

Вывод:

 [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]

Предложение = "Данные по корпоративным балансамдоступны на ежегодной основе листы "

Выход

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