Группировать строки со значениями в Python - PullRequest
4 голосов
/ 08 марта 2019

Я работаю над хэштегами в твиттере и уже подсчитал, сколько раз они появляются в моем csv-файле.Мой CSV-файл выглядит следующим образом:

GilletsJaunes, 100
Macron, 50
gilletsjaune, 20
tax, 10

Теперь я хотел бы сгруппировать 2 близких термина, таких как «GilletsJaunes» и «gilletsjaune», используя библиотеку fuzzywuzzy.Если близость между двумя терминами превышает 80, то их значение добавляется только в один из двух терминов, а другой удаляется.Это даст:

GilletsJaunes, 120
Macron, 50
tax, 10

Для использования "fuzzywuzzy":

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

fuzz.ratio("GiletsJaunes", "giletsjaune")
82 #output

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Сначала скопируйте эти две функции , чтобы иметь возможность вычислить argmax:

# given an iterable of pairs return the key corresponding to the greatest value
def argmax(pairs):
    return max(pairs, key=lambda x: x[1])[0]


# given an iterable of values return the index of the greatest value
def argmax_index(values):
    return argmax(enumerate(values))

Во-вторых, загрузите содержимое вашего CSV в словарь Python и выполните следующие действия:

from fuzzywuzzy import fuzz

input = {
    'GilletsJaunes': 100,
    'Macron': 50,
    'gilletsjaune': 20,
    'tax': 10,
}

threshold = 50

output = dict()
for query in input:
    references = list(output.keys()) # important: this is output.keys(), not input.keys()!
    scores = [fuzz.ratio(query, ref) for ref in references]
    if any(s > threshold for s in scores):
        best_reference = references[argmax_index(scores)]
        output[best_reference] += input[query]
    else:
        output[query] = input[query]

print(output)

{'GilletsJaunes': 120, 'Macron': 50, 'tax': 10}

0 голосов
/ 08 марта 2019

Это решает вашу проблему.Вы можете уменьшить входную выборку, сначала преобразовав теги в нижний регистр.Я не уверен, как работает fuzzywuzzy, но я подозреваю, что «HeL10», «привет» и «HELLO» всегда будут больше 80, и они представляют одно и то же слово.

import csv
from fuzzywuzzy import fuzz

data = dict()
output = dict()
tags = list()

with open('file.csv') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for row in csvReader:
        data[row[0]] = row[1]
        tags.append(row[0])

for tag in tags:
    output[tag] = 0
    for key in data.keys():
        if fuzz.ratio(tag, key) > 80:
            output[tag] = output[tag] + data[key]
...