Счетчик для возврата нулевого значения, если тег части речи отсутствует

В настоящее время я пытаюсь подсчитать случаи, когда определенная часть речи встречается в данном онлайн-обзоре. Хотя я могу получить определенные теги, соответствующие каждому слову, и подсчитать эти экземпляры, я сталкиваюсь с трудностями при захвате нулевых значений (если тег отсутствует = 0). В идеале у меня был бы список всех тегов либо с количеством фактических вхождений в обзоре, либо, если он отсутствует = 0. Я использую тег POS NLTK.

Следующий код даст мне определенные теги для каждого обзора, но, таким образом, только для токенов в обзоре:

for line in lines:
tokens = nltk.word_tokenize(line)
tagged = nltk.pos_tag(tokens)
counts=Counter(tag for word,tag in tagged)
postag.append(counts)

Я попытался сделать отдельный список с некоторыми конкретными тегами (цель состояла в том, чтобы получить все глаголы и существительные), но он по-прежнему возвращает только те, у которых есть фактические значения (1 или более), а не те, у которых есть 0 (отсутствует в тексте). Я потенциально мог бы вставить туда все доступные теги, но таким образом он вернул бы только фактические значения. Например:

for line in lines:
tokens = nltk.word_tokenize(line)
tagged = nltk.pos_tag(tokens)
selective_tagged = ['NN','NNS','NNP','NNPS','VB','VBD','VBN','VBP','VBZ']
selective_tagged_words =[]
for word,tag in tagged:
    if tag in selective_tagged:
        selective_tagged_words.append((word,tag))
counts=Counter(tag for word,tag in selective_tagged_words)
postag.append(counts) 

Таким образом, в приведенном выше примере вывод будет таким:

Counter({'NNS': 3, 'VBP': 3, 'VBN': 1, 'NN': 5, 'VBZ': 1, 'VB': 4, 'NNP': 1})

Но я хочу

Counter({'NNS': 3, 'VBP': 3, 'VBN': 1, 'NN': 5, 'VBZ': 1, 'VB': 4, 'NNP': 1, 'NNPS': 0, 'VBD': 0})

Спасибо за помощь!

Правка 2: Код, который в итоге сработал (спасибо manoj yadav):

for line in lines:
tokens = nltk.word_tokenize(line)
tagged = nltk.pos_tag(tokens)
selective_tagged = ['NN','NNS','NNP','NNPS','VB','VBD','VBN','VBP','VBZ']
selective_tagged_words =[]
for word,tag in tagged:
    if tag in selective_tagged:
        selective_tagged_words.append((word,tag))
counts=Counter(tag for word,tag in selective_tagged_words)
other_tags = set(selective_tagged)-set(counts)
for i in other_tags:
    counts[i]=0
postag.append(counts)

person Principia    schedule 11.02.2020    source источник
comment
Можете ли вы поделиться своим примером ввода и ожидаемым результатом?   -  person manoj yadav    schedule 11.02.2020
comment
Я добавил пример выше.   -  person Principia    schedule 11.02.2020


Ответы (1)


for line in lines:
    tokens = nltk.word_tokenize(line)
    tagged = nltk.pos_tag(tokens)
    selective_tagged = ['NN','NNS','NNP','NNPS','VB','VBD','VBN','VBP','VBZ']
    selective_tagged_words = []
    for word, tag in tagged:
        if tag in selective_tagged:
            selective_tagged_words.append((word, tag))
    count = Counter(tag for word, tag in selective_tagged_words)

    other_tags = set(selective_tagged)-set(count)
    for i in other_tags:
        count[i]=0
    postag.append(count)
print(postag)

попробуй, если это работает

person manoj yadav    schedule 11.02.2020
comment
Спасибо! Я сделал небольшую корректировку, и теперь она, кажется, работает. Я предоставил код во втором редактировании моего вопроса. Спасибо! - person Principia; 11.02.2020
comment
Удачного кодирования :-) - person manoj yadav; 11.02.2020