Подсчитайте количество совпадений c слов в текстовом файле и распечатайте среди них 50 наиболее часто встречающихся слов - PullRequest
0 голосов
/ 16 июня 2020

Я хочу подсчитать количество вхождений определенных c ключевых слов (хранящихся в файле .txt, по одному слову в каждой строке) в текстовом файле и распечатать 50 наиболее часто встречающихся. Вот что я сделал:

from collections import Counter

with open("./Text_file.txt", "r", encoding='utf8') as logfile:
    word_counts = Counter(logfile.read().split())

with open("./key_words.txt", "r", encoding='utf8') as word:
    lines = word.readlines()
    for line in lines:
        count = [word_counts.get('line')]
lst = sorted (count)
print (lst[:50])

Я возвращаю это мне, что ничего не значит:

[20]

Любая помощь?

Ответы [ 4 ]

1 голос
/ 16 июня 2020

Один вариант

from collections import Counter

# Read keywords
with open("./key_words.txt", "r", encoding='utf8') as keyfile:
  # Use set of keywords (@MisterMiyagi comment)
  keywords = set(keyfile.read().split('\n'))

# Process words
with open("./Text_file.txt", "r", encoding='utf8') as logfile:
  cnts = Counter()
  for line in logfile:
    if line:
      line = line.rstrip()
      # only count keywords
      cnts.update(word for word in line.split() if word in keywords)

# Use counter most_common to get most popular 50
print(cnts.most_common(50)) 

Альтернатива с использованием счетчика + регулярное выражение

Регулярное выражение, используемое для отделения слов от знаков препинания, т. Е. Перидов, кавычек, запятых и т. Д. c.

import re
from collections import Counter

with open("./key_words.txt", "r", encoding='utf8') as keyfile:
  keywords = keyfile.read().lower().split('\n')

with open("./Text_file.txt", "r", encoding='utf8') as logfile:
  cnts = Counter()
  for line in logfile:
    # use regex to separate words from punctuation
    # lowercase words
    words = map(lambda x:x.lower(), re.findall('[a-zA-Z]+', line, flags=re.A))
    cnts.update(word for word in words if word in keywords)

print(cnts.most_common(50))
1 голос
/ 16 июня 2020

Вот что вы можете сделать:

from collections import Counter

with open("./Text_file.txt", "r") as file,open("./key_words.txt", "r") as word:
    words1 = [w.strip() for w in file.read().split()] # Strore words from text file into list
    words2 = [w.strip() for w in word.read().split()] # Strore words from key file into list

s = [w1 for w1 in words1 if w1 in words2] # List all words from text file that are in key file

d = Counter(s) # Diction that stores each word from s with the amount of times the word occurs in s

lst = [w for k,w in sorted([(v,k) for k,v in d.items()],reverse=True)[:50]]

print(lst)
0 голосов
/ 16 июня 2020

Я изменил ваш код - вы были близки, но вам нужно было исправить несколько вещей:

  • Вы сохраняли только один count, а не строили список слов. Я решил это, сделав новый словарь слов для подсчета, но только для найденных ключевых слов.
  • Как говорили другие, вы использовали строковый литерал 'line' вместо line
  • Вы не удаляли новую строку из каждого line - когда вы использовали readlines(), \n новая строка находится в конце каждой строки, поэтому ни одно из ваших слов не было найдено в вашем Counter.

Итак, вот код. Он распечатывает ключевые слова в порядке убывания количества и только первые 50:

from collections import Counter
with open("./Text_file.txt", "r", encoding='utf8') as logfile:
    word_counts = Counter(logfile.read().split())

found_keywords = {}
with open("./key_words.txt", "r", encoding='utf8') as word:
    lines = word.readlines()
    for line in lines:
        line = line.rstrip()
        count = word_counts[line]
        if count > 0:
            found_keywords[line] = count

>>> print([(k, v) for k, v in sorted(found_keywords.items(), key=lambda item: item[1], reverse=True)][:50])
[('cat', 3), ('dog', 1)]
0 голосов
/ 16 июня 2020

Здесь word_counts.get('line') вы вызываете только случаи line на каждой итерации, поэтому ваш список результатов имеет одно значение. Ниже приведен ваш модифицированный код для первых 50 слов из ключевых слов.

from collections import Counter

with open("./Text_file.txt", "r", encoding='utf8') as logfile:
    word_counts = Counter(logfile.read().split())

wc = dict(word_counts)
kwc = {}    #keyword counter
with open("./key_words.txt", "r", encoding='utf8') as word:
    lines = word.readlines()
    for line in lines:
        line = line.strip() #assuming each word is in separate line, removes '\n' character from end of line
        if line in wc.keys():
            kwc.update({line:wc[line]}) # if keyword is found, adds that to kwc

lst = sorted (kwc, key = kwc.get, reverse = True)   #sorts in decreasing order on value of dict
print (lst[:50])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...