Python 如何循环字典以获得单词和符号的频率?

Python 如何循环字典以获得单词和符号的频率?,python,dictionary,Python,Dictionary,我已经设置了一个函数,它可以查找单词在文本文件中出现的次数,但是对于一些单词来说,这个频率是错误的,因为该函数没有将单词与“happy”等符号分开 我已经尝试过使用split函数将其与each“,”和each“.”进行拆分,但这不起作用,我也不允许在函数中导入任何内容,因为教授不希望我们这样做 下面的代码将文本文件转换为字典,然后使用单词或符号作为键,使用频率作为值 def getTokensFreq(file): dict = {} with open(file, 'r') a

我已经设置了一个函数,它可以查找单词在文本文件中出现的次数,但是对于一些单词来说,这个频率是错误的,因为该函数没有将单词与“happy”等符号分开

我已经尝试过使用split函数将其与each“,”和each“.”进行拆分,但这不起作用,我也不允许在函数中导入任何内容,因为教授不希望我们这样做

下面的代码将文本文件转换为字典,然后使用单词或符号作为键,使用频率作为值

def getTokensFreq(file):
    dict = {}
    with open(file, 'r') as text:
        wholetext = text.read().split()
        for word in wholetext:
            if word in dict:
                dict[word] += 1
            else:
                dict[word] = 1
    return dict
我们正在使用名为“f”的文本文件。这是文件中的内容

我感到高兴,因为我看到其他人都很高兴,因为我知道我应该感到高兴,但我不是真的很高兴。

期望的结果是在这里同时计算单词和符号

{'i':5,'feel':1,'happy':4,'because':2,'saw':1,
'the':1,'others':1,'were':1,'and':1,'knowed':1,'should':1,
‘感觉’:1’,‘但是’:1,‘是’:1,‘不是’:1,‘真的’:1,’:1}

这就是我得到的,一些单词和符号被算作一个单独的单词

{'I':5,'feel':1,'happy':2,'because':2,'saw':1,'the':1,'others':1,'were':1,'knowed':1,'should':1,'feel':1,'happy':1,'but':1,'was':1,'not':1,'really':1,'happy':1}


这是如何为一个句子生成所需的频率词典。要对整个文件执行此操作,只需对每行调用此代码即可更新词典的内容

