尝试为元组列表创建单个整数值

时间:2019-05-02 02:15:36

标签: python anaconda spyder

我正在尝试创建一个基本的情绪分析器。我有类别中的单词列表,还有来自reddit线程的两个csv文件,我正在从中获取评论。我已经设法用适当的标签来标记我的数据集,现在在列表列表中有元组集,这些列表用注释分隔。我有一段代码,希望可以根据存在的标签为每个注释创建一个整数值,但是我在脑海中碰壁。

我尝试了下面的代码,该代码最多只能得到0,而最坏的地方会导致ValueError。我知道一定有很多坏主意,但是我很茫然。在这一点上,我只想要一些功能T_T

tLOTR = [[('terrible', 'negative'),
  ('so', 'intensifier'),
  ('awesome', 'positive'),
  ('so', 'intensifier'),
  ('but', 'shifter'),
  ('agree', 'positive'),
  ('like', 'positive'),
  ('really', 'intensifier'),
  ('but', 'shifter'),
  ('but', 'shifter'),
  ('so', 'intensifier'),
  ('not', 'shifter'),
  ('like', 'positive'),
  ('really', 'intensifier'),
  ('like', 'positive'),
  ('so', 'intensifier')],
 [('not', 'shifter'),
  ('amazing', 'positive'),
  ('but', 'shifter'),
  ('bad', 'negative'),
  ('but', 'shifter'),
  ('like', 'positive'),
  ('awful', 'negative'),
  ('but', 'shifter'),
  ('like', 'positive'),
  ('but', 'shifter'),
  ('so', 'intensifier'),
  ('completely', 'intensifier'),
  ('wrong', 'negative')]]

#this is just a few of my tagged sets

def sentalize(text):
    value = 0
    for x in text:
        for (word, tag) in x:
            if tag == "positive":
                value += 1
            elif tag == "negative":
                value -= 1
            elif tag == "shifter":
                value *= -1
            elif tag == "intensifier":
                value *= 1.25
    return value            

因此,当我运行一件事(例如tLOTR [0])时,我得到0或ValueError-我理想地希望为每个注释提供一个值列表(注释1 = -0.348)或类似的东西。

1 个答案:

答案 0 :(得分:0)

假设您希望sentalize()处理tLOTR的各个元素,那么您的问题就是循环:

def sentalize(text):
    value = 0
    for word, tag in text:
        if tag == "positive":
            value += 1
        elif tag == "negative":
            value -= 1
        elif tag == "shifter":
            value *= -1
        elif tag == "intensifier":
            value *= 1.25
    return value


print(sentalize(tLOTR[0]))

请注意,如何通过遍历word, tag而不是首先提取元组text然后尝试以某种方式循环遍历该元组的组成部分来捕获x的情况在您的示例中。

通过此更改,您可以执行:values = list(map(sentalize, tLOTR))并获得结果[-2.833251953125, 0.5625]

一些其他评论:

  • 将每个单词的类型存储为字符串(即“正”,“负”等)不是很有效;而是考虑用一个更简单的值来表示
  • 由于您已经解析了注释,并且显然已将每个单词与修饰符/标记的类型进行匹配,所以这可能是更新值的正确时机,而不是使用此tLOTR中间值列表。
  • 将诸如-=+=这样的运算符与诸如1-1这样的正和负常数值结合起来非常令人困惑。我建议仅使用+=*=,并在适当的地方使用负值或正值。