Объединение значений в списке кортежей в Python для сохранения ожидаемого формата вывода - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть список кортежей. Каждый кортеж состоит из строки и слова. Теперь каждый диктант в этом состоит из списка кортежей. Размер списка составляет около 8 000 записей.

Пример данных:

dataset = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT'), (12, 19, 'PRODUCT')]}),('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (12, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]

Отсюда ожидается вывод:

dataset = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT')]}), ('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]

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

newinput = [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT'), (12, 19, 'PRODUCT'),(10, 15, 'PRODUCT'), (12, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]

# using set 
visited = set() 

# Output list initialization 
Outputs = [] 

# Iteration 

for a, b, c in newinput:
    if not a in visited:
        # print(a)
        visited.add(a)
        # print(visited)
        Outputs.append((a, b,c))
# print(Outputs)
    # elif not b in visited:
    #     visited.add(b) 
    #     Output.append((a, b,c))
    # else:
    #     pass

agn = []        
newv = set()    
for a, b, c in Outputs:
    # print(b)
    if not b in newv:
        newv.add(b)
        # print(newv)
        agn.append((a,b,c))

print(agn)
#Output:
#[(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT'), (10, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]

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

1 Ответ

0 голосов
/ 29 апреля 2020

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

# dataset = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT'), (12, 19, 'PRODUCT')]}),('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (12, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]
# NEW DATA SET BASED ON COMMENT
dataset = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT'), (12, 19, 'PRODUCT')]}),('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (17, 20, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]


seen_values = []
clean_data = []

# loop through each sentence and dict of values
for sentence, values in dataset:
    for value in values['entities']:

        if value[0] in seen_values:
            # remove if we have seen this before
            values['entities'].remove(value)
        else:
            # add to list if we have not seen this before
            seen_values.append(value[0])
    clean_data.append((sentence, values))

    # ADDED TO ADDRESS REQUEST IN THE COMMENTS
    seen_values = []

print(clean_data)

Вывод:

# clean_data = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT')]}), ('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]

# NEW DATA SET OUTPUT
clean_data = [('made of iron oxide', {'entities': [(12, 16, 'PRODUCT'), (17, 20, 'PRODUCT'), (15, 24, 'PRODUCT')]}), ('made of ferric oxide', {'entities': [(10, 15, 'PRODUCT'), (17, 20, 'PRODUCT'), (624, 651, 'PRODUCT'), (1937, 1956, 'PRODUCT')]})]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...