機械学習下準備〜文章フォーマット作成〜

 前回発覚した問題が以下のふたつ。

  • 名詞,形容動詞語幹
  • 名詞,形容詞語幹

 このあたり日本語のややこしいところで、例えば前回引っかかった「好き」。

  • 好き:名詞,形容詞語幹
  • 好く:形容詞
  • 好かない:動詞

……とまあ散々な有様。ちなみに「好み/好む」については

  • 好み:名詞,一般
  • 好む:動詞

 という状態。名詞一般……。これは学習よりも出力に問題が出そうな……どっちかっていうと形容動詞語幹に振り分けてくれた方が文章としては適切な気がします。好みだ。好みの%noun%。好きも形容動詞語幹に入れてほしいですね。好きだ。好きな%noun%。

 というわけでろくろく解決策も思いつかないので一旦先に進みます。
 辞書ファイルをどうにかできればいいのでは? と思ってファイル漁ったんですけどなんかどうにもなりそうにないというか、dicファイルの編集方法がわからない。小学生男児なのでunk.dicを見かけたときに「うんこだ! うんこ!!」という気持ちになり、深追いするのをやめました。何の略なんだろうunk……

テンプレートを作成する

 ここで言う「テンプレート」とは、「○○は××ね」という種類のものです。もうちょっとスクリプトてきに書くと「%noun%は%adjective%ね」てきなものです。ここに昨日学習した「白い猫」「可愛い」を当てはめてやると「白い猫は可愛いね」となります。
 活用形の処理はまた考えないといけないかもなーと思っています。こっちは正解がある話ですし機械学習でできそうな匂いがするのでちょっと本とか読みながら考えます。ここまで書いておいて可能なのかどうか。いつでもいきあたりばったりです。

閑話休題。

 テンプレートの作成について、理論的には

  1. 入力値を形態素解析にかける
  2. 昨日作ったロジックを流用して「白い猫」の部分を%noun%に、「可愛い」の部分を%adjective%に置き換える
  3. 置き換えた文章「%noun%は%adjective%ね」をパターン辞書に登録する

という具合になります。

 返答の際は入力値と連想辞書を突き合わせた結果をパターン辞書の構文に当てはめて「白い猫は可愛いね」を返却できるようにします。理論的には「白い猫は好き?」と聞けば「白い猫は可愛いね」という文章が返ってくる、はずです。※「好き」が名詞判定されるのをどうにかできればの話

具体的にはこう。

    def study_format(self, text, parts):
        text = self.make_format(text, parts)
        """ユーザーの発言textをランダム辞書に保存する。
        すでに同じ発言があった場合は何もしない。"""
        if not text in self._format:
            self._format.append(text)

    def make_format(self, text, parts):
        fmt = ""
        for word, part in parts:
            if self.is_noun(part):
                fmt+="%noun%"
            elif self.is_adjective(part):
                fmt+="%adjective"
            else:
                fmt+=word
        return fmt

    @staticmethod
    def is_adjective(part):
        return bool(re.match(r'(形容詞|名詞,形容動詞語幹)', part)); # 保留

これでOKかな〜とか思ってたら「白い猫は可愛い」と登録したときの辞書が %adjective%%noun%は%adjective% になって昨日作ったロジックと矛盾することになったのでもうちょっと書きます。

    def make_format(self, text, parts):
        noun = ""
        for word, part in parts:
            if self.is_noun(part):
                noun+=word
            else:
                if noun != "":
                    phrases = self.get_predicate(noun)
                    noun = self.get_modifier(noun) + noun
                    text = text.replace(noun,'%noun%')
                    text = text.replace(phrases,'%adjective%')
                noun = ""
        if noun != "":
            phrases = self.get_predicate(noun)
            noun = self.get_modifier(noun) + noun
            text = text.replace(noun,'%noun%')
            text = text.replace(phrases,'%adjective%')

        return text

 これで登録結果が %noun%は%adjective% になりました。原理的には昨日書いたロジックと同じですね。
 しかしまだ主語の判別ができていません。「黒は車屋の黒である」と入力してみたら「%noun%である」と登録されてしまいましたので、このあたりもなんとかしていきます(例文が悪いという気もする)。
 次回の目標は「黒/は/車屋の黒/である」と認識すること、「%noun%は%noun%である」と登録させることです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です