聊聊答題應用題庫的建立

2022-09-11 03:48:10 字數 2615 閱讀 9360

另一方面,對於題目答案的搜尋。常見的幾種做法是直接用題目作為搜尋關鍵字開啟瀏覽器,或者是問題加選項搜尋,獲取搜尋引擎搜尋的結果數量。通過結果數量來判斷問題和選項的相關性從而判斷問題的答案,一般來說這種方式獲取的答案都是不太準確的,一是因為現在題目的出題方式越來越詭異,二是相關性越大並不一定就意味著是正確答案。本來對於題目和選項的判斷就是很難的一件事情,除非你能做出很完美的語意理解,否則很難判斷出正確的選項。還有一種比較直白的方式就是建立題庫。在本文中,我們討論一種建立題庫的方式,這裡只是做乙個簡單的探索,未必在實際中就能夠使用,因為題庫必須足夠全才能夠發揮威力。

本文主要講解關於題庫的建立方面的很小的一方面進行探索,對於答題輔助的使用可以閱讀原文檢視完整介紹,**主要是基於topsup 做了一些調整。elasticsearch 將被用於題庫的建立,對於 es 的安裝可以檢視第一篇文章。有人可能會覺得用 es 來做題庫,簡直就是高射炮打蚊子——小題大做。但我覺得 es 安裝和使用都很方便,得益於其強大的 restful介面,幾乎可以用任何工具操控 es。talk is cheap, show me the code.

from elasticsearch import elasticsearch

defwrite_quetion

(): question =

es = elasticsearch()

es.index(index='question-index', doc_type='question', id=1, body=question)

上面是乙個簡單的像索引中寫入一條記錄的**片段,其實 es 可以算是一種非關係型資料庫,在 db-engines 的最新排名中,es 已經躥到了第 9 名。elasticsearch 中的某些概念可以和關係型資料庫進行模擬:

關係型資料庫

elasticsearch

database

index

table

type

rowdocument

column

field

那麼在 es 中搜尋問題時應該這樣:

def

search_question

(key_words):

es = elasticsearch()

res = es.search(index='question-index', body=}}

})if res['hits'['total'] > 0:

for hit in res['hits']['hits']:

print(hit['_source']['question'] + ':' + hit['_source']['answer'])

else:

print('未搜尋到類似結果')

題庫的建立可以使用文字的方式或者直接使用答題應用的手機截圖,毫無疑問後者是更有價值的。假設我們現在有一張這樣的截圖:

這張中已經包含了正確的選項,但我們如何識別這個並且知道這個正確答案呢?使用選項後面的數字麼,不可行,正確答案並不一定是選擇的最多的選項。感謝影象處理這門課程,裡面有乙個非常基礎的概念幫我解決了這個問題。一般來說將彩色轉化為灰度就是通過乙個確定的函式將彩色空間對映到灰度空間。以 matlab 中將 rgb 圖(可以理解為一張彩色圖)轉化為灰度圖的rgb2gray函式為例,假設乙個彩色畫素的 rgb 值是 (r, g, b),那麼它的灰度值 g 的計算方法應該是:

g = 0.2989 * r + 0.5870 * g + 0.1140 * b

業界的通用做法就是將按照一定的權重來計算彩色畫素的灰度值。通過取色筆可以獲取上圖正確答案背景顏色的 rgb 值是(80, 215, 216),而錯誤答案背景顏色的 rgb 值是(194, 194, 194)。

今天教大家的是乘法分配律,秀了一波小學數學。言歸正傳,可以看出,彩色影象對映的灰度值更低。這對於我們區分正確選項和錯誤選項就有了重大的幫助。首先我們對選項區域進行裁剪,避免右邊的數字影響識別結果。通過二值化演算法,我們可以把問題選項圖使用不同的閾值將轉換成兩張不同的,小於閾值的畫素點變成黑色畫素點,大於閾值的畫素點程式設計白色畫素點。二值化轉換的演算法非常簡單:

def

binarizing

(img, threshold):

pixdata = img.load()

w, h = img.size

for y in range(h):

for x in range(w):

if pixdata[x, y] < threshold:

pixdata[x, y] = 0

else:

pixdata[x, y] = 255

return img

這下答案就呼之欲出了吧。我們將這兩張圖通過 ocr 的方式去識別,第一張圖可以獲取所有的選項,而第二張圖只能獲取錯誤的選項,那麼二者的差異之處不正就是正確選項了嘛!是不是骨骼精奇,是不是沒想到!

本文就到此為止,本文主要是從乙個很小的角度講述一種建立題庫的方式,使用一種影象處理的簡單技術來獲取正確的選項。是不是覺得學的課程還是有價值的。當然本文只是作為一種技術的**,並不一定保證實際中的可操作性,詳細**可以閱讀原文檢視。

以上。

聊聊答題應用題庫的建立

另一方面,對於題目答案的搜尋。常見的幾種做法是直接用題目作為搜尋關鍵字開啟瀏覽器,或者是問題加選項搜尋,獲取搜尋引擎搜尋的結果數量。通過結果數量來判斷問題和選項的相關性從而判斷問題的答案,一般來說這種方式獲取的答案都是不太準確的,一是因為現在題目的出題方式越來越詭異,二是相關性越大並不一定就意味著是...

兩道FFT的應用題

計算 c k k ia i b i k 正好看到 具體數學 上處理和式的tricks,雖然熱身題也不會做,但碾oi題還是很穩的 orz神犇高教授 對於 k ia i b i k 將b陣列倒置,即b i b n 1 i 原式變為 c k 0 i0 n k 1 ia i b n k 1 i 化簡得到c ...

getchar()函式的應用題和總結

編寫乙個程式,它從標準輸入讀取c源 並驗證所有的花括號都正確的成對出現。要驗證內容 是否成對出現,需要使用到getchar 函式來逐一檢驗 int main else if a count 0 情況下是不匹配的,所以在任何時刻第乙個 結束分號 出現時count 0都是不匹配的。else if a i...