我正在尝试创建一个将日语句子分割成单词的 CRF 模型。目前我并不担心完美的结果,因为这只是一个测试。训练进行得很好,但是当它完成时,它总是对我尝试标记的每个句子给出相同的猜测。
"""Labels: X: Character is mid word, S: Character starts a word, E:Character ends a word, O: One character word"""
Sentence:広辞苑や大辞泉には次のようにある。
Prediction:['S', 'X', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E']
Truth:['S', 'X', 'E', 'O', 'S', 'X', 'E', 'O', 'O', 'O', 'O', 'S', 'E', 'O', 'S', 'E', 'O']
Sentence:他にも、言語にはさまざまな分類がある。
Prediction:['S', 'X', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E', 'S', 'E']
Truth:['O', 'O', 'O', 'O', 'S', 'E', 'O', 'O', 'S', 'X', 'X', 'X', 'E', 'S', 'E', 'O', 'S', 'E', 'O']
查看模型的转换信息时:
{('E', 'E'): -3.820618,
('E', 'O'): 3.414133,
('E', 'S'): 2.817927,
('E', 'X'): -3.056175,
('O', 'E'): -4.249522,
('O', 'O'): 2.583123,
('O', 'S'): 2.601341,
('O', 'X'): -4.322003,
('S', 'E'): 7.05034,
('S', 'O'): -4.817578,
('S', 'S'): -4.400028,
('S', 'X'): 6.104851,
('X', 'E'): 4.985887,
('X', 'O'): -5.141898,
('X', 'S'): -4.499069,
('X', 'X'): 4.749289}
这看起来不错,因为所有带有负值的转换都是不可能的,例如 E -> X,从单词的末尾到下一个单词的中间。S -> E gets 具有最高值,如上所示,模型简单地进入标记 S 然后 E 重复直到句子结束的模式。我在尝试此操作时遵循了此演示,尽管该演示用于分离拉丁语。我的特征同样只是 n-gram:
['bias',
'char=ま',
'-2-gram=さま',
'-3-gram=はさま',
'-4-gram=にはさま',
'-5-gram=語にはさま',
'-6-gram=言語にはさま',
'2-gram=まざ',
'3-gram=まざま',
'4-gram=まざまな',
'5-gram=まざまな分',
'6-gram=まざまな分類']
我尝试将标签更改为仅用于开始和其他的 S 和 X,但这只会导致模型重复 S、X、S、X 直到字符用完。我在两个方向上都达到了 6 克,这花了更长的时间,但没有改变任何东西。尝试训练更多迭代并稍微改变 L1 和 L2 常数。我已经训练了多达 100,000 个句子,这几乎是我能做到的,因为它几乎需要我所有 16GB 的内存才能做到这一点。我的特征结构错了吗?我如何让模型停止猜测模式,这就是正在发生的事情吗?帮助将不胜感激,如果我需要向问题添加更多信息,请告诉我。