srilm 阅读文档11

本文档详细介绍了LMStats类及其成员函数,包括构造函数、析构函数、countSentence、countString和countFile等,这些函数用于统计句子、文本和词的数据。LMStats是一个基类,定义了纯虚函数,实际实现由子类完成,体现了面向对象编程的思想。
摘要由CSDN通过智能技术生成

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统计时
   的字符串到索引的映射。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值