Elixir에서 약한 AI # 3 "MeCab 사전 교체 |> CaboCha 모듈 만들기"

(이 기사는 Elixir (그 2)와 Phoenix Advent Calendar 2016 8일째의 기사입니다)

지난번 은 Phoenix에서 웹 앱화하여 마지막에 출현한 고유명사를 앵무새 돌려주는 다소는 말한 것을 잡는다 (문자대로 '잡는다' 뿐이지만…) 빈약 AI를 만들었지만, "진격의 거인"을 모르는 올드 타입임이 밝혀졌습니다

이번에는, MeCab의 사전을 바꾸어, 빈약 AI를 현대아로 진화시킨 후, 문장의 구성을 해석하기 위한 「CaboCha」를 Elixir로 사용할 수 있도록 합니다

CaboCha의 Elixir 모듈은 세상에 없기 때문에 이번에 만들어 보겠습니다

덧붙여 본 칼럼중의 「Elixir의 쓰는 방법」에 대해서는, 그다지 세세하게 설명을 하고 있지 않기 때문에, 「여기의 쓰는 방법을 모른다」라든가 「이 처리가 무엇을 하고 있는지 잘 모른다」등 있으면, 댓글을 달면 답변 드리겠습니다

신어 사전으로 바꾸기



"mecab-ipadic-NEologd"라는 MeCab의 신어 사전을 설치하여 현재 아이로 진화합니다.

Windows를 제외하고는 패키지 관리자로 설치할 수 있습니다
  • Docker(trenpixster/elixir)나 Ubuntu・・・ apt
  • CentOS 등 ... yum
  • Mac ... Homebrew
  • Windows···수동으로 설정 ※UTF-8로 실시하기 위해, 이하 2점의 순서를 변경할 필요가 있습니다
  • 2의 순서는 「[Recompile SHIFT-JIS Dictionary]」가 아니고 「[Recompile UTF-8 Dictionary]」를 실행
  • 4 단계 전에 mecab-dict-compile.cmd의 "-t"에서 "shift-jis"를 "UTF-8"로 변경


  • 조속히, 「신격의 거인」을 리트라이 해 보면. . . 오, 당신이 왔습니다.



    CaboCha 설치



    CaboCha를 아래의 "다운로드"에서 설치하거나 yum 등으로 설치하십시오.

    CaboCha: htps : // 타쿠 910. 기주 b. 이오 / 호박 /

    또한 Windows 버전은 MeCab과 마찬가지로 "UTF-8"을 선택하십시오.

    CaboCha 모듈 만들기



    설치가 끝나면 CaboCha를 호출하는 모듈을 추가합니다.

    lib/cabocha.ex
    defmodule Cabocha do
        def view( body ), do: tree( body )
        def tree( body ), do: if body == "" || body == nil, do: "", else: "echo #{body} | cabocha" |> execute
        def execute( command ) do
            command
            |> to_char_list
            |> :os.cmd
            |> to_string
        end
    end
    

    이 모듈을 사용하여 CaboCha 분석 결과를 페이지에 추가해 봅니다.

    lib/web_mini_ai_web/templates/page/index.html.eex
    <p>あなた「<%= @params[ "message" ] %></p>
    <p>貧弱AI「<%= MiniAi.listen( @params[ "message" ] ) %></p>
    
    <form method="GET" action="/">
    <input type="text" name="message" size="60" value="">
    <input type="submit" value="話しかける">
    </form>
    
    <hr>
    <h3>CaboCha解析結果</h3>
    <p><pre><%= Cabocha.view( @params[ "message" ] ) %></pre></p>
    

    말을 걸면 CaboCha에서 어떻게 분석되는지 알 수 있습니다.



    CaboCha 출력을 XML로 전환



    이 트리 구조는 외형은 좋지만, 이대로라면 프로그램상에서는 다루기 어렵기 때문에, CaboCha의 커멘드 라인 옵션 「-f3」를 사용해, XML 출력으로 전환합니다

    lib/cabocha.ex
    defmodule Cabocha do
        def view( body ), do: xml( body )
        def xml( body ),  do: if body == "" || body == nil, do: "", else: "echo #{body} | cabocha -f3" |> execute
     …
    

    찾아보기를 다시 로드하면 다음과 같은 XML 디스플레이로 전환됩니다.



    CaboCha XML을 패턴 일치하기 쉬운 형태로 변환



    XML이라면 Elixir로 처리하기 어렵기 때문에 "xml_parser"모듈을 사용하여 변환합니다.

    mix.exs에 xml_parser 모듈 항목을 추가합니다.

    mix.exs
    defmodule WebMiniAi.Mixfile do
      use Mix.Project
     …
      defp deps do
        [{:phoenix, "~> 1.2.1"},
         {:phoenix_pubsub, "~> 1.0"},
         {:phoenix_html, "~> 2.6"},
         {:phoenix_live_reload, "~> 1.0", only: :dev},
         {:gettext, "~> 0.11"},
         {:cowboy, "~> 1.0"},
         { :mecab, "~> 1.0" }, 
         { :xml_parser, "~> 0.1.0" }, 
        ]
      end
     …
    

    iex를, Ctrl+C를 두 번 눌러 빠진 후, 모듈을 취득합니다(요망 접속)
    iex>
    BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
           (v)ersion (k)ill (D)b-tables (d)istribution
    # mix deps.get
    

    xml_parser.parse를 사용하여 XML에서 패턴 일치하기 쉬운 형태로 변환

    lib/cabocha.ex
    defmodule Cabocha do
        def parse( body \\ "10年後、ブラックホールの謎を応用した、重力のプログラミングが可能となる" ) do
            case body == "" || body == nil do
                true  -> ""
                false ->
                    body
                    |> xml
                    |> XmlParser.parse
            end
        end
     …
    

    그대로 Phoenix에서 볼 수 없으므로 콘솔에서 확인합니다.

    5/8 보충 : inspect() 사용하면 Phoenix에서도 볼 수 있습니다
    # iex -S mix phoenix.server
    iex> Cabocha.parse
    {:sentence, nil,
     [{:chunk,
       %{func: "3", head: "3", id: "0", link: "6", rel: "D", score: "-1.514907"},
       [{:tok, %{feature: "名詞,数,*,*,*,*,1,イチ,イチ", id: "0"}, "1"},
        {:tok, %{feature: "名詞,数,*,*,*,*,0,ゼロ,ゼロ", id: "1"}, "0"},
        {:tok,
         %{feature: "名詞,接尾,助数詞,*,*,*,年,ネン,ネン", id: "2"},
         "年"},
        {:tok, %{feature: "名詞,接尾,副詞可能,*,*,*,後,ゴ,ゴ", id: "3"},
         "後"},
        {:tok, %{feature: "記号,読点,*,*,*,*,、,、,、", id: "4"}, "、"}]},
      {:chunk,
       %{func: "6", head: "5", id: "1", link: "2", rel: "D", score: "1.513072"},
       [{:tok,
         %{feature: "名詞,固有名詞,一般,*,*,*,ブラックホール,ブラックホール,ブラックホール",
           id: "5"}, "ブラックホール"},
     …(略)…
        {:tok,
         %{feature: "動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル",
           id: "18"}, "なる"}]}]}
    

    이제 문장의 구성을 분석 할 수있게되었으므로 드디어 다음 번은, AI답게, 문맥으로부터 의미를 읽는다

    좋은 웹페이지 즐겨찾기