【Python】词频统计(written in python and Mapreduce)

2023-05-16

一、利用Python进行词频统计

(一)计算机等级考试中常用的方法
首先是一个比较标准的考试中使用的方法,针对英文文本:

def getText():
    txt = open("E:\hamlet.txt", "r").read()   #读取Hamlet文本文件,并返回给txt
    txt = txt.lower()          #将文件中的单词全部变为小写
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': 
        txt = txt.replace(ch, " ")   #将文本中特殊字符替换为空格
    return txt
 
hamletTxt = getText()
words  = hamletTxt.split() #按照空格,将文本分割
counts = {}
for word in words:  #统计单词出现的次数,并存储到counts字典中         
    counts[word] = counts.get(word,0) + 1  #先给字典赋值,如果字典中没有word这个键,则返回0
items = list(counts.items())   #将字典转换为列表,以便操作
items.sort(key=lambda x:x[1], reverse=True)  # 见下面函数讲解
for i in range(10):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

针对中文文本则一般使用jieba库,下面是一个示例(但不算很常考):

#使用Jieba库进行词频统计
import jieba
txt = open("Jieba词频统计素材.txt", "r", encoding='utf-8').read()#防止出现编码问题而使用encoding
words  = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue#不希望统计到单个词,比如说“的”,“好”等
   counts[word] = counts.get(word,0) + 1
   #将分词放入字典中
#如果有不希望统计到的词,那就在开始时创建一个包含所有你不想统计到的词语列表,例如
#exclude_words=["统计","排除"]
#for word in exclude_words:
#    del counts[word]
#这样就可以避免统计到不希望出现的词了
#以下开始对字典中词语进行统计
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True) 
for i in range(10):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

(二)升级方法

  1. 利用Python进行词频统计的核心语法
    要掌握好利用python词频统计(特指上述的最简单的方法),我认为有以下几个重要的点需要熟悉
    (1)将词放入字典,并同时统计频数的过程
words  = txt_file.split() #以" "为分隔符分隔文件
words2 = txt_file.lcut()#或者将中文文件用jieba库分词
for word in words:
	counts[word]=counts.get(word,0)+1#dict.get(寻找值,找不到则返回的值);这一行代码同时实现计数

(2)将字典的键值对以列表形式输出,中途进行排序的过程

items = list(counts.items())#items方法返回键值对
items.sort(key=lambda x:x[1], reverse=True) 

先简单讲lambda函数,lambda x:y,输入x返回y,可以理解成sort函数的key参数的值等于lambda函数的返回值;lambda函数输入值x相当于items列表,输出的是列表的第二列也就是itmes[1],即返回的是词的频数。
也就是说,按照频数对items排序。
3. 利用Python进行词频统计的三种方法示例

import pandas as pd
from collections import Counter
words_list = ["Monday","Tuesday","Thursday","Zeus","Venus","Monday","Monday","Zeus","Venus","Venus"]
dict = {} 
for word in words_list:         
    dict[word] = dict.get(word, 0) + 1 
print ("Result1:\n",dict) 
result2 =Counter(words_list)
print("Result2:\n",result2)
result3 =pd.value_counts(words_list)
print("Result3:\n",result3)
Result1:
 {'Monday': 3, 'Tuesday': 1, 'Thursday': 1, 'Zeus': 2, 'Venus': 3}
Result2:
 Counter({'Monday': 3, 'Venus': 3, 'Zeus': 2, 'Tuesday': 1, 'Thursday': 1})
Result3:
 Monday      3
Venus       3
Zeus        2
Thursday    1
Tuesday     1
dtype: int64

二、Mapreduce的方法进行词频统计

面对大型的文件的统计需求,需要使用到集群来进行词频统计。我们打算在Hadoop平台上运行Python程序,分布计算从而提高我们词频统计的效率。因此使用了写MapReduce的方法。

(一)代码示例以及解释
Map:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from operator import itemgetter
from itertools import groupby

