sunpinyin n-gram数据二进制和utf8格式的转换

原创 2016年05月31日 09:30:16

1.

【目标】:将二进制的模型数据lm_sc.t3g转换成 utf8格式 lm_sc.t3g.arpa

【操作】:

./tslminfo -p -v -l  ../raw/dict.utf8 ../data/lm_sc.t3g >../raw/lm_sc.t3g.arpa

【解释】:

-p : 使用正常的频率值Pr, 非默认的-log(Pr)

-v : 输出apra格式

-l : 指定utf8格式的字典文件

../raw/dict.utf8 : utf8格式的字典文件

../data/lm_sc.t3g : 需要转换的二进制模型数据

../raw/lm_sc.t3g.apra : 输出utf8格式的模型数据


2.

【目标】: 将utf8格式的模型数据转换为二进制的模型数据

[操作] : tslmpack <arpa_file> <lexicon_file> <t3g_file>

./tslmpack ../raw/lm_sc.t3g.arpa ../raw/dict.utf8 lm_sc.t3g


3. 如果数据模型文件是2-gram不是默认的3-gram,如果执行2的命令会报错 “Failed to read from”

【解决方案】:

1) 修改类 CArpaSlm和tslmpack程序以支持2-gram。具体代码如下

diff --git a/src/slm/tslmpack/arpa_slm.cpp b/src/slm/tslmpack/arpa_slm.cpp
old mode 100644
new mode 100755
index 82029c6..5bb242d
--- a/src/slm/tslmpack/arpa_slm.cpp
+++ b/src/slm/tslmpack/arpa_slm.cpp
@@ -150,7 +150,7 @@ CArpaSlm::load(const char* filename, const TLexicon& lexicon)
     printf("Loading ARPA slm..."); fflush(stdout);
     ifstream file(filename);
     char buf[1024];
-    for (int i = 0; i <= N_GRAM; ++i) {
+    for (unsigned i = 0; i <= m_N; ++i) {
         unsigned lvl;
         int size;
         file.getline(buf, sizeof(buf));
@@ -159,7 +159,7 @@ CArpaSlm::load(const char* filename, const TLexicon& lexicon)
             exit(1);
         }
         sscanf(buf, "\\%d-gram\\%d%*[\n]", &lvl, &size);
-        assert(lvl <= N_GRAM);
+        assert(lvl <= m_N);
         if (lvl == 0) {
             TNode node0;
             node0.load_level0(file);
diff --git a/src/slm/tslmpack/arpa_slm.h b/src/slm/tslmpack/arpa_slm.h
old mode 100644
new mode 100755
index 3c49393..7c8a1eb
--- a/src/slm/tslmpack/arpa_slm.h
+++ b/src/slm/tslmpack/arpa_slm.h
@@ -78,6 +78,7 @@ public:
     /* XXX, ARPA file does not provide these information.
        so we assume this SLM is trigram, and does not use LogPr */
     CArpaSlm() : m_usingLogPr(false), m_N(N_GRAM) {}
+    CArpaSlm(unsigned N) : m_usingLogPr(false), m_N(N) {}
     bool good() const { return m_levels[0].size() != 0; }
     unsigned getN() const { return m_N; }
     bool usingLogPr() const { return m_usingLogPr; }
diff --git a/src/slm/tslmpack/slmpack.cpp b/src/slm/tslmpack/slmpack.cpp
old mode 100644
new mode 100755
index 3f00d72..d267925
--- a/src/slm/tslmpack/slmpack.cpp
+++ b/src/slm/tslmpack/slmpack.cpp
@@ -323,13 +323,14 @@ cleanup(CompressedTable& pr_table, CompressedTable& bow_table,
 int
 main(int argc, char* argv[])
 {
-    if (argc != 4)
+    if (argc != 5)
         ShowUsage(argv[0]);
     const char* arpa_path = argv[1];
     const char* lexicon_path = argv[2];
     const char* threaded_path = argv[3];
+    unsigned n = (unsigned)(atoi(argv[4]));
 
-    CArpaSlm slm;
+    CArpaSlm slm(n);
     TLexicon lexicon = read_lexicon(lexicon_path);
     slm.load(arpa_path, lexicon);

[操作]:

[操作] : tslmpack <arpa_file> <lexicon_file> <t3g_file> <n-gram>

./tslmpack ../raw/lm_sc.t2g.arpa ../raw/dict.utf8 lm_sc.t2g 2



相关文章推荐

全国省市区数据sql格式(MySQL)UTF8

  • 2017年11月16日 18:16
  • 249KB
  • 下载

全国县市经纬度utf8格式数据

  • 2011年07月09日 15:06
  • 62KB
  • 下载

python从数据库中获取utf8格式的中文数据输出时变成问号或乱码

我用python操作mysql数据库,数据库中数据格式为utf8,我使用python调用select语句后获取到数据库的信息,然后使用print打印出来的时候,原本中文数据却无法显示,显示出来的是一串...

utf8 ansii unicode三种格式的相互转换

直接贴源码: 具体源码函数文件见此链接:http://download.csdn.net/detail/lingxiu0613/5290721 BOOL AnsiToUcs(const C...

封装tinyxml实现对UTF8和UNICODE编码格式转换

tinyxml对存储xml非常方便,但存储的格式却不是UTF8,导致实际使用中遇到读取问题。为了方便使用,我对tinyxml的数据转换做了一些封装,使使用更加方便些。详细见一下代码:  #pragma...
  • tomyi
  • tomyi
  • 2014年03月01日 18:04
  • 920

utf8转换为gbk格式

  • 2015年07月31日 18:19
  • 15.3MB
  • 下载

GBK_UTF8格式转换程序源代码

  • 2016年11月22日 18:49
  • 135KB
  • 下载

c++对编码格式ANSI utf8 unicode 进行转换

Windows下有很多种编码格式,在与别的系统环境中有文件传输或通信时,这些编码就很重要。 比如在windows中换行是\r\n 在linux或mac下是\n,如果不对编码进行转换就会出现乱码。在通信...

GBK转UTF8(模版格式转换)

  • 2012年08月30日 20:47
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sunpinyin n-gram数据二进制和utf8格式的转换
举报原因:
原因补充:

(最多只允许输入30个字)