研究方法

3.3 加入語義分析機制(Semantic Analysis)

在語義分析模組中,semantic_similarity() 是核心的語意比對函式,主要負責計算使用者輸入文字與特定關鍵詞之間的語意相似度。 其運作原理是透過 embedding 模型 將文字轉換為高維向量,並以餘弦相似度(cosine similarity)公式計算兩者語意上的接近程度。 當相似度高於設定閾值(threshold = 0.7)時,系統即判定該輸入與關鍵詞具有語意關聯。


此設計使系統能理解不同表達方式下的同義語句,例如「停不下來」與「克制不住」雖然字面不同,但在語意空間中相似度高,因此都能被辨識為失控傾向相關行為。 這種語義層的比對方法有效提升了模型對自然語言的理解能力與彈性,使其能跨越單純關鍵字比對的限制,進一步接近臨床語意判斷的方式。

def semantic_similarity(text, keywords, embedding_model, threshold=0.7):
    """
    用 embedding 模型做語意相似度判斷。
    threshold 建議 0.7~0.8(越高越嚴格)
    """
    try:
        text_vec = np.array(embedding_model.embed_query(text))
        keyword_vecs = [np.array(embedding_model.embed_query(k)) for k in keywords]
        sims = [np.dot(text_vec, kv) / (np.linalg.norm(text_vec) * np.linalg.norm(kv)) for kv in keyword_vecs]
        return max(sims) > threshold
    except Exception as e:
        print(f"[Warning] similarity check failed: {e}")
        return False

在語義分析模組中,頻率關鍵字主要用來判斷使用者是否明確提及其行為發生的時間頻率,例如每天、每週、偶爾等描述。 此部分利用前述的semantic_similarity() 函式,將使用者輸入與一組代表頻率概念的關鍵詞進行語意比對。


當輸入語句與關鍵詞的語意相似度超過0.7時,系統會判定使用者的描述中有頻率描述,反之則標記為未明確提及。 這種設計能讓系統辨識出自然語言中不同形式的時間表達,不僅限於單一詞彙的比對,例如能同時理解「幾乎每天」與「一天至少一次」等變化型敘述。


以下為頻率的實作範例程式片段:

# 頻率關鍵詞
freq_keywords = ["每天", "每週", "每月", "常常", "偶爾", "有時", "幾天", "一小時", "早上", "晚上", "一天", "一週", "一個月"]
freq_semantic = semantic_similarity(user_input, freq_keywords, embedding_model, threshold=0.7)
freq = "有頻率描述" if freq_semantic else "未明確提及"