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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:20