鱼C论坛

 找回密码
 立即注册
查看: 1189|回复: 7

[已解决]分析红楼梦前80和后40回的形容词副词,并确定相同的10个词

[复制链接]
发表于 2023-5-7 19:08:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
于两个红楼梦文本集(前80、后40)的虚词词性(形容词、副词)进行TF-IDF关键词提取,并确定10个相同关键词。为什么我的代码出不来结果求大佬分析
import jieba.analyse
from collections import Counter

# 读取红楼梦文本
with open(r'C:\Users\自然语言处理\80.txt', 'r', encoding='utf-8') as f:
    hlm_text = f.read()

# 使用jieba分词器提取关键词
jieba.analyse.set_stop_words(r'C:\Users\自然语言处理\stopword.txt')
tags = jieba.analyse.extract_tags(hlm_text, topK=1000, withWeight=True, allowPOS=('a', 'd'))

# 将关键词按tf-idf值从大到小排列
tags_sorted = sorted(tags, key=lambda x: x[1], reverse=True)

# 提取形容词和副词关键词
adj_adv_tags = [tag for tag in tags_sorted if tag[0].__contains__('a') or tag[0].__contains__('d')]

# 获取前10个TF-IDF值最高的关键词
top_10_adj_adv = [tag[0] for tag in adj_adv_tags[:10]]

# 输出结果
print(top_10_adj_adv)
最佳答案
2023-5-7 19:10:32
本帖最后由 isdkz 于 2023-5-7 19:11 编辑

根据您提供的代码,我发现了一些问题。以下是修改后的代码:
import jieba
import jieba.analyse
from collections import Counter

# 读取红楼梦文本
with open(r'C:\Users\自然语言处理\80.txt', 'r', encoding='utf-8') as f:
    hlm_text = f.read()

# 设置停用词
jieba.analyse.set_stop_words(r'C:\Users\自然语言处理\stopword.txt')

# 使用jieba分词器提取关键词
tags = jieba.analyse.extract_tags(hlm_text, topK=1000, withWeight=True, allowPOS=('a', 'd'))

# 将关键词按tf-idf值从大到小排列
tags_sorted = sorted(tags, key=lambda x: x[1], reverse=True)

# 提取形容词和副词关键词
adj_adv_tags = [tag for tag in tags_sorted if 'a' in tag[0] or 'd' in tag[0]]

# 获取前10个TF-IDF值最高的关键词
top_10_adj_adv = [tag[0] for tag in adj_adv_tags[:10]]

# 输出结果
print(top_10_adj_adv)

在原始代码中, tag[0].__contains__('a')  和  tag[0].__contains__('d')  部分可能会导致错误。在修改后的代码中,我们使用了  if 'a' in tag[0] or 'd' in tag[0]  来替换原来的代码,以提取形容词和副词关键词。

然而,请注意,这种方法可能会导致一些非形容词和副词的词汇被误认为是形容词和副词,因为它仅检查词中是否包含 'a' 或 'd',而不是词性。所以这个方法并不是十分准确。

为了得到更准确的结果,您应该使用词性标注功能,如  jieba.posseg 。这将帮助您准确识别形容词和副词。以下是修改后的代码:
import jieba
import jieba.analyse
import jieba.posseg as pseg
from collections import Counter

# 读取红楼梦文本
with open(r'C:\Users\自然语言处理\80.txt', 'r', encoding='utf-8') as f:
    hlm_text = f.read()

# 设置停用词
jieba.analyse.set_stop_words(r'C:\Users\自然语言处理\stopword.txt')

# 使用jieba分词器提取关键词
tags = jieba.analyse.extract_tags(hlm_text, topK=1000, withWeight=True)

# 使用词性标注功能
word_flag = [pseg.lcut(tag[0]) for tag in tags]
word_flag = [word[0] for word in word_flag]

# 将关键词按tf-idf值从大到小排列
tags_sorted = sorted(zip(word_flag, tags), key=lambda x: x[1][1], reverse=True)

# 提取形容词和副词关键词
adj_adv_tags = [tag for tag in tags_sorted if tag[0].flag == 'a' or tag[0].flag == 'd']

# 获取前10个TF-IDF值最高的关键词
top_10_adj_adv = [tag[0].word for tag in adj_adv_tags[:10]]

# 输出结果
print(top_10_adj_adv)

上面的代码使用了  jieba.posseg  模块来对提取出的关键词进行词性标注。然后,我们根据词性 ('a'表示形容词,'d'表示副词) 进行筛选,并输出前10个TF-IDF值最高的形容词和副词关键词。

您可以将这段代码应用于红楼梦前80回和后40回的文本,以找到两个文本集中共有的10个关键词。在这个过程中,请确保您分别加载了前80回和后40回的文本,并在两次分析中使用相同的停用词列表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-7 19:10:08 | 显示全部楼层
是我没指定文本集吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:10:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-5-7 19:11 编辑

根据您提供的代码,我发现了一些问题。以下是修改后的代码:
import jieba
import jieba.analyse
from collections import Counter

# 读取红楼梦文本
with open(r'C:\Users\自然语言处理\80.txt', 'r', encoding='utf-8') as f:
    hlm_text = f.read()

# 设置停用词
jieba.analyse.set_stop_words(r'C:\Users\自然语言处理\stopword.txt')

# 使用jieba分词器提取关键词
tags = jieba.analyse.extract_tags(hlm_text, topK=1000, withWeight=True, allowPOS=('a', 'd'))

# 将关键词按tf-idf值从大到小排列
tags_sorted = sorted(tags, key=lambda x: x[1], reverse=True)

# 提取形容词和副词关键词
adj_adv_tags = [tag for tag in tags_sorted if 'a' in tag[0] or 'd' in tag[0]]

# 获取前10个TF-IDF值最高的关键词
top_10_adj_adv = [tag[0] for tag in adj_adv_tags[:10]]

# 输出结果
print(top_10_adj_adv)

在原始代码中, tag[0].__contains__('a')  和  tag[0].__contains__('d')  部分可能会导致错误。在修改后的代码中,我们使用了  if 'a' in tag[0] or 'd' in tag[0]  来替换原来的代码,以提取形容词和副词关键词。

然而,请注意,这种方法可能会导致一些非形容词和副词的词汇被误认为是形容词和副词,因为它仅检查词中是否包含 'a' 或 'd',而不是词性。所以这个方法并不是十分准确。

为了得到更准确的结果,您应该使用词性标注功能,如  jieba.posseg 。这将帮助您准确识别形容词和副词。以下是修改后的代码:
import jieba
import jieba.analyse
import jieba.posseg as pseg
from collections import Counter

# 读取红楼梦文本
with open(r'C:\Users\自然语言处理\80.txt', 'r', encoding='utf-8') as f:
    hlm_text = f.read()

# 设置停用词
jieba.analyse.set_stop_words(r'C:\Users\自然语言处理\stopword.txt')

# 使用jieba分词器提取关键词
tags = jieba.analyse.extract_tags(hlm_text, topK=1000, withWeight=True)

# 使用词性标注功能
word_flag = [pseg.lcut(tag[0]) for tag in tags]
word_flag = [word[0] for word in word_flag]

# 将关键词按tf-idf值从大到小排列
tags_sorted = sorted(zip(word_flag, tags), key=lambda x: x[1][1], reverse=True)

# 提取形容词和副词关键词
adj_adv_tags = [tag for tag in tags_sorted if tag[0].flag == 'a' or tag[0].flag == 'd']

# 获取前10个TF-IDF值最高的关键词
top_10_adj_adv = [tag[0].word for tag in adj_adv_tags[:10]]

# 输出结果
print(top_10_adj_adv)

上面的代码使用了  jieba.posseg  模块来对提取出的关键词进行词性标注。然后,我们根据词性 ('a'表示形容词,'d'表示副词) 进行筛选,并输出前10个TF-IDF值最高的形容词和副词关键词。

您可以将这段代码应用于红楼梦前80回和后40回的文本,以找到两个文本集中共有的10个关键词。在这个过程中,请确保您分别加载了前80回和后40回的文本,并在两次分析中使用相同的停用词列表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:11:12 | 显示全部楼层
isdkz 发表于 2023-5-7 19:10
根据您提供的代码,我发现了一些问题。以下是修改后的代码:


说了一半,然后没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:12:14 | 显示全部楼层

后面去接下一半了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-7 19:18:22 | 显示全部楼层
isdkz 发表于 2023-5-7 19:10
根据您提供的代码,我发现了一些问题。以下是修改后的代码:

我复制代码后结果还是[],返回了个空集合,我原来的代码返回的也是空集合(;´д`)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-7 19:48:55 | 显示全部楼层
isdkz 发表于 2023-5-7 19:10
根据您提供的代码,我发现了一些问题。以下是修改后的代码:

刚刚又试了出来结果了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-8 10:47:01 | 显示全部楼层
roro0209 发表于 2023-5-7 19:10
是我没指定文本集吗?

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表