Счетчик для возврата нулевого значения, если тег Part of Speech отсутствует - PullRequest
0 голосов
/ 11 февраля 2020

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

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

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)

Я пытался составить отдельный список с некоторыми теги Speci c (цель состояла в том, чтобы достичь всех глаголов и существительных), но он по-прежнему возвращает только те, которые имеют действительные значения (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: Код, сработавший в конце (спасибо Маноджу Ядаву):

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)

1 Ответ

0 голосов
/ 11 февраля 2020
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)

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

...