2015-06-23 2 views
0
import re 
N = 2 
list = [] 
counts = dict() 
ngarms = [] 
with open('man.txt','r',encoding='cp1251') as f: 
     for sent in f: 
      sent = sent.lower() 
      sent = re.sub('[0-9A-z\'\"`\|\/\+\#\,\)\(\?\!\B\-\:\=\;\.\«\»\-\—]', '', sent) 
      sent = sent.split() 
      for word in sent: 
       word = word.lower() 
       list.append(word) 


grams = [list[i:i+N] for i in range(len(list)-N)] 
    for gram in grams: 
     if gram not in counts: 
      counts[word] = 1 
     else: 
      counts[word] += 1 

Я пытаюсь подсчитать nubber каждого Ngram в тексте, но когда делают это с помощью метода со словарем я получаю сообщение об ошибке: если грамм не в импульсах: TypeError: unhashable Тип: 'список'подсчет числа п г в тексте

man.txt выглядит следующим образом:

Ми набрали стільки різної музики, що слухати її вже ніхто не хотів. Якісь — Сільві, це зміна тиску, — кажу я їй — Двірники тут не допоможуть. Джаз, до речі, теж. Так уже складається, що я маю пити сам. Між Сільві й Ґашпером існує джентльменська угода, що десь там після умовного перетину австрійсько-німецького кордону він її підмінить за кермом, а на автобані пити він все ж таки не наважується, тож я собі відкриваю чергову банку, зідравши з неї чеку, й намагаюсь підтримувати розмову. Загалом, перша сотня кілометрів мені знайома, торік я їздив тут автостопом, мене тоді підібрав якийсь божевільний панк, який весь час нервово пив спрайт, його сушило, схоже він був з обкурки, але гнав таки на Захід, бо мусив, уже не знаю, що там у нього було, може, мама чекала, однак вигляд у нього був нещасний. Коли я дістав з наплічника пляшку води, він спитався, чи це не водка бува, у вас же там, в Росії, всі п’ють водку, ні, не водка, кажу, і він весело розсміявся. Тупий якийсь панк трапився. Зараз я намагаюсь переповісти все це Сільві, виловлюючи її увагу з атональних джазових ям і порожнин, Сільві погоджується — так, справді тупий панк, що тут скажеш, розмова не в’яжеться, і я відкриваю наступну банку, все одно поки що нічого цікавого — голі пасовища, безлисті лісосмуги, печальна березнева Австро-Угорщина, мабуть, саме такою її і запам’ятали російські піхотинці навесні 45-го, депресивний доволі ландшафт, ось вони і хуячили наліво і направо елітні дивізії нещасних націонал-соціалістів. У цей час касета добігає кінця і тут таки починає розкручуватись у зворотньому напрямку, новий джаз знову бере за горло, і я заходжуся шукати під кріслами забутого і присипаного фісташками старого-доброго Лу Ріда. «Джаз — музика для товстих», — кажу я Сільві й міняю касети. Десь уже на німецькій території нам трапилася військова колона, що розтяглась на добрих два десятки кілометрів.

это книга

Как я могу это исправить?

+0

Пожалуйста, сообщите нам, как выглядит '' man.txt'' и более подробно рассказывается о том, что вы пытаетесь сделать. –

+0

Что вы пытаетесь сделать? –

+0

Я знаю, как получить ngarms, но я не могу подсчитать количество каждого ngarm в этом тексте –

ответ

1

Предполагая, что все ошибки отступов в вашем коде на самом деле являются только ошибками копирования/вставки, проблема заключается в том, что grams - это список списка, который содержит 2 элемента во внутреннем списке.

Когда вы делаете - for gram in grams:, вы получаете внутренний список в gram переменной, которая является списком, то вы пытаетесь проверить, является ли переменная gram находится в counts словарем key.

Это приводит к ошибке, поскольку мы не можем использовать list в качестве ключей для словаря, поскольку они не являются хешируемыми.

Я не совсем уверен, что такое полный запрос, но примером того, как исправить проблему, было бы повторить итерацию через каждый gram и проверить, присутствуют ли элементы внутри внутреннего списка в словаре counts.

Пример -

for gram in grams: 
    for g in gram: 
     if g not in counts: 
      counts[word] = 1 
     else: 
      counts[word] += 1 

Но я не думаю, что с помощью word там правильно, так как это, скорее всего, использовать последнее значение из word внутри with блока. Может быть, вам нужно использовать переменную g, как я использовал выше ???

Также сообщается, что вы не используете list как имя переменной, так как она перезаписывает встроенную функцию list().


Поскольку запрос заключается в том, что OP хочет подсчитать количество раз, когда каждая последовательность слов входит в текст. Вы можете сделать это, создав список grams в виде списка всех последовательностей, используя, например, join, а затем используя его собственный пример -

grams = ['' .join (список [i: i + N]) для i в диапазоне (LEN (список) -N)] для грамм в граммах: , если грамма не рассчитывает: отсчетов [слово] = 1 остальное: отсчетов [слово] + = 1

+0

Возможно, мой запрос был не очень точным, мне нужно посчитать, что у вас много времени, каждая последовательность слов, например «Я» появляется в тексте –

+0

Обновлен ответ с решением для вашего дела –

+0

Резолюция была так проста, очень благодарна! –

0

Предполагая, что содержит list каждое слово файла как элемент списка, и вы ищете слово ngram, просто проверьте каждый элемент списка для равенства:

ngrams = [word for word in list if word == "ngram"] 
print len(ngrams) 
+0

Не слово ngram но n-грамм - непрерывная последовательность из n элементов из заданной последовательности текста или речи –

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