本次使用的语料一共有10934个文档,假设每个文档的主题分布是一样的。一个文档对应一个主题分布。因此,在计算主题映射概率之前,需要先对语料进行预处理,首先需要在语料库中读入主题分布。每个文档由<doc></doc>来区分。
原始的语料文档的格式如下所示:
这是第一个文档中的前两句话。而读入主题分布之后的文档如下所示:
我们发现,其中加入了<src_topic>和<tgt_topic>这两个部分。前者是源端语言的主题分布,后者是目标端语言的主题分布。这些主题分布都是从指定文件中读入的。主题分布的文件中格式为:
这是源语言主题分布中的第一和第二个主题分布,每个主题分布包含100个主题分布概率。因此只要将每个分布读到语料中每个文档中的每个句子中。
整个算法的思想比较简单,首先找个每个文档,再在文档中定位到每个句子,在句子的对齐信息后面插入主题分布即可。首先给出的是定位到每个句子的代码:
1 string read_bead(string bead,string topic)
2 {
3 string str,str_lag,result;
4 istringstream input(bead,istringstream::in);
5 size_t x=0,y=0;
6 while(getline(input,str))
7 {
8 str_lag.append(str);
9 str_lag.push_back('\n');
10 y=str_lag.find("</bead>");//通过</bead>的标记来定位句子的末尾
11 if (y!=-1)
12 {
13 result+=read_topic(str_lag,topic);
14 str_lag.clear();
15 }
16 }
17 result=result+"</doc>";
18 return result;
19 }
找到句子之后再在句子的对齐信息之后插入主题分布:
1 string read_topic(string bead,string topic)
2 {
3 size_t x=0,y=0;
4 x=bead.find("</aligment>");
5 bead.insert(x+12,topic);
6 return bead;
7 }
其中topic的string是事先从主题分布文件中读入的。
这样就完成了对语料的预处理,接下去就要进行对主题映射概率的计算。
参考文献:
1、A Topic Similarity Model for HPB_Xinyan Xiao_ACL 2012
2、Hidden Topic Markov Model