Question Answering¶
Extract answers from Malaysian text passages using context-based retrieval.
Why question answering?¶
Customer support automation, knowledge base search, document Q&A, and chatbot intelligence. Malaysian businesses need QA systems that understand BM, Manglish, and mixed-language documents.
Load module¶
import malaysian_manglish_nlp as mnlp
context = """
Petronas Twin Towers terletak di Kuala Lumpur, Malaysia. Menara berkembar ini
setinggi 451.9 meter dan mempunyai 88 tingkat. Ia siap dibina pada tahun 1998
dan merupakan bangunan tertinggi di dunia sehingga tahun 2004. Arkitek yang
mereka bentuk menara ini ialah Cesar Pelli dari Argentina.
"""
answer = mnlp.qa_answer("Berapa tinggi Petronas Towers?", context)
print(answer)
# {'answer': '451.9 meter', 'confidence': 0.89}
Basic usage¶
Simple extraction¶
context = """
Nasi lemak ialah hidangan kebangsaan Malaysia. Ia terdiri daripada nasi yang
dimasak dengan santan dan daun pandan. Biasanya dihidangkan dengan sambal,
ikan bilis, kacang tanah, timun, dan telur. Harga sepinggan nasi lemak
bermula dari RM1.50 di gerai tepi jalan sehingga RM25 di restoran mewah.
"""
mnlp.qa_answer("Apa itu nasi lemak?", context)
# {'answer': 'hidangan kebangsaan Malaysia', 'confidence': 0.87}
mnlp.qa_answer("Berapa harga nasi lemak?", context)
# {'answer': 'RM1.50 sehingga RM25', 'confidence': 0.82}
mnlp.qa_answer("Apa bahan dalam nasi lemak?", context)
# {'answer': 'santan dan daun pandan', 'confidence': 0.79}
Question type classification¶
mnlp.classify_question_type("Berapa tinggi menara itu?")
# 'quantity'
mnlp.classify_question_type("Siapa arkitek Petronas Towers?")
# 'person'
mnlp.classify_question_type("Bila menara ini siap dibina?")
# 'time'
mnlp.classify_question_type("Di mana Petronas Towers?")
# 'location'
Multiple answers¶
Extract multiple answers from a passage:
context = """
Malaysia mempunyai 14 negeri. Negeri terbesar ialah Sarawak dengan keluasan
124,450 km persegi. Negeri terkecil ialah Perlis dengan 810 km persegi.
Negeri paling ramai penduduk ialah Selangor dengan 7 juta orang. Negeri
paling sedikit penduduk ialah Labuan dengan 100,000 orang.
"""
mnlp.qa_answer_multiple("Negeri mana yang terbesar?", context, topk=3)
# [
# {'answer': 'Sarawak', 'confidence': 0.91},
# {'answer': '124,450 km persegi', 'confidence': 0.72},
# {'answer': 'Negeri terbesar', 'confidence': 0.45},
# ]
Find relevant sentences¶
Locate the most relevant sentence for a question:
sentences = [
"Petronas Twin Towers terletak di KLCC.",
"Menara ini siap pada tahun 1998.",
"Tinggi menara ini 451.9 meter.",
"Arkitek ialah Cesar Pelli.",
]
mnlp.find_relevant_sentence("Berapa tinggi?", sentences)
# (2, "Tinggi menara ini 451.9 meter.", 0.91)
Extract answer span¶
Find the exact span within a sentence:
sentence = "Menara ini mempunyai tinggi 451.9 meter dan 88 tingkat."
mnlp.extract_answer_span("berapa tinggi", sentence)
# {'span': '451.9 meter', 'start': 27, 'end': 38, 'confidence': 0.89}
Malaysian context examples¶
Government / policy¶
context = """
Bantuan Prihatin Rakyat (BPR) ialah program bantuan tunai kerajaan Malaysia.
Penerima bujang mendapat RM350 setahun manakala isi rumah dengan pendapatan
bawah RM2,500 mendapat RM1,000 setahun. Permohonan dibuka setiap Januari
melalui portal LHDN.
"""
mnlp.qa_answer("Berapa bantuan untuk bujang?", context)
# {'answer': 'RM350 setahun', 'confidence': 0.88}
mnlp.qa_answer("Bila permohonan dibuka?", context)
# {'answer': 'setiap Januari', 'confidence': 0.85}
Informal text (Manglish)¶
context = """
Kedai nasi lemak Mak Cik Zainab kat SS15 Subang tu memang famous gila.
Buka dari pukul 6 pagi sampai 2 petang. Harga nasi lemak biasa RM3,
nasi lemak special dengan ayam rendang RM8. Parking agak susah peak hour.
"""
mnlp.qa_answer("What time the shop opens?", context)
# {'answer': 'pukul 6 pagi sampai 2 petang', 'confidence': 0.84}
mnlp.qa_answer("How much for special?", context)
# {'answer': 'RM8', 'confidence': 0.90}
CLI usage¶
QA is primarily a Python API. For CLI usage:
# Analyze (includes keyword extraction for QA-like features)
$ mnlp analyze "Petronas Tower 451.9 meter tinggi"
# Keywords from context
$ mnlp keywords "Harga minyak sawit meningkat ke paras tertinggi"
How it works¶
- Sentence retrieval - TF-IDF to find the most relevant sentence for the question
- Span extraction - locate the answer within the relevant sentence using pattern matching and POS features
- Question classification - categorize question type (person, location, quantity, time, etc.) to guide extraction
- Confidence scoring - estimate answer reliability based on match quality
For generative QA (free-form answers), install [ml]:
Performance¶
| Metric | Score |
|---|---|
| Exact Match (BM news) | 62.3% |
| F1 (BM news) | 71.8% |
| Exact Match (Manglish) | 54.7% |
| Retrieval accuracy | 78.4% |
| Throughput | 8,000 questions/sec |
| Latency (single) | ~2ms |
See also¶
- Summarization - summarize context before QA
- Keywords - extract key terms for retrieval
- Embeddings - semantic similarity for context matching
- Pipeline - chain QA with normalization
- API Reference - full function signature