如何用NLTK从Django REST框架的Task模型中提取名词和动词?
完善Django REST的名词动词提取API
嘿,作为刚接触NLP的Django开发者,我完全懂你想要快速搞定这个功能的心情!下面我来一步步帮你完善这个noun_verb_list视图函数,让它能从任务文本里精准提取名词和动词。
第一步:选个适合新手的NLP工具
对于新手来说,spaCy是最友好的选择——它封装好了成熟的NLP模型,不需要你自己从零写规则。先安装它和基础英文模型:
pip install spacy python -m spacy download en_core_web_sm
第二步:完善你的视图函数
假设你的Task模型有一个存储任务内容的字段(比如description,如果你的字段名不同记得替换),同时Project和Task的关联字段是project_tasks(按需替换成你实际的关联名),下面是完整的实现代码:
from django.shortcuts import get_object_or_404 from rest_framework.decorators import api_view from rest_framework.response import Response import spacy # 提前加载spaCy模型,避免每次请求都重新加载(提升性能) nlp = spacy.load("en_core_web_sm") @api_view(['GET']) def noun_verb_list(request): nouns = set() # 用集合自动去重 verbs = set() if request.query_params.get('projectId'): project_id = request.query_params.get('projectId') # 用get_object_or_404代替get,避免Project不存在时抛出500错误 project = get_object_or_404(Project, id=project_id) tasks = project.project_tasks.all() else: # 如果没有传projectId,就获取所有任务 tasks = Task.objects.all() # 遍历所有任务,提取名词和动词 for task in tasks: # 跳过空文本,避免处理报错 if not task.description: continue doc = nlp(task.description) for token in doc: # 提取普通名词和专有名词(比如人名、地名) if token.pos_ in ("NOUN", "PROPN"): nouns.add(token.text.lower()) # 转小写统一格式 # 提取动词(包括原形和变位形式) elif token.pos_ == "VERB": verbs.add(token.text.lower()) # 把集合转成列表,方便序列化为JSON return Response({ "nouns": list(nouns), "verbs": list(verbs) })
关键细节说明
- 模型加载优化:把
nlp = spacy.load(...)放在视图外面,服务器启动时只加载一次,不会每次请求都重复加载,大幅提升性能。 - 自动去重:用
set存储名词和动词,自动过滤重复词汇,最后转成列表返回更符合JSON格式要求。 - 异常友好处理:用
get_object_or_404替代直接get(),当传入的projectId不存在时,会返回标准的404响应,更符合RESTful规范。 - 词性范围可选:如果不需要专有名词(比如"Python"、"London"),可以把判断条件改成
token.pos_ == "NOUN";动词会包含所有变位形式(比如"run"、"ran"、"running"),如果需要统一成原形,可以用token.lemma_代替token.text。
测试你的API
启动Django服务后,你可以用curl或者Postman访问:
curl http://localhost:8000/your-api-endpoint/?projectId=1
返回的结果会是类似这样的JSON:
{ "nouns": ["task", "project", "deadline"], "verbs": ["complete", "update", "review"] }
内容的提问来源于stack exchange,提问作者Thinker
相关产品推荐
相关产品推荐

