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го,депресивнийдоволіландшафт,осьвониіхуячилиналівоінаправоелітнідивізіїнещаснихнаціонал-соціалістів。 Уцейчаскасетадобігаєкінцяітуттакипочинаєрозкручуватисьузворотньомунапрямку,новийджаззновуберезагорло,іязаходжусяшукатипідкрісламизабутогоіприсипаногофісташкамистарого-доброгоЛуРіда。 «Джаз - музикадлятовстих», - кажуяСільвійміняюкасети。 Десьуженанімецькійтериторіїнамтрапиласявійськоваколона,щорозтягласьнадобрихдвадесяткикілометрів。
这是一本书
我该如何解决这个问题?
答案 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)