如何用Python做中文分词?

作者: 王树义 | 来源:发表于2017-06-09 18:31 被阅读5390次

    打算绘制中文词云图?那你得先学会如何做中文文本分词。跟着我们的教程,一步步用Python来动手实践吧。

    需求

    在《如何用Python做词云》一文中,我们介绍了英文文本的词云制作方法。大家玩儿得可还高兴?

    文中提过,选择英文文本作为示例,是因为处理起来最简单。但是很快就有读者尝试用中文文本做词云了。按照前文的方法,你成功了吗?

    估计是不成功的。因为这里面缺了一个重要的步骤。

    观察你的英文文本。你会发现英文单词之间采用空格作为强制分隔符。

    例如:

    Yes Minister is a satirical British sitcom written by Sir Antony Jay and Jonathan Lynn that was first transmitted by BBC Television between 1980 and 1984, split over three seven-episode series.

    但是,中文的文本就没有这种空格区隔了。为了做词云,我们首先需要知道中文文本里面都有哪些“词”。

    你可能觉得这根本不是问题——我一眼就能看出词和词之间的边界!

    对,你当然可以。你可以人工处理1句、100句,甚至是10000句话。但是如果给你100万句话呢?

    这就是人工处理和电脑自动化处理的最显著区别——规模。

    别那么急着放弃啊,你可以用电脑来帮忙。

    你的问题应该是:如何用电脑把中文文本正确拆分为一个个的单词呢?

    这种工作,专业术语叫做分词。

    在介绍分词工具及其安装之前,请确认你已经阅读过《如何用Python做词云》一文,并且按照其中的步骤做了相关的准备工作,然后再继续依照本文的介绍一步步实践。

    分词

    中文分词的工具有很多种。有的免费,有的收费。有的在你的笔记本电脑里就能安装使用,有的却需要联网做云计算。

    今天给大家介绍的,是如何利用Python,在你的笔记本电脑上,免费做中文分词。

    我们采用的工具,名称很有特点,叫做“ 结巴分词 ”。

    为什么叫这么奇怪的名字?

    读完本文,你自己应该就能想明白了。

    我们先来安装这款分词工具。回到你的“终端”或者“命令提示符”下。

    进入你之前建立好的demo文件夹。

    输入以下命令:

    pip install jieba
    

    好了,现在你电脑里的Python已经知道该如何给中文分词了。

    数据

    在《如何用Python做词云》一文中,我们使用了英剧”Yes, minister“的维基百科介绍文本。这次我们又从维基百科上找到了这部英剧对应的中文页面。翻译名称叫做《是,大臣》。

    将网页正文拷贝下来之后,存入文本文件yes-minister-cn.txt,并且将这个文件移动到我们的工作目录demo下面。

    好了,我们有了用于分析的中文文本数据了。

    先别忙着编程序。正式输入代码之前,我们还需要做一件事情,就是下载一份中文字体文件。

    请到 这个网址 下载simsun.ttf。

    下载后,将这个ttf字体文件也移动到demo目录下,跟文本文件放在一起。

    代码

    在命令行下,执行:

    jupyter notebook
    

    浏览器会自动开启,并且显示如下界面。

    这里还有上一次词云制作时咱们的劳动成果。此时目录下多了一个文本文件,是"Yes, Minister"的中文介绍信息。

    打开这个文件,浏览一下内容。

    我们确认中文文本内容已经正确存储。

    回到Jupyter笔记本的主页面。点击New按钮,新建一个笔记本(Notebook)。在Notebooks里面,请选择Python 2选项。

    系统会提示我们输入Notebook的名称。为了和上次的英文词云制作笔记本区别,就叫它wordcloud-cn好了。

    我们在网页里唯一的代码文本框里,输入以下3条语句。输入后,按Shift+Enter键执行。

    filename = "yes-minister-cn.txt"
    with open(filename) as f:
     mytext = f.read()
    

    然后我们尝试显示mytext的内容。输入以下语句之后,还是得按Shift+Enter键执行。

    print(mytext)
    

    显示的结果如下图所示。

    既然中文文本内容读取没有问题,我们就开始分词吧。输入以下两行语句:

    import jieba
    mytext = " ".join(jieba.cut(mytext))
    

    系统会提示一些信息,那是结巴分词第一次启用的时候需要做的准备工作。忽略就可以了。

    分词的结果如何?我们来看看。输入:

    print(mytext)
    

    你就可以看到下图所示的分词结果了。

    单词之间已经不再紧紧相连,而是用空格做了区隔,就如同英文单词间的自然划分一样。

    你是不是迫不及待要用分词后的中文文本作词云了?

    可以,输入以下语句:

    from wordcloud import WordCloud
    wordcloud = WordCloud().generate(mytext)
    %pylab inline
    import matplotlib.pyplot as plt
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off"
    

    激动地期待着中文词云的出现?

    可惜,你看到的词云是这个样子的。

    你是不是非常愤怒,觉得这次又掉坑里了?

    别着急,出现这样的结果,并不是分词或者词云绘制工具有问题,更不是因为咱们的教程步骤有误,只是因为字体缺失。词云绘制工具wordcloud默认使用的字体是英文的,不包含中文编码,所以才会方框一片。解决的办法,就是把你之前下载的simsun.ttf,作为指定输出字体。

    输入以下语句:

    from wordcloud import WordCloud
    wordcloud = WordCloud(font_path="simsun.ttf").generate(mytext)
    %pylab inline
    import matplotlib.pyplot as plt
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")
    

    这次你看到的输出图形就变成了这个样子:

    这样一来,我们就通过中文词云的制作过程,体会到了中文分词的必要性了。

    这里给你留个思考题,对比一下此次生成的中文词云,和上次做出的英文词云:

    这两个词云对应的文本都来自维基百科,描述的是同样一部剧,它们有什么异同?从这种对比中,你可以发现维基百科中英文介绍内容之间,有哪些有趣的规律?

    讨论

    掌握了本方法后,你自己做出了一张什么样的中文词云图?除了做词云以外,你还知道中文分词的哪些其他应用场景?欢迎留言,分享给大家。我们共同交流讨论。

    如果你对我的文章感兴趣,欢迎点赞,并且微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)。

    如果本文可能对你身边的亲友有帮助,也欢迎你把本文通过微博或朋友圈分享给他们。让他们一起参与到我们的讨论中来。

    延伸阅读

    如何用《玉树芝兰》入门数据科学?

    数据科学相关文章合集(玉树芝兰)

    作者信息

    王树义,大学教师,终身学习者。稍微懂一点儿写作、演讲、Python和机器学习。欢迎微信关注并置顶我的公众号“玉树芝兰”(nkwangshuyi)。

    相关文章

      网友评论

      • 有趣姑娘爱灵越uy:能够在手机上运行
      • 有趣姑娘爱灵越uy:只想要代码
      • 2a6b1a802d28:Python 3 需将matplot替换为matplotlib
      • 好先生17:from wordcloud import WordCloud
        # wordcloud默认不支持中文字体,必须手动指定一种中文字体
        wordcloud = WordCloud(collocations=False, font_path='simsun.ttf').generate(mytext)

        我使用的是python3,遇到这个坑:将字体放在demo目录下以后,词云还是不能显示中文字体,稍微更改一下,给wordcloud指定字体文件即可正常使用。
      • Miranda_210f:打开中文文本报错
        wxl_a806:@llf_07da 谢谢你的解答,问题迎刃而解
        大力SAMA:也可以在保存TXT的时候选择utf-8编码
        llf_07da:应该是编码问题,尝试打开时添加编码格式,
        with open(file,encoding='utf-8') as f:
      • 记忆随风漂泊:这个中文数量是有限制的吗
      • 迷恋你的脸1314:出来的图片像素385*202,怎么样可以调整像素,看大图啊
        jackPan:@东风冷雪 codea是什么意思,
        知识学者:@jackPan 英文的。怎么写codea。
        jackPan:http://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html#wordcloud.WordCloud
      • 李缓之:沙发,舒服🌺🌺

      本文标题:如何用Python做中文分词?

      本文链接:https://www.haomeiwen.com/subject/fypfqxtx.html