在Python中,如何让文本文件中的每一行都有自己的字典来排序?

ftf50wuq  于 2023-01-29  发布在  Python
关注(0)|答案(2)|浏览(141)

目前我有

import re 
import string

input_file = open('documents.txt', 'r')
stopwords_file = open('stopwords_en.txt', 'r')
stopwords_list = []

for line in stopwords_file.readlines():
  stopwords_list.extend(line.split())

stopwords_set = set(stopwords_list)

word_count = {}
for line in input_file.readlines():
    words = line.strip()
    words = words.translate(str.maketrans('','', string.punctuation))
    words = re.findall('\w+', line)
    for word in words: 
      if word.lower() in stopwords_set:
        continue
      word = word.lower()
      if not word in word_count: 
        word_count[word] = 1
      else: 
        word_count[word] = word_count[word] + 1

word_index = sorted(word_count.keys())
for word in word_index:
  print (word, word_count[word])

它所做的是解析我拥有的一个txt文件,删除停止词,并输出一个词在它正在阅读的文档中出现的次数。
问题是txt文件不是一个文件,而是五个。
文档中的文本如下所示:
在Python中,我想找到一种方法,遍历1、2和3,并计算一个单词在单个文档中出现的次数,以及一个单词在整个文本文件中出现的总次数--我的代码目前就是这样做的。
例如,Mat在文本文档中出现了2次。它出现在文档1和文档2中,理想情况下不会太罗嗦。

lc8prwob

lc8prwob1#

给予看:

import re
import string

def count_words(file_name):
    word_count = {}
    with open(file_name, 'r') as input_file:
        for line in input_file:
            if line.startswith("document"):
                doc_id = line.split()[0]
                words = line.strip().split()[1:]
                for word in words:
                    word = word.translate(str.maketrans('','', string.punctuation)).lower()
                    if word in word_count:
                        word_count[word][doc_id] = word_count[word].get(doc_id, 0) + 1
                    else:
                        word_count[word] = {doc_id: 1}
    return word_count

word_count = count_words("documents.txt")
for word, doc_count in word_count.items():
    print(f"{word} appears in: {doc_count}")
fdbelqdn

fdbelqdn2#

您删除了之前的类似问题和我的答案,所以我不确定是否应该再次回答。我将给出一个稍微不同的答案,不带groupby,尽管我认为它是好的。
您可以尝试:

import re
from collections import Counter
from string import punctuation

with open("stopwords_en.txt", "r") as file:
    stopwords = set().union(*(line.rstrip().split() for line in file))
translation = str.maketrans("", "", punctuation)
re_new_doc = re.compile(r"(\d+)\s*$")
with open("documents.txt", "r") as file:
    word_count, doc_no = {}, 0
    for line in file:
        match = re_new_doc.match(line)
        if match:
            doc_no = int(match[1])
            continue
        line = line.translate(translation)
        for word in re.findall(r"\w+", line):
            word = word.casefold()
            if word in stopwords:
                continue
            word_count.setdefault(word, []).append(doc_no)

word_count_overall = {word: len(docs) for word, docs in word_count.items()}
word_count_docs = {word: Counter(docs) for word, docs in word_count.items()}
  • 我只会预先制作一次翻译表,而不是为每一行重新制作。
  • 用于标识新文档(\d+)\s*$"的正则表达式在行首查找数字,在换行符之前不查找任何其他内容(可能除了一些空格),如果标识符遵循不同的逻辑,则必须调整它。
  • word_count将单词的每次出现记录在具有当前文档编号的列表中。
  • word_count_overall只取resp.列表的长度来获得单词的总计数。
  • word_count_docs确实对列表应用了Counter,以获得每个文档中每个单词的计数。

相关问题