You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:40