Хотите целое число, получая кортежи? - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь использовать простую систему ценностей (очень упрощенную и не ожидающую замечательных результатов) для оценки «настроений» в документе.

Я построил цикл for, используя defaultdict (int), но я просто вертел руки в коде, и он всплывал с кортежами вместо целого числа, давая значение каждому найденному слову, а не суммируя по строке как я и предполагал. (Я ОЧЕНЬ новичок во всем этом и совершенно потерян. Пожалуйста, не ненавидите меня?)

positive = ['accurate','adore','agree','amazed','amazingly','amazing','award worthy',  'awesome','beautiful', 'better','breathtaking','cool', 'enjoy','excited', 'exciting','fantastic',  'friend','glad','good','handpicked', 'handsome', 'happy','hopeful','impressive','improved', 'incredible','like', 'love', 'relieved','right']
negative = ['angry','annoyed','annoying','awful','badly', 'bad','butcher', 'careless','disagree', 'disappointed','disgusting','dislike', 'gross','hated', 'hate', 'horrible','horribly','mutilated','ruin', 'sad','terrible', 'terribly', 'thoughtless','ugh','ugly','unrealistic','worse','worst','wrong']
shifters = ['but','don’t', 'however', 'not']
intensifiers = ['awfully','completely','incredibly', 'majorly','really','seriously','so','wow']


def value_eval(doc):
    value = defaultdict(int)
    for line in doc:
        for word in line:
            if word in positive:
                value[line[0]] += 1
            if word in negative:
                value[line[0]] - 1
            if word in intensifiers:
                value[line[0]] * 1.25
            if word in shifters:
                value[line[0]] * -1.25
    return value

Я надеялся на добавленную стоимость всех строк, но получилось что-то вроде:

defaultdict(int,
            {'I': 75,
             ';': 179,
             'But': 13,
             'With': 0,
             'Tolkien': 3,
             'And': 9,
             'even': 1,
             'no': 0,
             '“': 1,
             'You': 5,
             'They': 9,
             'Sure': 5,
             'it': 7,
             'He': 16,
             'Like': 2,
             'Why': 0,
             'Totally': 0,
             'Looks': 3,
             'Instead-': 0})

но намного дольше.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

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

def value_eval(doc):
    value = defaultdict(int)
    for lineNumber, line in enumerate(doc):
        value = 0
        for word in line:
            if word in positive:
                value += 1
            if word in negative:
                value -= 1
            if word in intensifiers:
                value *= 1.25
            if word in shifters:
                value *= -1.25
        value[lineNumber] = value
    return value

Если вы хотите, чтобы ключи в вашем результате были чем-то отличным от номеров строк, то вам просто нужно сделать что-то еще со 2-й по последнюю строку.

Интересно, что вы думаете? Чтобы это работало, doc должен быть неким итеративным (строки), где каждое значение внутри него также является итерируемым (слова). Если бы doc был, например, дескриптором входного файла, это не сработало бы.

0 голосов
/ 21 апреля 2019

Отредактировано, чтобы включить значение по строкам, которые я пропустил, пока не увидел другой пост.Я думал, что его понимание было немного лучше, но мне пришлось разделить строку пробелами, чтобы правильно добраться до слов против итерации символов.

def value_eval():
    value = 0
    line_values = defaultdict(int)
    with open('doc.txt', 'r') as f:
        lines = f.readlines()
    for lineNumber, line in enumerate(lines):
            words = line.split()
            for word in words:
                if word in positive:
                    print(line)
                    value += 1
                if word in negative:
                    value -= 1
                if word in intensifiers:
                    value *= 1.25
                if word in shifters:
                    value *= -1.25
                line_values[lineNumber] = value
    return line_values

defaultdict (int) собирается создать словарь, в котором значение является целым числом для каждого нажатия клавиши.

value[line[0]] += 1 добавляет первое слово каждой строки вваш словарь в качестве ключа и увеличенная часть назначения в качестве значения для этого ключа.

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

def get_avg_page_value(doc_values, total_lines, pages ):
    values = 0
    for x in range(total_lines):
        values += doc_values[x]
    print("average: {}".format(values/pages))

doc_values = value_eval()
lines_per_page = 20
total_lines = len(doc_values.values())
pages = int(total_lines/lines_per_page)
get_avg_page_value(doc_values, total_lines, pages)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...