#初始化变量
f=“我感到高兴是因为我看到其他人都很高兴,因为我知道我应该感到高兴,但我不是真的很高兴。”
d={}
#计数标点字符
d['.]=f.计数('.'))
d[',']=f.count(',')
#移除。以及,
对于f中的单词,替换('','')。替换('.','')。拆分(''):
如果单词不在d.keys()中:
d[字]=1
其他:
d[字]+=1
或者,您可以混合使用正则表达式和列表表达式,如下所示:

import re

# filter words and symbols
words   = re.sub('[^A-Za-z0-9\s]+', '', f).split(' ')
symbols = re.sub('[A-Za-z0-9\s]+', ' ', f).strip().split(' ')

# count occurrences
count_words   = dict(zip(set(words),   [words.count(w) for w in set(words)]))
count_symbols = dict(zip(set(symbols), [symbols.count(s) for s in set(symbols)]))

# parse results in dict
d = count_symbols.copy()
d.update(count_words)
输出:

{',': 1,
 '.': 1,
 'I': 5,
 'and': 1,
 'because': 2,
 'but': 1,
 'feel': 1,
 'felt': 1,
 'happy': 4,
 'knew': 1,
 'not': 1,
 'others': 1,
 'really': 1,
 'saw': 1,
 'should': 1,
 'the': 1,
 'was': 1,
 'were': 1}

使用循环运行前两种方法1000次并捕获运行时间,证明第二种方法比第一种方法快。

这就是如何为一个句子生成所需的频率字典。要对整个文件执行此操作,只需对每行调用此代码即可更新词典的内容

#初始化变量
f=“我感到高兴是因为我看到其他人都很高兴,因为我知道我应该感到高兴,但我不是真的很高兴。”
d={}
#计数标点字符
d['.]=f.计数('.'))
d[',']=f.count(',')
#移除。以及,
对于f中的单词,替换('','')。替换('.','')。拆分(''):
如果单词不在d.keys()中:
d[字]=1
其他:
d[字]+=1
或者,您可以混合使用正则表达式和列表表达式,如下所示:

import re

# filter words and symbols
words   = re.sub('[^A-Za-z0-9\s]+', '', f).split(' ')
symbols = re.sub('[A-Za-z0-9\s]+', ' ', f).strip().split(' ')

# count occurrences
count_words   = dict(zip(set(words),   [words.count(w) for w in set(words)]))
count_symbols = dict(zip(set(symbols), [symbols.count(s) for s in set(symbols)]))

# parse results in dict
d = count_symbols.copy()
d.update(count_words)
输出:

{',': 1,
 '.': 1,
 'I': 5,
 'and': 1,
 'because': 2,
 'but': 1,
 'feel': 1,
 'felt': 1,
 'happy': 4,
 'knew': 1,
 'not': 1,
 'others': 1,
 'really': 1,
 'saw': 1,
 'should': 1,
 'the': 1,
 'was': 1,
 'were': 1}

使用循环运行前两种方法1000次并捕获运行时间,证明第二种方法比第一种方法快。

我的解决方案是首先将所有符号替换为一个空格,然后按空格分割。我们需要正则表达式的一些帮助

import re

a = 'I felt happy because I saw the others were happy and because I knew I should feel happy, but I was not really happy.'

b =  re.sub('[^A-Za-z0-9]+', ' ', a)
print(b)
wholetext = b.split(' ')
print(wholetext)

我的解决方案是首先将所有符号替换为一个空格,然后按空格分割。我们需要正则表达式的一些帮助

import re

a = 'I felt happy because I saw the others were happy and because I knew I should feel happy, but I was not really happy.'

b =  re.sub('[^A-Za-z0-9]+', ' ', a)
print(b)
wholetext = b.split(' ')
print(wholetext)

我的解决方案和Verse的类似,但它也需要在句子中创建一系列符号。之后,可以使用for循环和字典来确定计数

import re

a = 'I felt happy because I saw the others were happy and because I knew I should feel happy, but I was not really happy.'

b =  re.sub('[^A-Za-z0-9\s]+', ' ', a)
print(b)
wholetext = b.split(' ')
print(wholetext)
c = re.sub('[A-Za-z0-9\s]+', ' ', a)
symbols = c.strip().split(' ')
print(symbols)

# do the for loop stuff you did in your question but with wholetext and symbols

哦,我错过了你不能导入任何东西的机会:(

我的解决方案与Verse的类似,但它也需要在句子中创建一个符号数组。之后,你可以使用for循环和字典来确定计数

import re

a = 'I felt happy because I saw the others were happy and because I knew I should feel happy, but I was not really happy.'

b =  re.sub('[^A-Za-z0-9\s]+', ' ', a)
print(b)
wholetext = b.split(' ')
print(wholetext)
c = re.sub('[A-Za-z0-9\s]+', ' ', a)
symbols = c.strip().split(' ')
print(symbols)

# do the for loop stuff you did in your question but with wholetext and symbols

哦,我错过了你不能导入任何东西:(

使用正则表达式…此外,除非我遗漏了您问题的某些部分,否则您所需的输出似乎不会计算“I”、“happy”等。这是错误还是有更多的筛选条件?导入字符串模块,然后您可以删除不带正则表达式的标点。整篇文本=文本。读取().strip()然后text\u list=whole\u text.split()如果无法导入
re
模块,则可以测试字符串中的每个字符,如果它是带有
c的字母。isalpha()
其中c是字符。基于此,您可以创建一个函数来拆分单词(仅限字母)使用正则表达式…此外,除非我遗漏了您问题的某些部分,否则您所需的输出似乎不会计算“I”、“happy”等。这是错误还是有更多的筛选条件?导入字符串模块,然后您可以删除标点符号,而无需正则表达式。整篇文本=text.read().strip()然后text\u list=whole\u text.split()如果无法导入
re
模块,则可以测试字符串中的每个字符,如果它是带有
c的字母。isalpha()
,其中c是字符。基于此,您可以创建一个函数,从其他字符中拆分单词(仅字母)。