前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于word文档,使用Python输出关键词和词频,并将关键词的词性也标注出来

基于word文档,使用Python输出关键词和词频,并将关键词的词性也标注出来

作者头像
前端皮皮
发布2023-08-17 09:25:48
发布2023-08-17 09:25:48
2490
举报
文章被收录于专栏:前端进阶学习交流

大家好,我是Python进阶者。

一、前言

前几天在有个粉丝问了个问题,大概意思是这样的:基于Python代码,要求输出word文档中的关键词和词频,并且将关键词的词性也标注出来,最终输出一个Excel文件,一共3列,列名分别是关键词、词频和词性。

二、实现过程

这里一开始我也不知道怎么处理,后来问了科大讯飞的AI平台,给了一个代码,如下所示,但是跑不起来。

代码语言:javascript
复制
import win32com.client as win32
import jieba
from collections import Counter
import xlwt

# 打开Word文档
word = win32.gencache.EnsureDispatch('Word.Application')
doc = word.Documents.Open('C:\\Desktop\\example.docx')

# 读取文档内容并将其存储为字符串
content = doc.Content.Text

# 将字符串转为列表,并进行分词和词性标注
words = jieba.cut(content)
tags = [word.tag for word in words]
freqs = Counter([word for word, tag in zip(words, tags) if tag != 'x'])

# 创建Excel工作簿和工作表
book = xlwt.Workbook()
sheet = book.add_sheet('Keywords')

# 写入表头
sheet.write(0, 0, '关键词')
sheet.write(0, 1, '词频')
sheet.write(0, 2, '词性')

# 写入关键词和对应的信息
for i, (word, freq) in enumerate(freqs.items()):
    sheet.write(i+1, 0, word)
    sheet.write(i+1, 1, str(freq))
    sheet.write(i+1, 2, tags[i])

# 将分词结果转换为列表并写入Excel表格中
words_list = [word for word, tag in zip(words, tags) if tag != 'x']
for i, word in enumerate(words_list):
    sheet.write(i+1+len(words), 0, word)
    freq = str(freqs[word])
    sheet.write(i+1+len(words), 1, freq)
    pos = '' if not tags else tags[i] + '/' + pos_tag[tags[i]]
    sheet.write(i+1+len(words), 2, pos)

# 保存Excel文件
book.save('C:\\Desktop\\example.xls')

一直提示AttributeError: 'str' object has no attribute 'tag',没办法,方法是好的,把tag改为flag,也不好使。后来求助了Zelinai,其给了一个解决方法,如下所示:

可以使用 Python 中的 docx 和 openpyxl 库实现该功能,具体步骤如下:

  1. 使用 docx 库读取 word 文档中的所有文本,并将其存入一个字符串中。
  2. 使用 jieba 分词库对文本进行分词处理,并过滤掉无用词汇。
  3. 利用 Python 中的 Collection 库的 Counter 类,统计每个单词的词频。
  4. 使用 Python 中的 NLTK 库对每个单词进行词性标注,将其存入一个字典中。
  5. 使用 openpyxl 库创建一个 Excel 文件,并在其中创建一个工作表。
  6. 将关键词、词性和词频分别写入文件的不同列中。

下面是可能的实现代码:

代码语言:javascript
复制
import docx
import jieba
from collections import Counter
import openpyxl
from openpyxl import Workbook
from nltk import pos_tag

# 读取 word 文档中的内容
doc = docx.Document('test.docx')
text = ""
for para in doc.paragraphs:
    text += para.text

# 对文本进行分词,并过滤无意义单词
words = [word for word in jieba.cut(text) if len(word) > 1 and not word.isnumeric()]

# 统计单词词频
word_counts = Counter(words)

# 对每个单词进行词性标注
pos_dict = dict(pos_tag(word_counts.keys()))

# 将关键词、词性、词频存入列表中
keywords = []
for word, count in word_counts.items():
    pos = pos_dict[word]
    keywords.append([word, count, pos])

# 创建 Excel 文件
wb = Workbook()
sheet = wb.active

# 将关键词、词性、词频写入 Excel 文件
sheet['A1'] = '关键词'
sheet['B1'] = '词频'
sheet['C1'] = '词性'
for i, row in enumerate(keywords):
    sheet['A{}'.format(i+2)] = row[0]
    sheet['B{}'.format(i+2)] = row[1]
    sheet['C{}'.format(i+2)] = row[2]

# 保存 Excel 文件
wb.save('keywords.xlsx')

请注意在使用前需要先安装 jieba, nltk 和 openpyxl 库。

这里运行之后,会出现一个这样的报错,(nltk加载词性词库报错)Resource averaged_perceptron_tagger not found. Please use the NLTK Downloader to obtain the resource:。

其实就是未找到资源averaged_perceptron_tagger,请使用NLTK下载器获取资源。根据报错给的URL,然后去下载对应的语义安装包即可,然后放到任意的一个目录之下,就出来了。

查了蛮多资料,后来总算是找到了一个靠谱的解决方法。

最后就可以得到预取的结果了,如下图所示:

关于词性的意思,网上一大堆,这里就不再一一例举了。

三、总结

大家好,我是Python进阶者。这篇文章主要盘点了一个Python文本分析处理的问题,使用Python获取了Word文本中的关键词、词频和词性,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python共享之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、实现过程
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档