查看原文
其他

小demo:对德文数据进行文本分析

大邓 大邓和他的Python 2019-04-26

昨天做了一个德文数据的词频统计,发来的数据是word文件,如下

für mich ging es bei einem foto mit präsident erdogan nicht um politik oder um wahlen, sondern darum, das höchste amt des landes meiner familie zu respektieren.“deutsche fußball-fans hatten özil und gündogan das erdogan-foto übel genommen


一开始我以为他发错的数据有问题,不然怎么会 乱码呢!后来才知道,数据文件没错,德文的有些字符长得比较奇特。让我对word的德文文档做词频统计,按照流程顺序

  1. 读取docx文件的文本数据

  2. 对德文进行词频统计

  3. 输出到csv或者xlsx

现在我们已经将任务分成了四个部分,每个部分如果有无法实现的地方,可以百度谷歌,最后将各部分拼接起来,这个任务就完成了。

下面我们开始做吧

读取docx文件

百度搜了一遍,发现有一个 docx 库可以实现读取,而且找到现成的代码可供使用。

docx库的安装方法

  1. pip install python-docx

安装好docx库之后,我们定义了read_docx函数用来读取docx文件,返回文本内容

  1. import docx



  1. def read_docx(file):

  2.    #file:待读取的docx文件

  3.    fileobj=docx.Document(file)

  4.    content = ''

  5.    for para in fileobj.paragraphs:

  6.        content+=para.text

  7.    return content.lower()

我们做一个下测试,试着读取一下

Özil verteidigt seinErdogan-Foto.docx

file = 'Özil verteidigt sein Erdogan-Foto.docx'

te  text = read_docx(file=
)

  1. #只显示前100个字符

  2. text[:100]

运行结果

  1. 'was auch immer das ergebnis der letzten wahl gewesen wäre, oder der wahl davor, ich hätte das bild '

对德文进行词频

我直接在github上搜索德文切词库找到 SoMaJo 库,安装方法

  1. pip install SoMaJo

分词的代码也找到了,直接定义为 segment函数

  1. from somajo import Tokenizer


  2. def segment(text):

  3.    # text:待传入的德语文本

  4.    #分词器初始化

  5.    tokenizer = Tokenizer(split_camel_case=True, token_classes=False, extra_info=False)

  6.    #用于存放词语及对应出现频数的字典

  7.    wordfreq = dict()

  8.    wordlist = tokenizer.tokenize(text)

  9.    wordset = set(wordlist)

  10.    #剔除掉长度小于等于1的单词

  11.    wordset = set([w for w in wordset if len(w)>1])

  12.    for w in wordset:

  13.        wordfreq.setdefault(w, 0)

  14.        wordfreq[w]+=wordlist.count(w)

  15.    output = sorted(wordfreq.items(), key=lambda k: k[1], reverse=True)

  16.    return output

我们试试segment函数是否能正常运行

  1. wordfreq = segment(text)

  2. wordfreq

运行结果

  1. [('der', 24),

  2. ('das', 18),

  3. ('und', 18),

  4. ('in', 17),

  5. ('ich', 16),

  6. ('nicht', 13),

  7. ('haben', 12),

  8. ('es', 12),

  9. ......

  10. ......

  11. ......

  12. ('dort', 1),

  13. ('geäußert', 1),

  14. ('programm', 1),

  15. ('steinmeier', 1),

  16. ('allen', 1),

  17. ('sogar', 1),

  18. ('gesorgt', 1),

  19. ('hätten', 1),

  20. ('bewusst', 1),

  21. ('schwieg', 1),

  22. ('fußball', 1),

  23. ('dfb', 1),

  24. ('aus', 1),

  25. ('eigenen', 1),

  26. ('erklärung', 1),

输出结果

将结果保存到xlsx文件中,第一列是词语,第二列是词频。往常我们都是保存到csv文件中,但是发现用excel打开csv时,德文真的乱码了。那些奇怪的字符被更奇怪的乱码替换了。我直接google搜

how toexportgermanintoexcelusingpython

得到下面的结果

搜索结果的第一个结果里找到我需要的代码。我这里定义为to_xlsx函数

  1. import pandas as pd



  2. def to_xlsx(wordfreq, excelfilename):

  3.    # wordfreq:  segment(text)得到的结果

  4.    # excelfilename: xlsx文件名

  5.    writer = pd.ExcelWriter(excelfilename, options={'encoding': 'utf-8'})

  6.    df = pd.DataFrame(wordfreq, columns=['词语', '词频'])

  7.    df.to_excel(writer, 'Sheet1')

  8.    writer.save()

在这里我们测试下 to_xlsx函数,看看能否输出xlsx。

  1. to_xlsx(wordfreq,'output.xlsx')

我们打开 output.xlsx 文件,如下图

完美!

现在我们将上面的代码组装起来


  1. import docx

  2. import pandas as pd

  3. from somajo import Tokenizer



  4. def read_docx(file):

  5.    #file:待读取的docx文件

  6.    fileobj=docx.Document(file)

  7.    content = ''

  8.    for para in fileobj.paragraphs:

  9.        content+=para.text

  10.    return content.lower()


  11. def segment(text):

  12.    # text:待传入的德语文本

  13.    #分词器初始化

  14.    tokenizer = Tokenizer(split_camel_case=True, token_classes=False, extra_info=False)

  15.    #用于存放词语及对应出现频数的字典

  16.    wordfreq = dict()

  17.    wordlist = tokenizer.tokenize(text)

  18.    wordset = set(wordlist)

  19.    #剔除掉长度小于等于1的单词

  20.    wordset = set([w for w in wordset if len(w)>1])

  21.    for w in wordset:

  22.        wordfreq.setdefault(w, 0)

  23.        wordfreq[w]+=wordlist.count(w)

  24.    output = sorted(wordfreq.items(), key=lambda k: k[1], reverse=True)

  25.    return output


  26. def to_xlsx(wordfreq, excelfilename):

  27.    # wordfreq:  segment(text)得到的结果

  28.    # excelfilename: xlsx文件名

  29.    writer = pd.ExcelWriter(excelfilename, options={'encoding': 'utf-8'})

  30.    df = pd.DataFrame(wordfreq, columns=['词语', '词频'])

  31.    df.to_excel(writer, 'Sheet1')

  32.    writer.save()


  33. text = read_docx(file='Özil verteidigt sein Erdogan-Foto.docx')

  34. wordfreq = segment(text)

  35. to_xlsx(wordfreq, 'output.xlsx')


精选文章

argparse模块用法实例详解

使用Python制作WORD报告

使用Pandas、Jinja和WeasyPrint制作pdf报告

pkuseg:领域细分的中文分词工具      

用Python自动化生成倒计时图片

为什么你要为2020,而不是2019做计划?

如何让python代码显示进度信息?   

我是如何通过python挣外快的  

PySimpleGUI: 开发自己第一个软件  

自然语言处理之LDA主题模型    

100G 文本分析语料资源(免费下载)

    


后台回复“20190218”,得到本文项目源码。                   

支持原创,记得手动点赞


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存