NLTK词汇散布图(Lexical dispersion plot)异常问题求助
问题描述
我用NLTK编写代码绘制词汇散布图,流程是提取4个本地PDF文本、执行word_tokenize处理,同时尝试用nltk.Text方式实现,遇到两个问题:
- 基于
word_tokenize生成的tokes列表绘图时,虚构词“zxyzxc”也显示散布情况 - 基于
nltk.Text类型的taxtf绘图时,X轴词偏移值异常(显示-0.4、-0.2、0、2),对相关处理存疑
附原始代码:
import PyPDF2 as pypdf import matplotlib import matplotlib.pyplot as plt import csv import nltk nltk.download('averaged_perceptron_tagger') nltk.download('punkt') nltk.download('stopwords') nltk.download('wordnet') from PyPDF2 import PdfReader nltk.download('universal_tagset') import textract from nltk.tokenize import word_tokenize from nltk.corpus import stopwords import pandas as pd import numpy as np from nltk.stem.wordnet import WordNetLemmatizer from nltk.corpus import wordnet as wn from nltk import pos_tag import collections from collections import defaultdict from nltk.probability import FreqDist from nltk.draw.dispersion import dispersion_plot from nltk.text import Text df = pd.read_excel(r"C:\Users\Kenneth\Desktop\linksspeech.xlsx", header=None) textz = "" for i in df[0]: file = open(i,"rb") read = pypdf.PdfReader(file) pages = len(read.pages) count = 0 while count < pages: pagen = read.pages[count] count = count + 1 textz += pagen.extract_text() taxtf = nltk.Text(textz) tokes = nltk.word_tokenize(textz, language = "english") mains = ["education", "poor", "health", "poverty", "zxyzxc"] nltk.draw.dispersion.dispersion_plot(tokes,words = mains,ignore_case=False, title="hey") plt.show() taxtf.dispersion_plot(words = mains) plot.show()
问题分析与修复
问题1:虚构词“zxyzxc”显示散布情况
- 原因:
dispersion_plot处理不存在的词汇时,会默认绘制一条贯穿整个文本长度的水平线,并非真的匹配到该词汇。 - 修复方法:先过滤掉词汇列表中不在文本分词集合里的词,只保留真实存在的词汇再绘图。
问题2:nltk.Text绘图时X轴偏移值异常
- 原因:
nltk.Text构造必须传入分词后的列表,你直接传入原始字符串,导致内部将字符串拆分为单个字符序列,X轴刻度计算完全错误。 - 修复方法:用分词后的
tokes列表初始化nltk.Text对象。
修正后的完整代码
import PyPDF2 as pypdf import matplotlib.pyplot as plt import nltk import pandas as pd from nltk.tokenize import word_tokenize from nltk.text import Text from nltk.draw.dispersion import dispersion_plot # 下载必要的NLTK资源(首次运行需要,后续可注释) nltk.download('punkt') # 读取PDF路径列表 df = pd.read_excel(r"C:\Users\Kenneth\Desktop\linksspeech.xlsx", header=None) textz = "" for i in df[0]: with open(i, "rb") as file: # 用with语句自动管理文件关闭 read = pypdf.PdfReader(file) for page in read.pages: # 直接遍历页面,替代手动计数的while循环 textz += page.extract_text() # 正确初始化nltk.Text:传入分词后的列表 tokes = word_tokenize(textz, language="english") taxtf = Text(tokes) # 过滤不存在的词汇 mains = ["education", "poor", "health", "poverty", "zxyzxc"] existing_words = [word for word in mains if word in set(tokes)] # 基于分词列表绘制散布图 dispersion_plot(tokes, words=existing_words, ignore_case=False, title="词汇散布图(分词列表)") plt.show() # 基于nltk.Text绘制散布图 taxtf.dispersion_plot(words=existing_words) plt.show()
额外优化说明
- 使用
with语句管理文件,避免资源泄漏 - 用
for page in read.pages替代手动计数循环,代码更简洁 - 过滤无效词汇后,绘图不再显示虚构词的无效线条
- 修正
nltk.Text初始化方式后,X轴会显示正确的文本位置比例(0到1,对应文本起始到结束)
内容的提问来源于stack exchange,提问作者Kenneth Gomes
相关产品推荐
相关产品推荐

