执笔之龙 2021-09-11 21:44 采纳率: 100%
浏览 266
已结题

导入xlsx文件为DataFrame类型,转换为列表,分词后中括号和引号无法去除

我是跨境电商从业者,前两天学了点 Python ,百度后试着自己写了段代码,希望能实现以下功能:
将导入进 xlsx 的用户搜索词进行词频统计,用于标题拟定和关键词填写。
查询资料后,把这个要求拿出了自己的实现方法:

  1. 使用 pandas 库,从 test.xlsx 中导入关键词
  2. 使用 split() 方法,或者 nltk 库中的 word_tokenize 模块,来进行分词
  3. 使用 nltk 库中的 WordNetLemmatizer 模块,对分词后的结果进行词性还原
  4. 对词性还原后的结果,进行词频统计
  5. 把结果写进 results.xlsx 文件中
    但是当工作开始后,我遇到以下问题:
  6. pandas 库导入的数据是 DataFrame 类型,而 word_tokenize 模块只认 string
    为了解决此问题,我转而使用 split() 方式。
    可是使用 split() 方式后,一万多条关键词,只有前几十条被分词。
    于是我转而试图将结果转换为 string ,再分词,我使用的是 str() 函数。
    使用 str() 函数后,word_tokenize 模块还是不能用,变量管理器里一个结果都没有。
    但是 split() 方式可以用了。
    只是返回的结果中有中括号和引号。
    我转而放下这个问题,把接下来几个问题解决了。
    其中,写入 xlsx 文件被放弃,改成写进 test.csv 文件。
    当我回头准备解决中括号和引号的问题时,我开始渐渐绝望,因为我试了最常用的 join 方法,仍然有中括号和引号。
    其他的一些方法,要么我看不明白,要么就是用不了。
    附上源码:

#!/usr/bin/python3
#coding=utf-8

import pandas as pd # 导入 pandas 模块,以读取 xlsx 文件
import collections # 导入 collection 模块,以实现词频统计
from nltk import word_tokenize, pos_tag # 分词
from nltk.corpus import wordnet # 导入 wordnet 模块,写入方法,将 tag 转换为 pos
from nltk.stem import WordNetLemmatizer # 导入词性还原模块,进行词性还原


def get_wordnet_pos(tag): # 定义一个方法,用来将 tag 转换为 pos
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    else:
        return None

keywords_data = pd.read_excel(r'C:\Users\cmoc\Downloads\test.xlsx', sheet_name='test') # 载入 test.xlsx 中的 test 表格
keywords_list = keywords_data.values.tolist() # 把读取的数据转换成列表
keywords_list_trans = []
for keyword_list in keywords_list:
#    keyword_list.replace("'", "")
    keywords_list_trans.append(keyword_list[0])

keywords = str.split(str(keywords_list_trans)) # 将product_data 转换为字符串,并进行分词
tagged_keywords = pos_tag(keywords) # 获取单词词性

wnl = WordNetLemmatizer()
keywords_lemmatized = []
for tag in tagged_keywords:
    keyword_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN
    keywords_lemmatized.append(wnl.lemmatize(tag[0], pos=keyword_pos)) # 词形还原

results = collections.Counter(keywords_lemmatized).most_common() # 将得到的结果转换成列表,并进行排序
results_dict = dict(results) # 将排序后的结果列表转换成字典
results_df = pd.DataFrame.from_dict(results_dict, orient='index', columns=['Frequency'])

results_df.to_csv(r'C:\Users\cmoc\Downloads\test.csv', sep=',', header=True, index=True)

附上我的关键词:

/%ra2
链接是坚果云,未注册用户也可以下载。

  • 写回答

2条回答 默认 最新

  • 关注

    转换为列表之后再用 " ".join()拼接成字符串不行吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 已采纳回答 9月13日
  • 创建了问题 9月11日

悬赏问题

  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”