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

导入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()拼接成字符串不行吗?

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • CSDN专家-HGJ 2021-09-11 22:27

    pandas 库导入的数据是 DataFrame 类型, 那么就用pandas库处理列数据即可,将关键词那列的每行转换成字符串形式。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题