def main():
    # input comes from STDIN (standard input)
    for line in sys.stdin:
        # remove leading and trailing whitespace
        line = line.strip()
        # split the line into words
        words = line.split()
        # increase counters
        for word in words:
            # write the results to STDOUT (standard output);
            # what we output here will be the input for the
            # Reduce step, i.e. the input for reducer.py
            # tab-delimited; the trivial word count is 1
            print('%s\t%s' % (word, 1))

if (__name__ == "__main__" ):
    main()

Reduce:

#!/usr/bin/env python
 
from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

# input comes from STDIN
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()
    # parse the input we got from mapper.py
    word, count = line.split('\t', 1)
    # convert count (currently a string) to int
    try:
        count = int(count)
    except ValueError:
    # count was not a number, so silently
    # ignore/discard this line
        continue

    
    # this IF-switch only works because Hadoop sorts map output
    # by key (here: word) before it is passed to the reducer
    if current_word == word:
        current_count += count
    else:
        if current_word:
          # write result to STDOUT
            print('%s\t%s' % (current_word, current_count))
        current_count = count
        current_word = word

 # do not forget to output the last word if needed!
if current_word == word:
    print('%s,%s' % (current_word, current_count))

(二)核心语法的学习探究

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】词频统计(written in python and Mapreduce) 的相关文章

  • 从文件中读取行,处理它,然后将其删除

    我有一个 22mb 的文本文件 其中包含数字列表 每行 1 个数字 我试图让 python 读取数字 处理数字并将结果写入另一个文件中 所有这些都有效 但如果我必须停止该程序 它就会从头开始 我一开始尝试使用mysql数据库 但它太慢了 我
  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性
  • 在Python中读取PDF属性/元数据

    如何使用 Python 读取 PDF 文件中存储的属性 元数据 例如标题 作者 主题和关键字 Try pdfminer https github com euske pdfminer from pdfminer pdfparser impo
  • 带有元数据的 scipy kdtree

    我目前正在寻找一种方法来构建几个 kd 树以快速查询一些 n 维数据 但是 我对 scipy KD 树算法有一些问题 我的数据包括id gt data somedata coordinate x y 我希望能够基于坐标和 k 最近邻居的 i
  • Python - 对象 MagicMock 不能在“await”表达式中使用

    当我尝试使用 MagicMock 在单元测试中模拟异步函数时 出现以下异常 类型错误 对象 MagicMock 不能在 await 表达式中使用 示例代码如下 source code class Service async def comp
  • XGBoost 产生预测结果和概率

    我可能正在文档中查看它 但我想知道 XGBoost 是否有办法生成结果的预测和概率 就我而言 我正在尝试预测多类分类器 如果我能返回Medium 88 那就太好了 分类器 中 预测概率 88 参数 params max depth 3 ob
  • Python daysBetweenDate

    我想我可能有一个无限循环 因为每当我运行代码时 我都会收到一条错误消息 它说 程序因使用 13 CPU 秒而关闭 整个代码 应该以日期作为输入并输出第二天 此代码假设所有月份都是 30 天 除了daysBetweenDates功能正常 其他
  • 在自定义 Dask 图中包含关键字参数 (kwargs)

    我正在使用 Dask 为一项操作构建自定义图表 熟悉如何将参数传递给 Dask 图中的函数 并阅读了docs http dask pydata org en latest custom graphs html 然而似乎还是缺少了一些东西 D
  • PyPDF2 复制后返回空白 PDF

    def EncryptPDFFiles password directory pdfFiles success 0 Get all PDF files from a directory for folderName subFolders f
  • Pandas 将 NULL 读取为 NaN 浮点数而不是 str [重复]

    这个问题在这里已经有答案了 给定文件 cat test csv a b c NULL d e f g h i j k l m n 其中第三列被视为str 当我对列执行字符串函数时 pandas已阅读NULLstr 作为一个NaN float
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • 使用 pybind11 修改 std::array 的默认值

    我的目标是修改在中声明的数组C struct并赋予默认值 我读过了this https pybind11 readthedocs io en stable advanced cast stl html making opaque types
  • 如何从 google place api for python 中的地点 id 获取地点详细信息

    我正在使用 Google Places API 和 Python 来构建一个食品集体智能应用程序 例如周围有哪些餐馆 他们的评级如何 营业时间是什么 等等 我正在Python中执行以下操作 from googleplaces import
  • 如何在Python中比较枚举?

    从 Python 3 4 开始 Enum类存在 我正在编写一个程序 其中一些常量具有特定的顺序 我想知道哪种方式最适合比较它们 class Information Enum ValueOnly 0 FirstDerivative 1 Sec
  • 树莓派上的 /dev/mem 访问被拒绝

    我正在使用我的 Raspberry Pi 并且正在编写一个 cgi python 脚本 该脚本创建一个网页来控制我的 gpio 输出引脚 当我尝试将 RPi GPIO 作为 GPIO 导入时 我的脚本崩溃了 这是我收到的错误 File co
  • 使用 South 更改 Django 模型列默认值

    我在 Django 项目中使用 South 和 Postgresql DB 我想更改一个模型字段的默认值以供继续使用 我不需要以前的记录 刚刚新记录 我是否需要为此进行迁移 或者只是更改模型 旧场详细信息 background style
  • 为什么 `Pool.map()` 多处理中的内存消耗急剧增加?

    我正在对 pandas 数据帧进行多重处理 方法是将其拆分为多个数据帧 这些数据帧存储为列表 并且 使用Pool map 我将数据帧传递给定义的函数 我的输入文件约为 300 mb 因此小数据帧大约为 75 mb 但是 当多处理运行时 内存
  • Pandas - 过滤器和正则表达式搜索 DataFrame 的索引

    我有一个 DataFrame 其中列是 MultiIndex 索引是名称列表 即index Andrew Bob Calvin 我想创建一个函数来返回数据帧中使用名称 Bob 或以字母 A 开头或以小写字母开头的所有行 如何才能做到这一点
  • 选择 matplotlib xticks 频率

    我正在用字符串作为 x 标签绘制数据 我想控制标签频率 以免文本使轴过载 在下面的示例中 我只想每 3 个刻度看到一个标签 a d g j 我可以做到这一点的一种方法是每 n 个元素用 2 个空字符串替换 my xticks 元素 但我确信
  • 从 Python 脚本创建可执行文件,同时获取较小的输出大小

    我的问题可能已经在某个地方得到了解答 但我仍然找不到直接的答案 我想从 python 代码创建一个独立的可执行文件 我已经尝试过很多解决方案 例如py2exe pyinstaller等等 但我的问题是输出文件大小很大 例如 在pyinsta

