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

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

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

신어 사전으로 바꾸기
"mecab-ipadic-NEologd"라는 MeCab의 신어 사전을 설치하여 현재 아이로 진화합니다.
Windows를 제외하고는 패키지 관리자로 설치할 수 있습니다 
조속히, 「신격의 거인」을 리트라이 해 보면. . . 오, 당신이 왔습니다.

CaboCha 설치
CaboCha를 아래의 "다운로드"에서 설치하거나 yum 등으로 설치하십시오.
CaboCha: htps : // 타쿠 910. 기주 b. 이오 / 호박 /
또한 Windows 버전은 MeCab과 마찬가지로 "UTF-8"을 선택하십시오.
CaboCha 모듈 만들기
설치가 끝나면 CaboCha를 호출하는 모듈을 추가합니다.
lib/cabocha.exdefmodule 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.exdefmodule 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.exsdefmodule 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.exdefmodule 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답게, 문맥으로부터 의미를 읽는다
Reference
이 문제에 관하여(Elixir에서 약한 AI # 3 "MeCab 사전 교체 |> CaboCha 모듈 만들기"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/piacerex/items/a21d8901e4ae7b70aee8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
설치가 끝나면 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.exdefmodule 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.exsdefmodule 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.exdefmodule 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답게, 문맥으로부터 의미를 읽는다
Reference
이 문제에 관하여(Elixir에서 약한 AI # 3 "MeCab 사전 교체 |> CaboCha 모듈 만들기"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/piacerex/items/a21d8901e4ae7b70aee8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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이라면 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답게, 문맥으로부터 의미를 읽는다
Reference
이 문제에 관하여(Elixir에서 약한 AI # 3 "MeCab 사전 교체 |> CaboCha 모듈 만들기"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/piacerex/items/a21d8901e4ae7b70aee8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)