Улучшение моей функции оценки SentiwordNet (избавление от объекта NoneType не имеет параметра 'name')

Я новичок в Python для энтузиастов НЛП, в настоящее время играющих в определение настроений на основе SentiWordNet.

Моя функция преобразования тегов PennTreeBank в теги WordNet выглядит следующим образом:

def penn2morphy(penntag, returnNone=False):
    morphy_tag = {"NN":wn.NOUN, "JJ":wn.ADJ, "VB":wn.VERB, "RB":wn.ADV}
    try:
        return morphy_tag[penntag[:2]]
    except:
        return None if returnNone else ""

Вторая функция выполняет расчет фактического настроения:

def swn_polarity(sentence):

    sentiment = 0
    tokens_count = 0

    pos_tagged = pos_tag(word_tokenize(sentence))
    senti_synsets=[]

    for token, pos in pos_tagged:
        wn_tag = penn2morphy(pos)
        if wn_tag not in (wn.NOUN, wn.ADJ, wn.ADV, wn.VERB):
            continue

        senti_synset = swn.senti_synset(lesk(word_tokenize(sentence), token, pos=wn_tag).name())            
        senti_synsets.append(senti_synset)
        for senti_synset in senti_synsets:
            sentiment += senti_synset.pos_score() - senti_synset.neg_score()
            tokens_count += 1

    if not tokens_count:
        return 0
    if sentiment >= 0:
        return 4
    return 0   

Эта функция возвращает 4, если положительный, и 0, если отрицательный. Это относится к набору данных STS_Gold_Tweet, который я использую для тестирования. Теперь мой вопрос / проблема в том, что я хотел бы, чтобы вам помогли эксперты по NLP/Python:

  1. Этот код прекрасно подходит для стандартных предложений, таких как: "Я люблю соленое карамельное мороженое". Однако эта функция не срабатывает, когда я добавляю в предложение некоторые специальные символы, например: "Я очень люблю соленое карамельное мороженое @#$!" со следующим исключением: AttributeError: у объекта 'NoneType' нет атрибута 'name'. Я пытался просмотреть подобные проблемы, но не смог найти что-то, что могло бы относиться к моему варианту использования, отсюда мой отчаянный крик о помощи. Потенциальным виновником является функция penn2morpy, которая выводит "None", если не найдено сопоставление между тегами PtB и WN. Как устранить эту ошибку?

  2. Вы бы порекомендовали какие-либо дальнейшие шаги по улучшению этого кода? Например, чтобы сделать это быстрее? Или вы думаете, что очистка данных работает с Sentiwordnet в сочетании с Lesk? Если да, какой тип задач по очистке вы рекомендуете, когда речь идет о комбинации Sentiwordnet - Lesk?

  3. Не могли бы вы объяснить мне, что именно линия

    return None, если returnNone, то ""

делает? Я разработал этот код, просматривая stackru и / или онлайн-учебники, и я не уверен, что понимаю этот код, кроме того, что он как-то работает.

Спасибо за то, что терпите меня и заранее отвечаете на мои вопросы! С уважением, Барт

0 ответов

Другие вопросы по тегам