2013-05-28 4 views
1

Я пытаюсь сделать счетчик, который использует список триграмм POS, чтобы проверить большой список триграмм и найти их частоту. Мой код до сих пор выглядит следующим образом:Не удается заставить Counter() работать в python

from nltk import trigrams 
from nltk.tokenize import wordpunct_tokenize 
from nltk import bigrams 
from collections import Counter 
import nltk 
text= ["This is an example sentence."] 
trigram_top= ['PRP', 'MD', 'VB'] 

    for words in text: 
     tokens = wordpunct_tokenize (words) 
     tags = nltk.pos_tag (tokens) 
     trigram_list=trigrams(tags) 
     list_tri=Counter (t for t in trigram_list if t in trigram_top) 
     print list_tri 

я получаю пустой счетчик обратно. Как мне исправить это? В более ранней версии я получил данные назад, но продолжал подсчитывать навсегда итерацию (в реальной программе текст представляет собой набор разных файлов). У кого-нибудь есть идея?

+0

Что делает '[t для t в trram_list, если t в trigram_top]' дает вам? Итак, удалите 'Counter', сделайте список. –

+0

этот оператор проверяет каждую триграмму в тексте по сравнению с каждой триграммой в верхней части триграммы. Что вы имеете в виду, сделайте список? – Shifu

+0

Выражение, которое я вам дал, - это понимание списка. Это позволяет вам проверить, если вы вообще * даете * что-либо * на 'Counter()'. –

ответ

2

Давайте поставить некоторые print там отлаживать:

from nltk import trigrams 
from nltk.tokenize import wordpunct_tokenize 
from nltk import bigrams 
from collections import Counter 
import nltk 
text= ["This is an example sentence."] 
trigram_top= ['PRP', 'MD', 'VB'] 

for words in text: 
    tokens = wordpunct_tokenize (words) 
    print tokens 
    tags = nltk.pos_tag (tokens) 
    print tags 
    list_tri=Counter (t[0] for t in tags if t[1] in trigram_top) 
    print list_tri 

#['This', 'is', 'an', 'example', 'sentence', '.'] 
#[('This', 'DT'), ('is', 'VBZ'), ('an', 'DT'), ('example', 'NN'), ('sentence', 'NN'), ('.', '.')] 
#Counter() 

Обратите внимание, что list= часть была избыточной, и я изменил генератор просто взять слово вместо поз тег

Мы можем что ни один из меток pos напрямую не соответствует вашему методу trigram_top - вы можете изменить свою проверку сравнения для обслуживания VB/VBZ ...

Возможность изменить линию:

list_tri=Counter (t[0] for t in tags if t[1].startswith(tuple(trigram_top))) 
# Counter({'is': 1}) 
+0

Следующий шаг: превратите 'trigram_top' в набор для эффективного тестирования членства:' {'PRP', 'MD', 'VB'} '. –

+0

Этот скрипт проверяет только для униграмм в списке триграмм, если я не ошибаюсь, есть ли способ проверить только триграммы? – Shifu

+0

@Nikolaas Я не уверен на 100%, чего вы пытаетесь достичь ... –

Смежные вопросы