もしかしてあれか、sortlm.pyの__read_ngramdのここ
for word in ngram:
agent = marisa.Agent()
agent.set_query(word)
if not self.__vocab_trie.lookup(agent):
continue
ids.append(agent.key_id())
単語表にないものについてはid.append()をngrams分登録できない…それに対し__write_ngramsでは
items = [(struct.pack("=LL", ids[1], unigram_offsets[ids[0]]), ids) for ids in keys]
ids[1]が存在することを前提にしている。故に、IndexErrorが起こる。
IRSTLMで3-gramの日本語ウェブコーパスから[123]-gramの表を作る以上、単語表(1-gram)はちゃんとしてると思っていたんだがなあ…確かに<unk>のエントリがあった以上は切り捨てられたものも何かあるとは思ってたんだ。この切り捨てを無効化して.arpaを作れれば御の字なんだが…そうでなければsortlm.pyで対応するしかない。