词格原先的整句打分是一份没校准过的启发式 unigram,质量很差。这里内嵌 libime 在用的 kenlm 查询子集,改由它的三元模型 sc.lm 来打路径分。 - engine/ngram 只编 kenlm 的 query / trie-build 路径。不定义 WITH_THREADS, parallel_read.cc 因此退化成串行实现,整个子集零 Boost 依赖。 KENLM_MAX_ORDER=3 必须与建模阶数一致,改它等于读不懂已发布的模型文件。 - ngram::LanguageModel 是唯一 include kenlm 头文件的地方,对外只给出一个纯 std 的头,_HAS_AUTO_PTR_ETC 和 kenlm 的 include 目录都保持 PRIVATE。 - shared_language_model 按资源路径共享一份 mmap。kenlm 的查询是只读的且把 上下文放在调用方的 State 里,所以并发会话不需要额外加锁。 - 模型缺失时 valid() 为假,词格退回原来的启发式打分:整句候选只是变差,不会 停止工作。测试覆盖了缺模型降级与按路径共享。 - 出货的 ARPA 不带 <s>/</s>,所以解码从 null_state() 起算而非 begin_state()。 kenlm 是上游副本,不重排版、不进 clang-format,其 LGPL-2.1+ 与 BSD 例外清单 已补进 THIRD_PARTY_NOTICES.txt。googlepinyinime 那条 Fallback 整句路径不变。
48 lines
1.3 KiB
C++
48 lines
1.3 KiB
C++
#include "ersatz_progress.hh"
|
|
|
|
#include <algorithm>
|
|
#include <ostream>
|
|
#include <limits>
|
|
#include <string>
|
|
|
|
namespace util {
|
|
|
|
namespace { const unsigned char kWidth = 100; }
|
|
|
|
const char kProgressBanner[] = "----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100\n";
|
|
|
|
ErsatzProgress::ErsatzProgress() : current_(0), next_(std::numeric_limits<uint64_t>::max()), complete_(next_), out_(NULL) {}
|
|
|
|
ErsatzProgress::~ErsatzProgress() {
|
|
if (out_) Finished();
|
|
}
|
|
|
|
ErsatzProgress::ErsatzProgress(uint64_t complete, std::ostream *to, const std::string &message)
|
|
: current_(0), next_(complete / kWidth), complete_(complete), stones_written_(0), out_(to) {
|
|
if (!out_) {
|
|
next_ = std::numeric_limits<uint64_t>::max();
|
|
return;
|
|
}
|
|
if (!message.empty()) *out_ << message << '\n';
|
|
*out_ << kProgressBanner;
|
|
}
|
|
|
|
void ErsatzProgress::Milestone() {
|
|
if (!out_) { current_ = 0; return; }
|
|
if (!complete_) return;
|
|
unsigned char stone = std::min(static_cast<uint64_t>(kWidth), (current_ * kWidth) / complete_);
|
|
|
|
for (; stones_written_ < stone; ++stones_written_) {
|
|
(*out_) << '*';
|
|
}
|
|
if (stone == kWidth) {
|
|
(*out_) << std::endl;
|
|
next_ = std::numeric_limits<uint64_t>::max();
|
|
out_ = NULL;
|
|
} else {
|
|
next_ = std::max(next_, ((stone + 1) * complete_ + kWidth - 1) / kWidth);
|
|
}
|
|
}
|
|
|
|
} // namespace util
|