首页 > 解决方案 > 将列表转换为字典,并标记键值 - 可能吗?

问题描述

所以基本上我有一个我正在打开并读入python的文件文件夹。

我想搜索这些文件并计算每个文件中的关键字,以制作一个像附件图像一样的数据框。

在此处输入图像描述 我设法打开这些文件并将其读入列表,但我的问题如下:

编辑1:

我决定尝试将文件作为字典导入。它有效,但是当我尝试将值小写时,我得到一个“列表”对象属性错误——即使在我的变量资源管理器中,它被定义为字典。

import os
filenames = os.listdir('.')
file_dict = {}
for file in filenames:
    with open(file) as f:
        items = [i.strip() for i in f.read().split(",")]
    file_dict[file.replace(".txt", "")] = items

def lower_dict(d):
   new_dict = dict((k, v.lower()) for k, v in d.items())
   return new_dict
print(lower_dict(file_dict))


输出 =

AttributeError: 'list' 对象没有属性 'lower'

预编辑帖子:

1.每个列表值不保留文件名键。所以我没有我需要的行。

2.无论如何我无法在列表中搜索关键字,因为它没有被标记化。所以我无法计算每个文件的关键字。

这是我打开文件、将它们转换为小写并将它们存储在列表中的代码。

如何将其转换为保留文件名和标记化键值的字典?. 此外,以某种方式直接将文件和内容导入字典会更好吗?我还能将所有内容标记化和小写吗?

import os
import nltk
# create list of filenames to loop over
filenames = os.listdir('.')
#create an empty list for storage 
Lcase_content = []
tokenized = []
num = 0
# read files from folder, convert to lower case 
for filename in filenames:  
    if filename.endswith(".txt"): 
        with open(os.path.join('.', filename)) as file: 
            content = file.read()   
            # convert to lower-case value 
            Lcase_content.append(content.lower())

       ## this two lines below don't work - index out of range error
            tokenized[num] = nltk.tokenize.word_tokenize(tokenized[num])
            num = num + 1

标签: python-3.xlistdictionarynltk

解决方案


您可以使用 Collections 计算每个令牌的计数。collections.Counter可以获取一个字符串列表并返回一个类似字典的计数器,其中每个标记在其键中,并且在值中标记的计数。由于 NLTKworkd_tokenize采用一系列字符串并返回一个列表,因此要获取带有标记及其计数的字典,您基本上可以这样做:

Counter(nltk.tokenize.word_tokenize())

由于您希望文件名作为索引(第一列),因此将其作为嵌套字典,以文件名作为键,另一个字典以标记和计数作为值,如下所示:

{'file1.txt': Counter({'cat': 4, 'dog': 0, 'squirrel': 12, 'sea horse': 3}), 'file2.txt': Counter({'cat': 11,“狗”:4,“松鼠”:17,“海马”:0})}

如果您熟悉 Pandas,则可以将字典转换为 Pandas 数据框。通过将 Pandas 数据框结果导出为 csv 文件,您可以更轻松地使用任何 tsv/csv/excel 文件。确保您适用.lower()于您的文件内容并包含orient='index',以便文件名成为您的索引。

import os
import nltk
from collections import Counter
import pandas as pd

result = dict()

filenames = os.listdir('.')
for filename in filenames:
    if filename.endswith(".txt"):
        with open(os.path.join('.', filename)) as file:
            content = file.read().lower()
            result[filename] = Counter(nltk.tokenize.word_tokenize(content))

df = pd.DataFrame.from_dict(result, orient='index').fillna(0)

df['total words'] = df.sum(axis=1)

df.to_csv('words_count.csv', index=True)

回复:您的第一次尝试,因为您的“项目”是一个列表(请参阅[i.strip() for i in f.read().split(",")]),您不能申请.lower()它。

回复:您的第二次尝试,您的“标记化”是空的,因为它被初始化为tokenized = []. 这就是为什么当您尝试这样做时tokenized[num] = nltk.tokenize.word_tokenize(tokenized[num])tokenized[num]使用 num = 0 会给您索引超出范围错误。


推荐阅读