想要一个整数,获取元组?

时间:2019-04-21 02:00:48

标签: python nltk

我正在尝试使用一个简单的价值系统(非常简单,不会期望获得出色的结果)来衡量文档中的“情感”。

我使用defaultdict(int)构建了一个for循环,但我只是在代码中挥舞着双手,它弹出时显示了元组而不是整数,为找到的每个单词赋予了价值,而不是逐行汇总如我所料(我对这一切非常陌生,很迷失。请不要恨我吗?)

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 个答案:

答案 0 :(得分:1)

我不知道您想要的结果字典中的键是什么,但是假设您想要行号,我想这就是您在想的:

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

如果您希望结果中的键不是行号,则只需要在倒数第二行进行其他操作即可。

我想知道您的输入是什么。为此,doc必须是某种可迭代的(行),其中的每个值也是可迭代的(字)。例如,如果doc是输入文件句柄,则将无法使用。

答案 1 :(得分:0)

经过编辑,可以按我错过的行来包含价值,直到看到另一篇文章为止。我以为他的理解要好一些,但是我不得不用空格将行分开以正确理解单词与迭代字符。

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)