/// <summary> /// 相当于原项目的Sij(s->i, t->j)。 /// 暂时为最大似然估计。未考虑worker bias。 /// 训练。 /// </summary> /// <param name="t">t</param> /// <param name="groupindex">组号</param> /// <returns></returns> public double Pr_t_s(TargetLabeltruth t, int groupindex) { double numerator = 0; double denominator = 0; if (this.AccordedSentenceList.Count != 0) { //遍历与此Srouce Labeltruth对应的Sentence List(与分组无关) foreach (Sentence sentence in this.AccordedSentenceList) { //此sentence被标过的target annotation(与分组有关) foreach (TargetAnnotation targetAnnotation in sentence.TargetWorkerTargetAnnotationDicGroup[groupindex].Values) { //被标次数 ++denominator; //此target annotation里含有要找的target label truth if (targetAnnotation.AccordingWithTargetLabeltruth(t)) { ++numerator; } } } return(numerator / denominator); //return Math.Pow(numerator / denominator, ProbabilityConstant.Pr_t[t]); } else { return(0); } }
/// <summary> /// s转移到t的概率矩阵。 /// (s已知,求t的概率)。 /// 验证和是1。 /// </summary> /// <returns>s->t->概率</returns> static public void Pr_t_s(int groupindex) { //初始化 CascadedConstant.Pr_t_s = new Dictionary <SourceLabeltruth, IDictionary <TargetLabeltruth, double> >(); //开始直接取 foreach (Label sourceLabel in Constant.SourceTaxonomy.LabelArray) { SourceLabeltruth sourceTrue = new SourceLabeltruth(sourceLabel, true); SourceLabeltruth sourceFalse = new SourceLabeltruth(sourceLabel, false); CascadedConstant.Pr_t_s.Add(sourceTrue, new Dictionary <TargetLabeltruth, double>()); CascadedConstant.Pr_t_s.Add(sourceFalse, new Dictionary <TargetLabeltruth, double>()); foreach (Label targetLabel in Constant.TargetTaxonomy.LabelArray) { TargetLabeltruth targetTrue = new TargetLabeltruth(targetLabel, true); TargetLabeltruth targetFalse = new TargetLabeltruth(targetLabel, false); #region 在SourceLabeltruth内计算 CascadedConstant.Pr_t_s[sourceTrue].Add(targetTrue, sourceTrue.Pr_t_s(targetTrue, groupindex)); CascadedConstant.Pr_t_s[sourceTrue].Add(targetFalse, sourceTrue.Pr_t_s(targetFalse, groupindex)); CascadedConstant.Pr_t_s[sourceFalse].Add(targetTrue, sourceFalse.Pr_t_s(targetTrue, groupindex)); CascadedConstant.Pr_t_s[sourceFalse].Add(targetFalse, sourceFalse.Pr_t_s(targetFalse, groupindex)); #endregion #region normalize(用Pt做指数的话需要,已废弃) //double trueProbability = sourceTrue.Pr_t_s(targetTrue); //double falseProbability = sourceTrue.Pr_t_s(targetFalse); //double constant = trueProbability + falseProbability; //ProbabilityConstant.Pr_t_s[sourceTrue].Add(targetTrue, trueProbability / constant); //ProbabilityConstant.Pr_t_s[sourceTrue].Add(targetFalse, falseProbability / constant); //trueProbability = sourceFalse.Pr_t_s(targetTrue); //falseProbability = sourceFalse.Pr_t_s(targetFalse); //constant = trueProbability + falseProbability; //ProbabilityConstant.Pr_t_s[sourceFalse].Add(targetTrue, trueProbability / constant); //ProbabilityConstant.Pr_t_s[sourceFalse].Add(targetFalse, falseProbability / constant); #endregion } } }