Justin

Command Palette

Search for a command to run...

Back to project archive
Completed2026information-system

CNIRS Chinese News IR System

An explainable, evaluable, portfolio-ready Chinese news search engine demo.

CNIRS is a Flask and Python information retrieval system for searching Taiwanese news. It combines BM25, TF-IDF, Boolean, Hybrid, Language Model retrieval, BIM, WAND, MaxScore, CSoundex, query expansion, clustering, summarization, ranking diagnostics, evaluation dashboards, and a feedback/LTR sandbox into a usable search engine demo, with a dothost live app and a GitHub Pages portfolio case study.

Verified Demo Recording 1

Copied by the portfolio quality pass from existing project demo media.

54 screenshots4 demo videos

Media overview

Browse the project screenshots and recorded walkthroughs.

Project links and demo readiness

Project overview

CNIRS is not just a single ranking algorithm. The main achievement is turning a set of information retrieval modules into a complete, usable, screenshot-ready, and recordable search engine demo. Visitors can search Taiwanese news, choose among BM25, TF-IDF, Hybrid, Boolean, LM, BIM, WAND, and MaxScore, and narrow results by source, taxonomy, date, tags, publisher, and other metadata facets. Facets can also be clicked without a query, which turns the interface into a corpus exploration tool rather than only a search box. Each result includes title, snippet, highlight, score, metadata, and a ranking explanation. The Why this result panel shows matched terms, component scores, field boosts, and ranking signals. The document detail view adds summary, KWIC, keywords, related news, taxonomy, and full metadata. To make the project interview-ready, I added Model Comparison, Evaluation Dashboard, Ranking Diagnostics, Feedback Analytics, and an Analysis Graph. These pages show how ranking models differ, how demo qrels are evaluated, how BM25/TF-IDF/LM scores are decomposed, how user feedback is logged, and how a query flows through the retrieval pipeline. The public presentation has two layers. The GitHub Pages portfolio page shows the full demo screenshots and recording. The interactive Flask search system is available at `https://neojustin.dothost.net/projects/information-retrieval/`, and `/api/stats` can be used to verify the deployed corpus, index, and model readiness.

My role

Independent Developer / IR System Architect and Full-stack Implementer

Problem

The original repository contained many academic IR modules, but it needed a stable web app, unified APIs, explainable results, real news data, visual dashboards, and a clear portfolio demo flow.

Solution

I reorganized the IR functionality behind a Flask service layer, added unified search APIs, facet browsing, document detail enrichment, model comparison, evaluation, diagnostics, feedback analytics, and a node-based analysis graph, then connected the project to reproducible screenshots, video recording, a dothost live demo, and a GitHub Pages portfolio page.

Current outcome

The project is now a public portfolio-ready Chinese news retrieval system: the live demo exposes the interactive Flask app and API stats, while the portfolio page packages the cover, screenshots, WebM walkthrough, technical explanation, and interview flow.

Highlights

  • Supports BM25, TF-IDF, Boolean, Hybrid, LM, BIM, WAND, MaxScore, Fuzzy, and CSoundex retrieval modes.
  • Facet browsing works without a query, so users can directly browse all news matching selected metadata.
  • Each result exposes snippets, highlights, component scores, field boosts, and Why this result explanations.
  • Document detail combines summary, KWIC, keywords, taxonomy metadata, related news, and source facets.
  • Model Comparison, Evaluation, Ranking Diagnostics, Feedback Analytics, and Analysis Graph pages make the IR pipeline visually demonstrable.

Engineering challenges

  • Consolidating research-style IR modules into a stable, testable, demo-ready service API.
  • Handling Chinese tokenization, normalization, metadata cleaning, taxonomy mapping, and facet quality.
  • Keeping heavy optional models such as CKIP/BERT out of low-resource startup paths through graceful fallback.
  • Presenting a dynamic Flask system from a static GitHub Pages portfolio using screenshots, video, and a dothost live demo link.

Target users

  • Portfolio reviewers and interviewers
  • Technical readers who need a quick view of purpose, stack, and maturity

Technical highlights

  • Detected technical signals: Python, Flask, JavaScript, Bootstrap, Jieba, BM25, TF-IDF, Boolean Retrieval, Language Model Retrieval, SQLite, Chart.js, Playwright, pytest
  • README evidence exists and can support a fuller reviewed case study
  • A public GitHub repository is linked for source traceability

Architecture

This case study is generated from the portfolio catalog pipeline using README, Git metadata, package/build configuration, and media signals. The final architecture narrative still needs source-level review. Current detected technology signals include: Python, Flask, JavaScript, Bootstrap, Jieba, BM25, TF-IDF, Boolean Retrieval, Language Model Retrieval, SQLite, Chart.js, Playwright, pytest.

Data flow

A public data-flow narrative is not fully reviewed yet. If the project includes data processing, AI pipelines, or backend APIs, the next pass should document input, processing, storage, and UI/output flow end to end.

Project structure

information-retrieval/
  README.md              # project documentation, when available
  source files           # implementation reviewed by local audit
  package/build config   # detected capability signals

Setup / Run guide

This project does not expose a verified runnable web command yet. Review the README/source tree and add exact install, run, test, and build commands before interview use.
No verified build command was detected. Treat the current portfolio page as a case-study placeholder until build steps are reviewed.

Future improvements

  • Complete the production-quality README, screenshots, and demo recording
  • Add architecture diagrams, data-flow notes, and key technical decisions
  • Verify build/test status and update the portfolio release report

Interview notes

  • State the current maturity and demonstrable scope first
  • Focus on verified stack, source structure, and completed behavior
  • Do not claim unverified deployment, video, or test coverage as finished

Next steps

  • Expand qrels and human relevance labels for a stronger evaluation benchmark.
  • Grow the feedback dataset into a real learning-to-rank experiment.
  • Expose semantic retrieval as an optional production profile rather than a default startup dependency.

Related projects