不再依赖hadoop/spark等工具就可以快速解决大规模中文分词统计频数问题

Posted 快乐的小凯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不再依赖hadoop/spark等工具就可以快速解决大规模中文分词统计频数问题相关的知识,希望对你有一定的参考价值。

本文主要讲的是,我们在没有hadoop或spark这些大数据统计工具的情况下,如何对大规模的文章快速的获取分词并且统计词频的方法,尤其是百万级其以上的数据量效果明显。

【特别说明】我是经过实测的,可能和自己的机器有关,所以耗时上可能有些差异。但是效果肯定是明显的。好的方法就是要分享给大家。

1. 本文涉及到的语言、工具、数据、命令

语言:python

工具:jieba_fast [1] 使用cpython重写了jieba分词库中计算DAG和HMM中的vitrebi函数,速度得到大幅提升。

快速利用清华镜像安装jieba_fast工具,如下所示。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba_fast

数据:本次实验数据100w的文本、中文常用停用词表

命令:sort、uniq、grep

2. 统计步骤

第一步:分词。利用python写一个分词脚本,将所有文本分词并一个词语保存成一行到文件里面。

import jieba_fast as jieba

# 停用词表
GLOBAL_STOPWORD = set()
with open("stopwords.txt", "r", encoding="utf-8") as fin:
    for word in fin:
        GLOBAL_STOPWORD.add(fin)

# 保存result文件
fout = open("result.txt", "w", encoding)

with open("xxx.txt", "r", encoding="utf-8") as fin:
    for line in fin:
        line  = line.strip()
        words = jieba.lcut(line)    # 分词
        for w in words:
            if w not in GLOBAL_STOPWORD:    # 不在停用词表内
                fout.write("\\n".format(w))

===================================================================
[result.txt文件结果展示]

你好
你好
联系
不上
好像
联系
不上
购物
接通
早就

【可喜的是跑这个文件耗时不到1分钟左右就搞定了。

第二步:利用shell命令进行统计和处理

从第一步获取到result.txt结果文件之后,我们开始进行命令统计,如下所示。

cat result.txt | sort | uniq -c > 分词结果统计.txt

===================================================================
[分词结果统计.txt文件结果展示]
2 你好
2 联系
2 不上
1 好像
1 购物
1 接通
1 早就

【可喜的是这种方法耗时不到1分钟就搞定了

对于一些有洁癖的小伙伴,想把结果导入excel中看的更加好看,但是生成的分词结果统计文档里面的词频因为有多有少会有空格问题,如下所示。

===================================================================
[分词结果统计.txt文件结果展示]
  9 ab
 13 ai
  5 and
  1 android
500 app
  1 appa
  1 appapp
  1 appc
 21 appip
  1 babc

对于这种问题也不用担心,一条命令就搞定了,如下所示。

cat 分词统计结果.txt | grep -o "[^ ]\\+\\( \\+[^ ]\\+\\)*" > 分词统计最终结果.txt
===================================================================
[分词统计最终结果.txt文件结果展示]
9 ab
13 ai
5 and
1 android
500 app
1 appa
1 appapp
1 appc
21 appip
1 babc

【可喜的是这种方法耗时不到1分钟就搞定了

3. 小结

各位小伙伴【重要的事情说三遍】【重要的事情说三遍】【重要的事情说三遍】

首先:千万不要傻傻的循环分词之后,再循环统计,我试过这种方式跑了半天,也没有跑出来结果。

然后:也使用 sklearn.feature_extraction.text的CountVectorizer方法,结果把内存跑挂了。

所以我自己发现使用这种方法竟然3分钟就搞定了。赶快把干货分享给大家。

参考:

[1]GitHub - deepcs233/jieba_fast: Use C Api and Swig to Speed up jieba 高效的中文分词库

以上是关于不再依赖hadoop/spark等工具就可以快速解决大规模中文分词统计频数问题的主要内容,如果未能解决你的问题,请参考以下文章

金融需要 hadoop,spark 等这些大数据分析工具吗?使用场景是怎样的

聊聊批计算、流计算、Hadoop、Spark、Storm、Flink等等

Hadoop、Spark、Flink概要

请简要描述一下hadoop,spark,mpi三种计算框架的特点以及分别适用于啥样的场景

Hadoop/Spark生态圈里的新气象

如何强制解锁小米bl锁 联发科