Как мне сравнить пары в списке в Python? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь перебрать объединенный список из двух списков, который, по сути, представляет собой пакет слов - пример выводит выходы [('brexit', 11), ('say', 11), ('uk', 7), ('eu', 6), ('deal', 5), ('may', 5), ..., ('brexit', 35), ('say', 28),, ('may', 5), (' uk ', 1), ...]

Собрав все текстовые входные данные из файлов .txt, я удалил стоп-слова и с помощью stemming удалил дублирующиеся слова из времен.

Следующим шагом, который я хочу сделать, является циклический просмотр списка и поиск различий в количестве появлений данного слова - я бы хотел, чтобы 'brexit', 'say' и 'uk' были помеченыкак значимые слова с двумя числами появлений или просто разницей.Мой старт кода (частично python, частично псевдокод) приведен ниже.

def findSimilarities (word, count):
    for (word, count) in biasDict:
        if word == word and count != count:
            print (word, count - count)
        elif word ==word and count == count:
            del (word, count)
        (word, count)++

Какой-нибудь совет, как подойти к этому и отредактировать код для работы?Если бы это было лучше, я мог бы сделать так, чтобы слова приходили из двух отдельных списков (как они создаются; я связал их после того, как они были созданы).

Большое спасибо.

Ответы [ 3 ]

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

Идея комбинирования событий кажется мне подходящей.Вот моя реализация.Любой комментарий или оптимизация приветствуются.

def merge_list(words_count_list):
updated_list = list()
words_list = list()
for i in range(len(words_count_list)):
    word = words_count_list[i][0]
    count = words_count_list[i][1]
    if word not in words_list:
        words_list.append(word)
        for j in range(i+1,len(words_count_list),1):
            if word == words_count_list[j][0]:
                count += words_count_list[j][1]
        updated_list.append((word,count))
return updated_list

print(merge_list([('brexit', 11), ('say', 11), ('uk', 7), ('eu', 6), ('deal', 5), ('may', 5), 
                                                ('brexit', 35), ('say', 28),('may', 5), ('uk', 1)]))

вывод:

[('brexit', 46), ('say', 39), ('uk', 8), ('eu', 6), ('deal', 5), ('may', 10)]

Теперь вы можете указать порог для количества слов, отсортировать по количеству, а затем удалить наиболее значимые слова.

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

Если у вас есть два списка слов, то вы можете сделать

#Converts list of tuples to dictionary.
#[('a',1'),('b',2)] => {'a':1,'b',2}
def tupleListToDict(list):

    dictobj = {}
    for item in list:
        dictobj[item[0]] = item[1]
    return dictobj

def findSimilarities(list1, list2):
    dict1 = tupleListToDict(list1)
    dict2 = tupleListToDict(list2)
    dict3 = {} #To store the difference
    #Find occurence of key in 2nd dict, if found, calculate the difference
    for key, value in dict1.items():
        if key in dict2.keys():
            dict3[key] = abs(value - dict2[key])
    return dict3

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

list1 = [('brexit', 11), ('say', 11), ('uk', 7), ('eu', 6), ('deal', 5), ('may', 5)]
list2 = [('brexit', 35), ('say', 28), ('may', 5), ('uk', 1)]
print(findSimilarities(list1, list2))
{'brexit': 24, 'say': 17, 'uk': 6, 'may': 0}
0 голосов
/ 10 февраля 2019

Это будет вариант.Неэффективно, но вывод по желанию.То есть, если вы хотите удалить слова с тем же количеством (как показано в вашем коде).Если вы хотите сохранить записи, просто пропустите часть biasDict.remove ().Если вас просто интересуют слова, встречающиеся дважды с другим счетом, вы можете добавить кортежи в новый список вместо того, чтобы печатать разницу.После этого верните новый список.

import numpy as np

def findSimilarities (biasDict):
    similarities = {}
    #remove_later = []
    for i in range(0, len(biasDict)):
        word, count = biasDict[i][0], biasDict[i][1]
        for c in range(0, len(biasDict)):
            word_compare, count_compare = biasDict[c][0], biasDict[c][1]
            if c==i:
                pass #Same entry
            elif word == word_compare and count != count_compare:
                delta = count - count_compare
                if word not in similarities and delta != 0:
                    similarities[word] = np.abs(delta)
            #elif word == word_compare and count == count_compare and (word, count) not in remove_later:
            #    remove_later.append((word, count))
    #for entry in remove_later:
    #    biasDict.remove(entry)
    return similarities
biasDict =  [('brexit', 11), ('say', 11), ('uk', 7), ('eu', 6), ('deal', 5), ('may', 5), ('brexit', 35), ('say', 28), ('may', 5), ('uk', 1)]
print(findSimilarities(biasDict))

Вывод:

{'brexit': 24, 'say': 17, 'uk': 6}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...