用Python统计词频
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python统计词频相关的知识,希望对你有一定的参考价值。
123456 人性 尴尬 啊哈
147852 哈哈 不好看
123456 啊哈
147852 哈哈
147852 嗯嗯 二刷
147852 略略略 人性
123456 尴尬
147963 人性 极端
123456 啊哈
147963 不好看
统计每个标签在多少本图书中出现过,也就是统计每个标签对应的图书编号的
数量。如果一个词汇在同一个图书编号中出现N次,也只能记作1次,因为图书
编号只有一个。所以上面的数据经过处理后结果应该是
(如果能递增或递减排序就更好了,不实现也没事)
人性 3
尴尬 1
啊哈 1
哈哈 1
不好看 2
嗯嗯 1
二刷 1
略略略 1
极端 1
跪求Python大神帮忙
# astr.replace("\n", "")
slist = list(astr.split("\t"))
alist = []
[alist.append(i) for i in slist if i not in alist]
alist[-1] = alist[-1].replace("\n", "")
return alist
if __name__ == "__main__":
code_doc =
with open("test_data.txt", "r", encoding='utf-8') as fs:
for ln in fs.readlines():
l = statistics(ln)
for t in l:
if t not in code_doc:
code_doc.setdefault(t, 1)
else:
code_doc[t] += 1
for keys in code_doc.keys():
print(keys + ' ' + str(code_doc[keys]))追问
是txt文件,给您截图可以嘛?上传不了
def statistics(astr):
# astr.replace("\n", "")
slist = list(astr.split("\t"))
alist = []
[alist.append(i) for i in slist if i not in alist]
alist[-1] = alist[-1].replace("\n", "")
return alist
if __name__ == "__main__":
code_doc =
with open("test_data.txt", "r", encoding='utf-8') as fs:
for ln in fs.readlines():
l = statistics(ln)
for t in l:
if t not in code_doc:
code_doc.setdefault(t, 1)
else:
code_doc[t] += 1
for keys in code_doc.keys():
print(keys + ' ' + str(code_doc[keys]))
您好,请问这里是for循环的缩进出了问题吗?运行结果应该是统计每个词汇的出现次数,而不是每一行
你看下函数statistics里面的分词,我是用\t分的,你的文档里面是用什么分隔的,如果是空格,就用‘ ’
追问您好,文档里是用\t分的我又运行了下,如图所示
这里首先把数字也一起统计了,其次,同一个词在同一个编号下不管出现几次,都只能记作1次,这里似乎没有实现。您的代码如下,
所以想请问您是我运行代码出了问题,还是您的代码本身由于我的表述失误有所欠缺?不胜感激,或者我私信您联系方式把文档发给您?
私信吧
参考技术Bimport pandas as pd
a='''123456 人性 尴尬 啊哈
147852 哈哈 不好看
123456 啊哈
147852 哈哈
147852 嗯嗯 二刷
147852 略略略 人性
123456 尴尬
147963 人性 极端
123456 啊哈
147963 不好看'''
arr=[[x] for x in a.split('\\n')]
df=pd.DataFrame(arr,)
df1=df[0].str.split('\\t',expand=True);df1.columns='id a b c'.split()
df2=df1.set_index('id').stack().reset_index()
df2.drop_duplicates(inplace=True)
print(df2[0].value_counts())
## 源文件txt.txt,输出文件txt_out.txt
import pandas as pd
df=pd.read_csv(r'd:/txt.txt',encoding='gbk',header=None)
df1=df[0].str.split('\\t',expand=True);df1.columns='id a b c'.split()
df2=df1.set_index('id').stack().reset_index()
df2.drop_duplicates(inplace=True)
df2[0].value_counts().to_csv(r'd:/txt_out.txt',header=None,sep='\\t')
追问您好,非常感谢。代码很好用,只是当每一行的标签过多(远远超过3个标签)以及需要处理的数据过大(需要处理1000多万行)时,就会显示memory error(我看了是可能是内存不够的问题)所以想请问还有更适合大规模数据的版本吗?
Python 统计英文词频
# 笨方法,直接把需要替换掉的字符写到一个list中 si =[] def fre(TargetName,desName): ‘‘‘打开 TargetName 文本,统计总单词数、独特的单词数、单词词频,并写入 desName 文件中‘‘‘ dict = {} # 存放单词 number = 0 # 统计累计文本总单词数 uniqueNum = 0 # 统计不重复的单词的个数 # 打开文本 with open(TargetName,‘r‘,encoding=‘utf-8‘) as f: for line in f: # 逐行读取 for s in si: # 遍历 si 中的元素 if s in line: # 如果这一行包含 列表si 中的任意一个元素,就用空格替换掉 line = line.replace(s,‘ ‘) word = line.split() # 将句子分割成单词列表 for w in word: # 遍历单词列表 number += 1 # 每遍历一个单词,总单词数就+1 w = w.lower() # 单词转换成全小写的形式 if w not in dict: # 如果单词不在dict里面,就把单词放进去,设置这个单词的词频为1,并且 duniqueNum+1 dict[w] = 1 uniqueNum += 1 else: # 如果单词已经存在,就将词频数+1 dict[w] = dict[w]+1 #格式化打印 print(f‘{"Total words": <20} {number}‘) print(f‘{"Unique words": <20} {uniqueNum}‘) # 将词频写入文件 with open(desName, ‘w‘, encoding=‘utf8‘) as f: # 先写入总词数、不重复单词数的信息 f.write(f‘{"Total words": <20} {number} ‘) f.write(f‘{"Unique words": <20} {uniqueNum} ‘) f.write(‘----------------------------- ‘) for i in sorted(dict.items(), key=lambda x: x[1], reverse=True): # 将字典降序排序,并遍历 f.write(f‘{i[0]: <20} {i[1]} ‘) print(f‘{i[0]: <20} {i[1]}‘) if __name__=="__main__": name = ‘Gone Girl - Gillian Flynn.txt‘ desName = ‘dict.txt‘ fre(name,desName)
以上是关于用Python统计词频的主要内容,如果未能解决你的问题,请参考以下文章
python 关于词频统计的程序 打印出的高频率单词把他们用便利贴记下来帮助自己学英语(统计小说,或者爬虫采集英文小说)