如何使用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
相关产品推荐
相关产品推荐

