【问题标题】:Create a dictionary from a file and adding values从文件创建字典并添加值
【发布时间】:2020-06-14 22:17:37
【问题描述】:

*更新,因为我之前的帖子已被删除并且出现错误。

我必须打开一个文本文件并将其导入字典。文本文件包含两条信息:产品 ID 和一串客户评论。我的目标是阅读提供的客户反馈,并计算每个产品 ID 的评论中出现好或坏关键字的次数。请注意,某些产品评论包含两次相同的好/坏词。

我的最终目标是能够显示每个产品出现的好词和坏词的数量。然后我将把好的和坏的关键词加在一起来显示总的关键词。我有以下用户帮助我整理的内容,但我被困在柜台上。另外,我最初创建了一个class,但被告知这没有必要。

当我试图通过字典中的 for 循环来计算每个好词和坏词的实例时,我的代码给了我一个 KeyError。 另外,我的计数器似乎设置不正确

我的问题是,如何正确创建一个计数器来计算每个产品 ID 的好词和坏词的总数?计数器必须考虑重复单词。

dictionary = {}
good = ("perfect", "nice")
bad = ("broken", "wrong", "terrible")     
with open("products.txt","r") as products:
    for line in products:
        p = line.split(',',1)[0]
        f = line.split(',',1)[1]
        dictionary[p] = v.lower()
print(products)

for c in dictionary:
    for word in dictionary[c].f().split():
        if word in good:
            dictionary[c]+=1
        if word in bad:
            dictionary[c]+=1

for k in dictionary.keys():
    print(dictionary[k].productID,dictionary[k].good,dictionary[k].bad)

文本文件的前几行内容如下:

4321,物品在收到时损坏。糟糕的产品。
5432,不错的产品。
6321,我收到了错误的物品。现在我被告知我不能退回错误的物品。多么可怕!

【问题讨论】:

  • 欢迎来到 Stack Overflow。请使用tour 并阅读How to Ask。您已经告诉我们您想做什么(尽管这有点令人困惑),但您还没有提出任何问题。您向我们展示的代码有什么问题?它以什么方式无法做到你想要的?
  • ...您现在已向您的问题添加了一条错误消息。请始终,始终在此处提问时包含错误消息。他们在那里是有原因的,我们不应该要求他们。现在,不仅仅是告诉我们“我的代码在...时给了我一个 KeyError”,确切、完整的回溯是什么? “当我尝试……”并不清楚;带有确切代码的行号和回溯 sn-ps 为我们提供了 much 更多信息。
  • 抱歉,正在尝试根据您的反馈进行更新。希望我的编辑有助于澄清。
  • 您能否展示您的products.txt 的摘录?
  • @PythonNoob 您需要显示该文本文件(不仅仅是描述它)并显示您的确切错误回溯。为此,您可以编辑您的问题并添加必要的内容..

标签: python string dictionary counter


【解决方案1】:

我不太确定我是否了解您的需求,但是,这就是您想要的吗?

import re
dictionary = {}
good = ("perfect", "nice" )
bad = ("broken", "wrong", "terrible")     
with open("products.txt","r") as products:
    for line in products:
        p = line.split(',',1)[0]
        f = line.split(',',1)[1]
        f = re.sub('\?|\.|\!|\/|\;|\:|\´|\`|\*|\¨|\%|\(|\)|\&|\$|\=|\+|\,|\[|\]\'\"', '', f) #remove pontuation
        dictionary[p] = {'text':f.lower(),'good':0,'bad':0}

for c in dictionary:
    for word in dictionary[c]['text'].split():
        if word in good:
            dictionary[c]['good'] += 1
        if word in bad:
            dictionary[c]['bad'] += 1

for k in dictionary.keys():
    print("id = %s, text = %s, good = %i, bad = %i" % (k,dictionary[k]['text'],dictionary[k]['good'],dictionary[k]['bad']))

【讨论】:

  • 这做了很多我正在寻找的东西。我对此表示感谢,并对我的措辞感到困惑感到抱歉。虽然我还没有学习导入功能,但它似乎工作正常。我唯一坚持的是如何隔离每个产品 ID 的每个好字和坏字的总数。如果有意义的话,我希望将每种产品的总好计数从坏计数中减去!
【解决方案2】:

因此,据我了解,您的文件可能包含多个产品条目 例如

4321,收到糟糕的产品时物品损坏 5432,不错的产品。 6321,我收到了错误的物品现在我被告知我不能退回错误的物品多么可怕 4321,不错的产品。 所以你期望得到这样的结果:

id:4321 好:1 坏 = 2 好-坏:-1 id:5432 好:1 坏 = 0 好-坏:1 ...

如果是你的情况,你可以使用下面的代码(基本相同,但有一些改编)

import re
dictionary = {}
good = ("perfect", "nice" )
bad = ("broken", "wrong", "terrible")     
with open("products.txt","r") as products:
    for line in products:
        p = line.split(',',1)[0]
        f = line.split(',',1)[1]
        f = re.sub('\?|\.|\!|\/|\;|\:|\´|\`|\*|\¨|\%|\(|\)|\&|\$|\=|\+|\,|\[|\]\'\"', '', f) #remove pontuation
        if p in dictionary:        
            dictionary[p]['text'] += f.lower()
        else:            
            dictionary[p] = {'text':f.lower(),'good':0,'bad':0}

for c in dictionary:
    for word in dictionary[c]['text'].split():
        if word in good:
            dictionary[c]['good'] += 1
        if word in bad:
            dictionary[c]['bad'] += 1

for k in dictionary.keys():
    print("id = %s, text = %s, good = %i, bad = %i, good-bad =%i" % (k,dictionary[k]['text'],dictionary[k]['good'],dictionary[k]['bad'],dictionary[k]['good']-dictionary[k]['bad']))

【讨论】:

  • 每个产品ID实际上只出现一次!它只是评论中可能出现多次的正面或负面词。根据您提供的内容单独提出问题,因为我不熟悉导入功能。那么除了你的最终打印行之外,是否可以写一个单独的行来仅显示每个产品 ID 的整数值(好坏)?我可以创建某种类型的列表吗?
  • 对于您问题的第一部分,我不明白我在第一个代码中遗漏了什么。该代码将计算好或坏列表中的任何单词出现在评论中的次数。我不确定我错过了什么。在第二个问题上,您可以在循环 print("id = %s, good-bad =%i" % (k,dictionary[k]['good']-dictionary[k]['bad' ])) 将仅打印好坏结果 或者您可以通过在循环中添加以下行来创建另一个仅包含 ID 和好坏数据的字典 dic_good_bad[k] = dictionary[k]['good'] -dictionary[k]['bad']
  • 我不确定你错过了什么!虽然在我最初的问题中没有说明,但当我查看您提供的内容时,我开始好奇是否可以计算字数并将它们放入列表中。当我在学校时,我将不得不等到明天运行这段代码,但我想你已经涵盖了我的要求!我非常感谢您的帮助,并希望我能借用您的大脑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2013-12-06
  • 2013-03-18
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多