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



UTF8二进制及明文字符窜转化

/***********本程序由云客编写。有空的时候承接php软件开发 *满足一下新手们的好奇心,看看UTF-8的二进制是什么样子滴 ****************************/ ...
  • u011474028
  • u011474028
  • 2013年11月08日 11:30
  • 2108

编码格式说明及Unicode与utf-8互转

1、GB2312:又称国标码,规定:对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示,习惯上称第一个字节为“高字节”,第二个字节为“低字节” GB2312中汉字编码范...
  • koxiaozi1988
  • koxiaozi1988
  • 2017年07月10日 14:29
  • 260

unicode与utf-8互转

1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)...
  • cow__sky
  • cow__sky
  • 2014年04月15日 20:59
  • 1936

sunpinyin输入法

0. 输入法的概念模型 让我们来看看ime部分的概念模型(concept model): 插图1 Static SLM,Lexicon:我们在前面介绍slm部分的代码时已经了解过了。访问...
  • chenlei0630
  • chenlei0630
  • 2014年04月11日 16:00
  • 1365

语言模型系列之N-Gram、NPLM及Word2vec

上一篇博客简单梳理了NLP的技术架构、NLP语言模型的演化,以及最基本的语言模型Bag-of-Word词袋模型及基于词袋模型的重要模型和算法。本文将继续探讨NLP中重要的语言模型N-Gram语言模型,...
  • TiffanyRabbit
  • TiffanyRabbit
  • 2017年05月23日 17:44
  • 1040

运用BSon将数据记录转换成二进制

按照惯例,我在这里先介绍一下什么是BSon。 BSon是Binary JSON的简称,是一种类Json的一种二进制形式的存储格式。目前Bson主要被MongoDB(目前一个较为流行的非关系数据模...
  • Adrastos
  • Adrastos
  • 2013年06月14日 12:43
  • 1297

将二进制深度图转换成OpenCV的Mat格式

日常在使用深度相机(Xtion之类)时,有时没有OpenCV的环境,就会把数据保存成16位的二进制dat文件,但是之后我们的处理一般都是在OpenCV里面的,这时就需要将二进制深度图转换成Mat格式,...
  • u012423865
  • u012423865
  • 2017年08月29日 17:59
  • 354

SunPinyin代码导读-IME部分

0. 综述这一部分主要介绍Sunpinyin中ime部分的代码。 要构建ime部分的代码,可以执行下面的操作: $ ./autogen.sh --prefix=/usr --enable-...
  • goodcope
  • goodcope
  • 2014年09月04日 23:46
  • 876

java.sql.SQLException: 不能在 UTF8 和 UCS2 之间转换: failUTF8Conv

  今天按照以往一样在eclipse中发布应用,结果启动过程中提示“java.sql.SQLException: 不能在 UTF8 和 UCS2 之间转换: failUTF8Conv ”这个错误;但是...
  • dacong910
  • dacong910
  • 2010年03月30日 14:33
  • 6073

Erlang编码utf8转urlunicode(二)

Erlang uri 编码,任意数据转为uri的urlunicode编码
  • qingchuwudi
  • qingchuwudi
  • 2015年07月02日 10:41
  • 2272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sunpinyin n-gram数据二进制和utf8格式的转换
举报原因:
原因补充:

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