Как искать шаблон строк по списку строк и возвращать соответствующие индексы? - PullRequest
0 голосов
/ 03 апреля 2020

Я уже думал о некоторых решениях, чтобы попытаться решить проблему, но ни одно из них не кажется мне подходящим. Я объясню:

Давайте представим, что у нас есть следующий список строк (последовательность тегов PoS из части речевого тегирования):

['PROPN', 'AUX ',' ADV ',' VERB ',' SCONJ ',' PROPN ',' AUX ',' NOUN ',' CCONJ ',' PROPN ',' AUX ',' NOUN ',' PUNCT ']

Моя цель - найти следующий шаблон в списке:

PROPN - AUX - (НИЧЕГО МЕЖДУ) - PUNCT

путем возврата этих двух возможные результаты:

[0,1,2,3,4,5,6,7,8,9,10,11,12] и [9,10 , 11,12]

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

Соответствующие индексы связаны только с индексами символов этой строки, и после этого будет недостаточно (на мой взгляд) конвертировать эти индексы в индексы позиций слов в Оригинальный список. Важно поддерживать целостность токенизации, которая выполняется в начальном списке.

Буду признателен, если кто-нибудь предложит мне решение этой проблемы.

Заранее спасибо.

1 Ответ

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

Это возможное решение в Python:

def match_indexes(probelist, head=['PROPN', 'AUX'], tail=['PUNCT']):
    """ returns a list with all indexes in a list of strings that matches 
        prefix and tail 
    """
    result=list()
    step = len(head)
    last = len(probelist) - len(tail)
    if (step + len(tail) <= len(probelist)):
        for i in range(0,last):
            if (probelist[i:i+len(head)] == head):
                for j in range (i+step,last + 1):
                    if probelist[j:j+len(tail)] == tail:
                        result.append(list(range(i,j+len(tail))))
    return result

Обратите внимание, что все аргументы передаются в виде списков. Вы можете начать отсюда.

Пример вывода:

test = ['PROPN', 'AUX', 'ADV', 'VERB', 'SCONJ', 'PROPN', 'AUX', \
          'NOUN', 'CCONJ', 'PROPN', 'AUX', 'NOUN', 'PUNCT']

print( match_indexes(test)) 
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12], [5, 6, 7, 8, 9, 10, 11, 12], [9, 10, 11, 12]]

print(match_indexes(test,head=['NOUN'])) 
[[7, 8, 9, 10, 11, 12], [11,12]]

print(match_indexes(test, head=['NOUN'], tail=["PROPN"]))
[[7, 8, 9]]

print(match_indexes(test, head=['PROPN', 'NOUN'], tail=["PROPN"])) 
[]

test = [] print(match_indexes(test))
[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...