Попытка создать отдельные целочисленные значения для списков кортежей - PullRequest
0 голосов
/ 02 мая 2019

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

Я пробовал приведенный ниже код, который приводит кв 0 в лучшем случае и ValueError в худшем случае.Я знаю, это должно быть переполнено плохими идеями, но я в растерянности.На данный момент я просто хочу что-то FUNCTION 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            

Так что я получаю 0 или ValueError, когда я запускаю одну вещь (например, tLOTR [0]) - в идеале я бы хотелиметь список значений для каждого комментария (комментарий 1 = -0,348) или что-то в этом роде.

1 Ответ

0 голосов
/ 02 мая 2019

Предполагая, что вы хотите, чтобы 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, очень запутанно.Я бы рекомендовал использовать только += и *= и, при необходимости, использовать отрицательные или положительные значения.
...