プログラミング言語の解析を考える場合、まず初めに構文の解析を始める. その際にはまだ意味は分からないので考慮をしない. 意味的にこうだから、などと言って勝手に曖昧性を解消しようとはしない. (C++ の >>
問題が有名だ.) そしてその後に解析結果に意味を与えていく.
というわけで、明らかに人間が自然言語を解釈する工程が違う. 人間はどちらかと言えば構文は気にしないで言葉を理解するのではないか. 自然言語の場合、構文解析のフェーズと意味付けのフェーズは密着して離せられないのが正しいのではないだろうか.
接続詞は文やフレーズの間の関係を明示するトークンであるが、 必ずしも無くても普通何かしらの関係があり、それは意味から当たり前に推論される.
ぶっちゃけ話の流れから、そろそろ逆接が来るだろう、と予想できた経験は誰しもが持っている. また構文の誤り訂正を誰しもが普通に行って相手の意図を組まないと円滑にコミュニケーションは出来ない. その訂正には意味が必要不可欠だ. 言語が本質的に持つ構文に関する曖昧性のその解消にも意味は大いに役立つ. よっぽど大切な商談の話でもなければ、いちいち確認せず、当たり前だと思えるように訂正して解釈するだろう.
というわけで意味を見ない係り受け解析は嘘である. 出来ることをすべきだ.
フレーズは意味ベクトルを取る. フレーズ間の関係は、構文と意味から確率的に解析される.
ところで個人的に、語順が変わると意味が変わるようなモデルはおかしいと思う. 語順と言ったって、「東京から渋谷まで」と「渋谷から東京まで」では意味が変わってしかるべきだが、「私がそれをあれする」と「それを私があれする」は同じであるべきだ. ニュアンスが違うよという指摘もあるかもしれないが、それはまた別の話にしたい.
近い意味のものは近い値に、全く同じ意味を持つものは全く同じ値に写すハッシュ関数が欲しい. いやまあ、これって単語分散表現のことなんだけど. あるいはテキストの正規化のことでもあるんだけど.