Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205218
  • 博文数量: 16
  • 博客积分: 2001
  • 博客等级: 大尉
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-29 16:25
文章分类
文章存档

2011年(1)

2009年(1)

2008年(14)

我的朋友

分类: C/C++

2008-10-23 15:58:42

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) 构造函数

0  LMStats::LMStats(Vocab &vocab)
1        : vocab(vocab), openVocab(true)
2  {
3      addSentStart = true;
4      addSentEnd = true;
5  }

    功能:构造函数,初始化成员变量值
   
    细解:第1行通过成员初始化列表的方式,对成员变量vocab和openVocab初始化
    第3-4行分别将addSentStart和addSentEnd成员初始化为true。
  
e) 基于句子countString统计函数

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 }

    功能:本函数主要用于分析句子中的词,同时更新相关词的统计量。
   
    细解:第3行在堆上分配了一个金泰的字符串指针buffer,用于保存分析出的词
    第6行调用vocab对象的成员函数parseWords分析出sentence中的每一个词并将其
    保存到words中。(注:由于parseWords内部是通过调用strtok来分析句子的,
    而strtok本身并不会分配内存,只是修改了句子中分隔符的内容,同时进行了指针
    偏移操作,因此这里不存在内存泄漏问题)
    第8-10行判断howmany是否达到了每一句词的上限,如果达到了该上限,则返回0。
    否则执行第11行。
    第11行通过调用基于词的countSentence函数更新相关词的统计量。
   
f) 基于文件的countFile统计函数

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 }

    功能:本函数主要用于分析文件中的词,同时更新相关词的统计量
   
    细解:第6-18行循环处理文件中每一句,并更新分析出的词的相应统计量
    第6行调用file对象的成员函数getline从文件中读出每一行。
    第7行调用基于句子的countString函数分析每一句中的词,同时更新相应
    词的统计量,并保存分析出的词数。
    第16行记录当前文件中的词数。
    第19-21行根据分析结果输出当前文件的状态信息,主要是perpelxity值。
   
   
--------------------------------------
知识点:
--------------------------------------
基类
       本类是一个基类,声明了一些纯虚函数,这些纯虚函数的实际实现由子
   类来定义,同时定义了一些子类公用的函数。该方法很好地体现了面向对象
   的编程思想。
       LMStats基类中定义了vocab成员对象,该对象主要用于后面ngram统计时
   的字符串到索引的映射。
阅读(1210) | 评论(0) | 转发(0) |
0

上一篇:srilm 阅读文档10

下一篇:srilm 阅读文档12

给主人留下些什么吧!~~