随机推荐

  • 注解

    好处 把问题暴露在编译时期 xff1b 增强程序健壮性 xff1b 可以让JVM检查除了语法错误以外的其他的自定义检查 xff1b 位置 可以加到包 xff0c 类 xff0c 方法 xff0c 字段 xff0c 局部变量等位置 xff1b
  • 【知识图谱】课程笔记1---知识图谱简介

    1 知识图谱 知识图谱是一种基于图的数据结构 由节点 point 和边 Edge 组成 每个节点表示一个 实体 每条边为实体与实体之间的 关系 知识图谱本质上是语义网络 通过这种先验的知识网络 xff0c 让机器像人类一样可以联想 推理 它
  • 特征检测+SIFT点匹配+PNP位姿确定

    SIFT特征检测 43 FLANN点匹配 43 PNP位姿确定 软件环境 windows 10 vs2013 opencv3 1 0 43 opencv3 1 0 contrib 基本原理 1 SIFT 特征点检测 43 匹配 2 PNP位
  • STM32CUBEIDE(MX续)学习笔记(七)——FREERTOS+DMA+队列+循环数组方式进行串口收发

    一 收发主要逻辑 1 接收 xff1a 利用DMA和空闲中断一次接收一帧的不定长数据 xff0c 接收到数据后 暂停 xff08 之后分析为何要暂停而不是停止 xff09 DMA xff0c 快速利用结构体存储接收到数据的地址和长度 xff
  • C语言 malloc() + 结构体指针定义结构体变量

    之前在学习链表的过程中 xff0c 笔者认为新节点必须如下定义 xff1a struct Node p struct Node int val p pNext int main Node Node1 Node Node2 Node Node
  • Windows JDK8 安装

    Windows JDK8 安装 准备步骤安装完成 准备 准备jdk8 官网下载 xff1a https www oracle com java technologies javase javase jdk8 downloads html 根
  • openmv与其他单片双向串口通信

    Openmv与其他单片双向串口通信 目的 为了让openmv进行阈值切换或者只运行某一部分代码 xff0c 因此需要openmv与其他单片建立双向通信进行更改内部参数 起因 openmv自带接收函数uart read 进行接收 xff0c
  • 树莓派学习笔记4-opencv网络图传-1

    前记 为了实现QT编写的上位机显示下位机树莓派的opencv实时画面 xff0c 因此需要进行opencv的网络图传 xff0c 包括以下内容 1 QT编写TCP服务端并配置opencv显示摄像头画面 2 python网络编程客户端发送op
  • Ubuntu学习笔记5-安装Arduino及ros配置

    Ubuntu学习笔记5 安装Arduino及ros配置 前言 由于需要编写ESP32代码作为ros下位机使用 xff0c 顺带想体验一下ubuntu下开发 xff0c 因此在ubutnu20 04上安装Arduino并测试 xff0c 不过
  • OpenStack部署(五)

    部署版本 xff1a pike 部署环境 xff1a CentOS7 6 配置文件中所有controller可修改为控制节点ip地址 配置过程中使用 echo 验证命令执行情况 Networking service 安装与配置neutron
  • 爬虫要违法了吗?小编告诉大家:守住规则,大胆去爬

    最近我学习和实践网络爬虫 xff0c 总想着在这儿抓点数据在那儿抓点数据 但不知为什么 xff0c 抓取别人网站数据时 xff0c 总会产生莫名恐慌生怕自己一不小心就侵权了 xff0c 然后被关在监狱摩擦 所以我想现在这个时候 xff0c
  • CXF开发总结

    CXF开发总结 xff08 3种模式 xff09 基于SOAP Server端开发 导包 xff0c 下载cxf包 xff0c 地址http cxf apache org xff0c 导入eclipse为web service服务提供类定义
  • 年度最受欢迎的Python的书籍,还不来看看!

    Python是一种通用的解释型编程 xff0c 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 xff0c 因为它易于学习和理解 xff0c 随着这种语言的普及 xff0c Python程序员的机会也越
  • Html5下载功能实现

    downloader模块管理网络文件下载任务 xff0c 用于从服务器下载各种文件 xff0c 并支持跨域访问操作 通过plus downloader获取下载管理对象 Downloader下载使用HTTP的GET POST方式请求下载文件
  • 卡尔曼滤波总结(KF、EKF、UKF)

    1 马尔科夫 参考 xff1a https zhuanlan zhihu com p 489239366 2 协方差矩阵 1 xff09 对于一个样本集合S xff0c 如果每个样本是一个n维空间中的一个列向量 xff0c 则使用协方差矩阵
  • Centos7搭建Squid代理服务器

    Centos7搭建Squid代理服务器 sumu s home 1 无需验证版 http 1 1 安装 yum install squid 1 2 修改配置文件 打开文件 vim etc squid squid conf修改 http ac
  • Python 3.6解决报错:'NoneType' object has no attribute 'decode'的办法

    for repo dict in repo dicts names append repo dict 39 name 39 plot dict 61 39 value 39 repo dict 39 stargazers count 39
  • 手把手教你实现ROS依赖任意第三方库+lpsolve求解整数线性规划问题为例

    How to link dynamic libraries use third party libraries in ROS lpsolve solver as examples 喜欢的话请关注 xff0c 欢迎github 给个小星星 g
  • UCOS-III

    一 UCOSIII 简介 UCOSIII 是一个可裁剪 可固化 可剥夺 的多任务系统 xff0c 没有任务数目的限制 xff0c 是 UCOS 的第三代内核 xff0c UCOSIII 有以下几个重要的特性 xff1a 可剥夺多任务管理 x
  • 【Python】词频统计(written in python and Mapreduce)

    一 利用Python进行词频统计 xff08 一 xff09 计算机等级考试中常用的方法 首先是一个比较标准的考试中使用的方法 xff0c 针对英文文本 xff1a span class token keyword def span spa