Anika Dutta

All posts

Multi-Label Text Classifier

Let's build a multi-label text classifier that tags a piece of text with any subset of a fixed label set. We'll tag restaurant reviews by the aspects the reviewer commented on: food, service, value, atmosphere, cleanliness.

TaskMulti-label classification
InputText
OutputList of tags from a fixed set
Label setfood, service, value, atmosphere, cleanliness
ModelGemini 3.5 Flash
SchemaPydantic with Literal[...] constraint
"""
Text Multilabel Classification - Basic
======================================

Assign any subset of a fixed tag set to a piece of text. Multiple tags may
apply to the same input.

This example tags restaurant reviews by which aspects the reviewer commented
on.
"""

from typing import List, Literal

from agno.agent import Agent, RunOutput
from agno.models.google import Gemini
from pydantic import BaseModel, Field
from rich.pretty import pprint

Aspect = Literal["food", "service", "value", "atmosphere", "cleanliness"]


class Tagging(BaseModel):
    tags: List[Aspect] = Field(
        ..., description="All aspects the reviewer commented on; empty if none"
    )


instructions = """\
Tag the review with every aspect the reviewer commented on. Include an
aspect only when the text actually addresses it. An aspect can be mentioned
positively or negatively - both count.
"""


agent = Agent(
    model=Gemini(id="gemini-3.5-flash"),
    instructions=instructions,
    output_schema=Tagging,
)


if __name__ == "__main__":
    samples = [
        "Pasta was excellent and our server was attentive. A bit pricey but worth it.",
        "Place was filthy. Floors sticky, bathroom unusable.",
        "Came for the vibes, stayed for the cocktails. The space is gorgeous.",
    ]
    for text in samples:
        run: RunOutput = agent.run(text)
        pprint({"input": text, "result": run.content})

Read more