码迷,mamicode.com
首页 > 编程语言 > 详细

文字分词 隐马尔可夫模型-JavaScript

时间:2020-08-26 18:59:25      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:for   lob   例子   ons   add   状态   rip   存在   马尔科夫   

/**
 文字分词 隐马尔可夫模型
 共4种状态S B M E
 AMap 为状态转移概率矩阵 4*4,表示从{S B M E}到{S B M E}的概率
 BMap 为当前字属于某种状态{S B M E}的概率
 * */
//有限状态
const S=[‘S‘,‘B‘,‘M‘,‘E‘]
const startB=[‘S‘,‘B‘]
const endB=[‘S‘,‘E‘]

const AMap={
  SS:0.5,
  SB:0.5,
  SM:0,
  SE:0,

  BS:0,
  BB:0,
  BM:0.5,
  BE:0.5,

  MS:0,
  MB:0,
  MM:0.5,
  ME:0.5,

  ES:0.5,
  EB:0.5,
  EM:0,
  EE:0,
}
const BMap={};

const mekf={
  add(text){
    if(text.length>1){
      if(text.length===2){
        this.push(text[0],‘B‘)
        this.push(text[1],‘E‘)
        this.pushState(‘BE‘)
      }else{
        for(let i=1;i<text.length;i++){
          if(i===1){
            this.push(text[i-1],‘B‘)
            this.pushState(‘BM‘)
          }else if(i===text.length-1){
            this.push(text[i-1],‘M‘)
            this.push(text[i],‘E‘)
            this.pushState(‘ME‘)
          }else{
            this.push(text[i-1],‘M‘)
            this.pushState(‘MM‘)
          }
        }
      }
    }else{
      this.push(text,‘S‘)
    }
  },
  pushState(key){
    if(!AMap[key]){
      AMap[key]=0
    }
    AMap[key]++;
  },
  push(key,state){
    if(!BMap[key]){
      BMap[key]={
        S:1,
        B:0.5,
        E:0,
        M:0,
      }
    }
    BMap[key][state]++;
  },
  getGl(obj,t){
    return obj[t]/(obj.S+obj.B+obj.M+obj.E)
  },
  solve(text){
    let AMapFm={
      S:0,
      B:0,
      M:0,
      E:0,
    };
    for(let key in AMap){
      const t0=key[0];
      AMapFm[t0]=AMapFm[t0]+AMap[key]
    }
    //马尔可夫链条
    const liantiao={
      arr:[],//n-2
      S:0,
      B:0,
      M:0,
      E:0,
    };
    let linkArr=[]
    let lglArr=[]

    for(let i=0;i<text.length;i++){
      const nlinkArr=[]
      const nlglArr=[]
      const glObj=BMap[text[i]]||{S:0.5,B:0,M:0,E:0}

      //求t0Arr t1Arr
      let t0Arr,t1Arr;
      let glArr;
      if(i===0){
        t0Arr=[‘S‘]
        lglArr=[1]
      }else if(i===text.length-1){
        t1Arr=[‘S‘,‘E‘]
      }
      //t0表示上一个可能的状态
      if(!t0Arr){
        t0Arr=[];
        glArr=[];
        for(let j=0;j<linkArr.length;j++){
          const link=linkArr[j];
          t0Arr.push(link[link.length-1]);
        }
      }
      //t1表示当前可能的状态
      if(!t1Arr){
        t1Arr=[‘S‘,‘B‘,‘M‘,‘E‘]
      }
      for(let k=0;k<t1Arr.length;k++){
        const t1=t1Arr[k]
        //找出相同状态t1最大的马尔可夫链
        let maxArr=[];
        let maxglArr=[0];
        for(let j=0;j<t0Arr.length;j++){
          const t0=t0Arr[j]
          const link=linkArr[j]||‘‘;//已存在的马尔可夫链
          let lgl=lglArr[j]||1;//马尔可夫链的概率
          const nlink=link+t1;

          const key=t0+t1;
          if(AMap[key]!==0){
            if(glObj[t1]!==0){
              const cgl=lgl*this.getGl(glObj,t1)*(AMap[key]/AMapFm[t0]);
              if(cgl>maxglArr[0]){
                maxArr=[nlink]
                maxglArr=[cgl]
              }else if(cgl===maxglArr[0]){
                maxArr.push(nlink)
                maxglArr.push(cgl)
              }
            }
          }
        }

        if(maxArr.length>0){
          for(let m=0;m<maxArr.length;m++){
            nlinkArr.push(maxArr[m])
            nlglArr.push(maxglArr[m])
          }
        }
      }
      linkArr=nlinkArr;
      lglArr=nlglArr;
    }
    let maxLink;
    let maxGL=0;
    for(let i=0;i<linkArr.length;i++){
      if(lglArr[i]>maxGL){
        maxGL=lglArr[i]
        maxLink=linkArr[i]
      }
    }
    console.log(linkArr)
    console.log(lglArr)
    return maxLink
  }
}

mekf.add(‘太平洋保险‘)
mekf.add(‘保险‘)
mekf.add(‘一个‘)
mekf.add(‘例子‘)
mekf.add(‘隐马尔科夫链‘)
mekf.add(‘科夫‘)

console.log(AMap)
console.log(BMap)
const link=mekf.solve(‘太平保险‘)
console.log(link)

  

文字分词 隐马尔可夫模型-JavaScript

标签:for   lob   例子   ons   add   状态   rip   存在   马尔科夫   

原文地址:https://www.cnblogs.com/caoke/p/13542854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!