|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
本帖最后由 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回的文本,并在两次分析中使用相同的停用词列表。
|
|