Srilm 阅读文档11

取自 自然语言处理百科

跳转到: 导航, 搜索

LMStats.h LMStats.cc

文档作者:jianzhu

创立时间:08.09.18


1、概述


这两个文件主要定义了语言模型中用于对句子,文本和词的统计分析的接口。

LMStats类

   该类提供了如下函数
   a) 构造函数
   b) 析构函数
   c) 基于词的countSentence纯虚函数
   d) 基于词索引的countSentence纯虚函数
   e) 基于句子countString统计函数
   f) 基于文件的countFile统计函数
   g) 读文件read纯虚函数
   h) 写文件write纯虚函数
  

2、函数功能解释


a) 构造函数

<src>
0  LMStats::LMStats(Vocab &vocab)
1        : vocab(vocab), openVocab(true)
2  {
3      addSentStart = true;
4      addSentEnd = true;
5  }
</src>
   功能:构造函数,初始化成员变量值
  
   细解:第1行通过成员初始化列表的方式,对成员变量vocab和openVocab初始化
   第3-4行分别将addSentStart和addSentEnd成员初始化为true。
 

e) 基于句子countString统计函数

<src>
0  unsigned int
1  LMStats::countString(char *sentence)
2  {
3      static VocabString words[maxWordsPerLine + 1];
4      unsigned int howmany;
5   
6      howmany = vocab.parseWords(sentence, words, maxWordsPerLine + 1);
7
8      if (howmany == maxWordsPerLine + 1) {
9      return 0;
10     } else {
11     return countSentence(words);
12     }
13 }
</src>
   功能:本函数主要用于分析句子中的词,同时更新相关词的统计量。
  
   细解:第3行在堆上分配了一个金泰的字符串指针buffer,用于保存分析出的词
   第6行调用vocab对象的成员函数parseWords分析出sentence中的每一个词并将其
   保存到words中。(注:由于parseWords内部是通过调用strtok来分析句子的,
   而strtok本身并不会分配内存,只是修改了句子中分隔符的内容,同时进行了指针
   偏移操作,因此这里不存在内存泄漏问题)
   第8-10行判断howmany是否达到了每一句词的上限,如果达到了该上限,则返回0。
   否则执行第11行。
   第11行通过调用基于词的countSentence函数更新相关词的统计量。
  

f) 基于文件的countFile统计函数

<src>
0  unsigned int
1  LMStats::countFile(File &file)
2  {
3      int numWords = 0;
4      char *line;
5
6      while (line = file.getline()) {
7      unsigned int howmany = countString(line);
8
9      /*
10       * Since getline() returns only non-empty lines,
11      * a return value of 0 indicates some sort of problem.
12      */
13     if (howmany == 0) {
14         file.position() << "line too long?\n";
15     } else {
16         numWords += howmany;
17     } 
18    }
19     if (debug(DEBUG_PRINT_TEXTSTATS)) {
20    file.position(dout()) << this -> stats;
21     }
22     return numWords;
23 }
</src>
   功能:本函数主要用于分析文件中的词,同时更新相关词的统计量
  
   细解:第6-18行循环处理文件中每一句,并更新分析出的词的相应统计量
   第6行调用file对象的成员函数getline从文件中读出每一行。
   第7行调用基于句子的countString函数分析每一句中的词,同时更新相应
   词的统计量,并保存分析出的词数。
   第16行记录当前文件中的词数。
   第19-21行根据分析结果输出当前文件的状态信息,主要是perpelxity值。
  
  

知识点:


基类

      本类是一个基类,声明了一些纯虚函数,这些纯虚函数的实际实现由子
  类来定义,同时定义了一些子类公用的函数。该方法很好地体现了面向对象
  的编程思想。
      LMStats基类中定义了vocab成员对象,该对象主要用于后面ngram统计时
  的字符串到索引的映射。


转自:http://blog.chinaunix.net/u1/58264/showart_1333616.html

个人工具
工具箱