计算文本中的n克数

时间:2015-06-23 08:41:30

标签: python

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

我尝试在文本中计算每个Ngram的nubber,但是当使用字典的方法时,我得到错误:  如果克不计数: TypeError:不可用类型:'list'

man.txt看起来像这样:

  

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

这是一本书

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

假设代码中的所有缩进错误实际上只是复制/粘贴错误,问题是grams是列表列表,其中包含内部列表中的每个元素。

当您执行 - for gram in grams:时,您将获得gram变量中的内部列表,这是一个列表,然后您正在尝试检查gram变量是否为{{1在key字典中。

这会导致错误,因为我们无法使用counts作为字典的键,因为它们不可用。

我不清楚完整的问题是什么,但是如何解决问题的一个例子是再次遍历每个list并检查内部列表中的元素是否存在于{{ 1}}字典。

示例 -

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函数。

因为问题是OP想要计算每个单词序列在文本中出现的次数。您可以通过使用list创建list()列表作为所有序列的列表,然后使用他自己的示例 -

克= [''。join(list [i:i + N])for i in range(len(list)-N)] 以克为单位:     如果克不计数:         count [word] = 1     其他:         count [word] + = 1

答案 1 :(得分:0)

假设list包含文件的每个单词作为列表元素,并且您正在寻找单词 ngram ,只需测试每个列表元素是否相等:

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