WorldCount-词频统计-英语考级必备-超好用-开源-Python

多语言协作与Python开发的最佳实践–详解GitHub项目WordCount

引言

本文将详细介绍GitHub上的一个名为"WordCount"的项目(https://github.com/hrhszsdtc/WordCount或Gitee镜像库https://gitee.com/hrh233/WordCount),该项目是一个英文词频统计工具,支持扫描包括pdf在内的多种文档格式以及多种图片文件并支持输出至Excel,Markdown,HTML等表格。我们将从概念和术语介绍开始,然后深入原理讲解,接着通过实战案例讲解来帮助读者理解和实践,最后我们会分析运行结果并总结全文。

使用背景

项目用途广泛,包括但不限于:

  • 分析文学作品:看看作者使用了哪些词语,哪些词语反映了他们的风格,主题,情感等,亦或是比较不同的作品,看看它们有什么相似或不同之处,有什么独有的或是共有的词汇.
  • 生成词云,然后用词云来展示你的个人简介,喜欢的歌曲,心情日记等
  • 优化你的网站或博客的搜索引擎排名,通过分析你的内容中出现的关键词或短语,你可以调整你的标题,描述,标签等元素,让你的网站或博客更容易被搜索引擎发现和推荐
  • 分析英文考试高频词,比如四六级英语,考研英语等等,方便背诵重点词汇

概念和术语介绍

  • GitHub:GitHub是一个面向开源及私有软件项目的托管平台,让开发者可以通过Git进行协作。GitHub提供了Git存储库的托管服务,以及一些协作功能,如Bug跟踪、特性请求和任务管理。GitHub还提供了开发者社交网络功能,例如关注、社交网络新闻供稿、讨论区和代码片段控件。因为只支持git作为唯一的版本库格式进行托管,故名GitHub。

  • WordCount:是一种常见的文本处理任务,主要目的是统计文本中单词的数量。在编程语言中,通常需要编写特定的代码来实现这个功能。

  • Python:一种高级、通用的编程语言,被广泛用于Web开发、数据分析、人工智能等领域。

  • 文本处理:是指对文本数据进行处理的过程,包括数据清洗、数据转换、数据分析等步骤。

原理讲解

WordCount项目运用了多种语言来实现,主要由Python编写,也用了Julia, C++等语言参与协作

  • 首先,我们跟着程序往下看,发现了一个julia模块,调用了my_julia_re.jl,跟随着点进去,封装了2个函数,re_sub和re_findall,可以基本确定是用来对应Python中的re模块,用来处理正则表达式的,用julia进行此类计算,尤其是面对长文时,速度会快不少
  • 有parse_pdf和parse_img两个函数,分别用来解析pdf和图片,分别用来fitz和easyocr库,这也大大避免了"造轮子"的麻烦.其中,parse_img中,运用了协程的知识,避免阻塞主线程中的GUI
  • 往下看,GUI和日志模块就不讲了,比较常规.我们接下来看到GUI类的count_word方法,也是主要的入口,里面主要做了以下几件事:
    • 首先,先获取了文本的内容,略过不提
    • 然后,将文本全小写,来到最重要的分词阶段,重点来到后面2个正则表达式,r"[^A-Za-z\\'-]"r"\b\w+(?:-\w+)*\b",我们下面一个一个解释
    • 第一个正则表达式匹配任意不是字母,单引号或连字符的字符.[A-Za-z\‘-]是一个字符类,用方括号 [ ] 包围,表示匹配方括号内的任意一个字符.^ 在方括号内表示反义,即匹配除了方括号内的字符以外的任意字符. A-Z 和 a-z 表示字母的范围,\’ 表示单引号, - 表示连字符.例如,这个正则表达式可以匹配空格,数字,标点符号等.这个表达式加上sub很好地将其他无关字符换成,但也不会影响带连字符或缩写的单词
    • 第二个正则表达式匹配由字母,数字或连字符组成的单词. \b 表示单词的边界,即单词和空白符之间的位置.\w 表示字母或数字或下划线. + 表示重复一次或多次.(?:-\w+) 表示一个非捕获组,用圆括号 ( ) 包围,表示作为一个整体进行匹配. ?: 表示这个组不会被捕获,即不会被存储在内存中供后续使用. -\w+ 表示一个连字符后面跟着一个或多个字母或数字或下划线. * 表示重复零次或多次.例如,这个正则表达式可以匹配 “hello”、“world”、“e-mail”、“co-operate” 等单词.配合上findall就能精确定位英文单词,也很好地考虑了带连字符或缩写的单词
    • 最后,用来collections库的Counter进行统计,用tabulate转换成表格并显示出来
  • 这里在将导出之前详细讲一下最后一段代码,我个人认为写的很巧妙,将输出重定向到了Text框里,具体实现步骤大概是这样的:
    代码定义了一个类,名为 PrintToText,它的作用是将输出打印到一个文本框中.类的初始化方法接受一个参数 text,表示要打印到的文本框对象,并将其赋值给类的属性 text.类的 write 方法接受一个参数 s,表示要打印的字符串,并使用 text 属性的 insert,see 和 update 方法,将 s 参数插入到文本框的末尾位置,并更新文本框的显示效果.然后用name-main习语判断,如果是主模块,则创建一个 Tk 对象,用于创建和管理图形界面,并创建一个 GUI 对象,用于实现自定义的图形界面.将 GUI 对象的 words 属性设置为 None.创建一个 PrintToText 对象,用于将输出重定向到 GUI 对象的 text 属性.使用 contextlib 模块提供的 redirect_stdout 和 redirect_stderr 函数,将标准输出和标准错误重定向到 PrintToText 对象中.这样,任何使用 print 或 raise 的语句都会将输出或错误信息打印到文本框中.使用 GUI 对象的 master 属性(即 Tk 对象)调用 mainloop 方法,进入图形界面的主循环.这样,图形界面就可以响应用户的操作,并显示相应的输出.
  • 接着详细讲讲导出结果的代码.首先,我们看到一个SingletonTabToNormal(type)类,它作为TabToNormal的元类被定义,这样就可以在TabToNormal类被实例化时,自动调用SingletonTabToNormal的__call__方法,从而保证只有一个TabToNormal类实例存在.
  • 接着,我们看到了TabToNormal类,一些常规的打开关闭文件以及导出到正常格式不讲了(不过不得不说这个table_to_new函数和字典的设计确实巧妙),我们重点看看table_to_excel这个方法,这一部分我看了好久才看懂
    • 首先,总体来说,就是用了pandas库输出到excel文件,但前面的操作就比较惊艳了
    • 我们从后往前看,先创建了一个数据框对象,这个对象利用了一个字典表达式{"Word": [row[0] for row in new_tab], "Count": [row[1] for row in new_tab]}将表格转换成一个合适的字典
    • 再看前面,理论上传入的参数是一个github类型的tabulate表格,但实际操作中,我们发现,需要的表格并没有那么多无用的字符,这就要讲到table_to_new方法了,这也是我认为的一个点睛之笔
    • table_to_new这个函数来自table_to_new模块,这个模块主要是调用了1个c共享库,并将一个由 C 语言字符串指针组成的二维数组转换为一个 Python 列表,说明核心代码在table_to_new.cpp中,我们直接看代码
    • 代码比较复杂,有兴趣可以自己去看,这里我简单说一下功能,就是去除了表格中的空行,空格,将字符串以空行分隔,并以竖线符号分割,返回一个二维数组,功能虽简单,实现起来可不容易
  • 代码和逻辑大致介绍完了,接下来我们实战分析

实战案例讲解及使用方法

接下来,我们将通过一个实战案例来演示如何使用GitHub上的WordCount项目.

  1. 首先,安装Git,Python,julia和cpp的编译器

  2. 从GitHub上克隆项目,终端输入git clone https://github.com/hrhszsdtc/WordCount.git

  3. 进入项目目录,终端输入cd src

  4. 导入必要的库,运行python -m pip install -r requirements.txt

  5. 准备好Python和Julia的环境:

    • 进入Python REPL,运行
    >>> import julia
    >>> julia.install()
    
    • 进入Julia REPL,运行
    julia> using Pkg
    julia> Pkg.add("PyCall")
    
  6. 编译table_to_new.cpp,从table_to_new.py中看出需要的是.so文件,我这里以Windows环境的g++为例,终端输入g++ -shared -fPIC -o table_to_new.so table_to_new.cpp即可

  7. 最后,终端输入python main.py并安装GUI提示操作即可,且可以在根目录的./src/logs文件夹查看日志

运行结果与分析

运行完程序,检查输出的文件和GUI上的显示,与实际一致,好评!

总结和展望

本文主要介绍了GitHub上的WordCount项目,包括其原理、实现方法和应用场景。我们通过实战案例讲解了如何使用这个项目,以及如何评估和理解运行结果。希望这篇文章能帮助你更好地理解和应用WordCount项目。在未来,我们期待看到更多的创新和优化在这个项目中实现,以满足更多复杂和个性化的需求。

最后,欢迎大家关注博主的其他高质量文章,比如基于信息论的密码强度检测器.
谢谢大家观看到最后

你可能感兴趣的:(Python高效办公,开源,python,开发语言,julia,开源软件)