分享

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

 Python进阶者 2023-06-09 发布于广东

一、前言

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

二、实现过程

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

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(00'关键词')
sheet.write(01'词频')
sheet.write(02'词性')

# 写入关键词和对应的信息
for i, (word, freq) in enumerate(freqs.items()):
    sheet.write(i+10, word)
    sheet.write(i+11, str(freq))
    sheet.write(i+12, 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. 将关键词、词性和词频分别写入文件的不同列中。

下面是可能的实现代码:

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文本中的关键词、词频和词性,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多