Here's an implementation of the Viterbi algorithm in JavaScript:
```javascript
function viterbi(obs, states, start_p, trans_p, emit_p) {
  let V = [];
  for (let i = 0; i < states.length; i++) {
    V[i] = [];
  }

  for (let i = 0; i < states.length; i++) {
    V[i][0] = start_p[i] * emit_p[i][obs[0]];
  }

  for (let t = 1; t < obs.length; t++) {
    for (let j = 0; j < states.length; j++) {
      let max_tr_prob = V[0][t-1] * trans_p[0][j];
      let prev_state_selected = 0;
      for (let i = 1; i < states.length; i++) {
        let tr_prob = V[i][t-1] * trans_p[i][j];
        if (tr_prob > max_tr_prob) {
          max_tr_prob = tr_prob;
          prev_state_selected = i;
        }
      }
      V[j][t] = max_tr_prob * emit_p[j][obs[t]];
    }
  }

  let opt = [];
  let max_prob = V[0][obs.length - 1];
  let state_selected = 0;

  for (let i = 1; i < states.length; i++) {
    if (V[i][obs.length - 1] > max_prob) {
      max_prob = V[i][obs.length - 1];
      state_selected = i;
    }
  }

  opt.push(state_selected);
  for (let t = obs.length - 2; t >= 0; t--) {
    state_selected = 0;
    for (let i = 0; i < states.length; i++) {
      if (V[i][t] * trans_p[i][state_selected] === V[state_selected][t + 1]) {
        state_selected = i;
      }
    }
    opt.unshift(state_selected);
  }

  return {
    prob: max_prob,
    path: opt
  };
}
```
This implementation takes as input the observation sequence obs, a list of states, the start_p probability distribution, the trans_p transition probability matrix, and the emit_p emission probability matrix. It returns an object with the maximum probability prob and the state path path.
นี่คือการใช้งานอัลกอริทึม Viterbi ใน JavaScript: ```ฟังก์ชัน javascript viterbi(obs, state, start_p, trans_p, emit_p) { la V = []; สำหรับ (ให้ i = 0; i < state.length; i++) { V[i] = []; } สำหรับ (ให้ i = 0; i < state.length; i++) { V[i][0] = start_p[i] * emit_p[i][obs[0]]; } สำหรับ (ให้ t = 1; t < obs.length; t++) { สำหรับ (ให้ j = 0; j < state.length; j++) { ให้ max_tr_prob = V[0][t-1] * trans_p[0] [ญ]; ให้ prev_state_selected = 0; สำหรับ (ให้ i = 1; i < state.length; i++) { ให้ tr_prob = V[i][t-1] * trans_p[i][j]; ถ้า (tr_prob > max_tr_prob) { max_tr_prob = tr_prob; prev_state_selected = ฉัน; } } V[j][t] = max_tr_prob * emit_p[j][obs[t]]; } } ให้เลือก = []; ให้ max_prob = V[0] [obs.length - 1]; ให้ state_selected = 0; สำหรับ (ให้ i = 1; i < state.length; i++) { if (V[i][obs.length - 1] > max_prob) { max_prob = V[i][obs.length - 1]; state_selected = ฉัน; } } opt.push (state_selected); สำหรับ (ให้ t = obs.length - 2; t >= 0; t--) { state_selected = 0; สำหรับ (ให้ i = 0; i < state.length; i++) { if (V[i][t] * trans_p[i][state_selected] === V[state_selected][t + 1]) { state_selected = i ; } } opt.unshift (state_selected); } กลับ { prob: max_prob, เส้นทาง: เลือก }; } ``` การใช้งานนี้ใช้เป็นอินพุตลำดับการสังเกต obs รายการสถานะ การแจกแจงความน่าจะเป็น start_p เมทริกซ์ความน่าจะเป็นในการเปลี่ยน trans_p และเมทริกซ์ความน่าจะเป็นการปล่อย emit_p มันจะส่งคืนออบเจ็กต์ที่มีค่าความน่าจะเป็นสูงสุดและเส้นทางเส้นทางของรัฐ
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence