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

如何使用NLTK提取文本名词?请帮忙修正提供的代码

提取文本中的名词 & 修正不完整的Python代码

嘿,我来帮你搞定这个问题!提取文本里的名词其实用NLTK或者TextBlob都能轻松实现,我先把你那段不完整的代码补全并优化,再给你讲清楚每一步是怎么回事~

另外提一句:你原来导入的TweetTokenizer和RegexpTokenizer主要用于特殊场景(比如推特文本分词、正则匹配分词),如果只是处理普通官方文本提取名词,暂时用不到,可以根据需求保留或删除哦。

方法一:用NLTK完成词性标注并提取名词

先补全你原来的代码,加上完整的名词提取逻辑:

import nltk
from nltk.corpus import state_union
from nltk.tokenize import PunktSentenceTokenizer
from nltk.tokenize import word_tokenize

# 第一次运行需要下载NLTK的必要资源,之后可以注释掉
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('state_union')

sample_text = state_union.raw("2006-GWBush.txt")
train_text = state_union.raw("2005-GWBush.txt")

# 用2005年的文本训练自定义句子分词器
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)
# 补全你没写完的分词步骤:把样本文本拆成句子
tokenized_sentences = custom_sent_tokenizer.tokenize(sample_text)

# 定义提取所有名词的函数
def extract_nouns(sentences):
    nouns = []
    for sentence in sentences:
        # 把每个句子拆成单个单词
        words = word_tokenize(sentence)
        # 给每个单词做词性标注
        tagged_words = nltk.pos_tag(words)
        # 筛选出各类名词:
        # NN=单数普通名词,NNS=复数普通名词,NNP=单数专有名词,NNPS=复数专有名词
        for word, tag in tagged_words:
            if tag in ['NN', 'NNS', 'NNP', 'NNPS']:
                nouns.append(word)
    return nouns

# 提取名词并打印前20个示例
all_nouns = extract_nouns(tokenized_sentences)
print("提取到的名词示例:", all_nouns[:20])

关键步骤说明:

  • 补充了word_tokenize用来拆分句子为单个单词,这是词性标注的前提
  • 补全了你未完成的tokenized = ...语句,改为更清晰的tokenized_sentences
  • 通过nltk.pos_tag()给单词打词性标签,再筛选出名词对应的标签,就能得到所有名词了

方法二:用TextBlob快速提取名词

如果你觉得NLTK的步骤有点繁琐,TextBlob封装了更简洁的API,用起来更顺手:

from textblob import TextBlob
from nltk.corpus import state_union

# 加载样本文本
sample_text = state_union.raw("2006-GWBush.txt")

# 用TextBlob处理文本
blob = TextBlob(sample_text)

# 快速提取名词短语(比如"United States"这种连续的名词组合)
noun_phrases = blob.noun_phrases
print("提取到的名词短语示例:", noun_phrases[:10])

# 如果需要单个名词,同样可以通过词性标签筛选
single_nouns = [word for (word, tag) in blob.tags if tag in ['NN', 'NNS', 'NNP', 'NNPS']]
print("提取到的单个名词示例:", single_nouns[:20])

为什么推荐这个方法?

  • TextBlob底层基于NLTK,但做了更友好的封装,一行代码就能提取名词短语
  • 既能拿到连续的名词短语,也能通过词性标签筛选单个名词,灵活性很高

内容的提问来源于stack exchange,提问作者Ankur Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:00