%#!platex -kanji=%k
%#DVIPDF dvipdfmx -f ipa.map
\documentclass{jsbook}
%\pagestyle{empty}
\usepackage[dvipdfmx]{graphicx}
%\usepackage{listings， jlisting}
%\usepackage[sectionbib]{chapterbib}
\usepackage{ascmac}
\usepackage{geometry}
\usepackage{url}		% 文中にURLを書くときは \url{} で括る
\geometry{textwidth=160mm, textheight=225mm}
\renewcommand{\bibname}{参考文献}
%% タイトル %%
\title{形態素解析を用いた検索支援キーワードマップの提案}

%% 著者 %%
\author{広瀬研究室4年\\C1190245 一居洋平}

%% 日付 %%
\date {令和4年1月11日}

\begin{document}
\maketitle
% \renewcommand{\abstractname}{概要}
\begin{center}
	{\bfseries 概要}
\end{center}
キーワードマップとは，ある特定のキーワードを中心として，そのキーワードから
派生する関連キーワードを放射状ツリーで階層的につなげた図や表のことであり，
これを用いれば，特定のキーワードの関連キーワード群を視覚的に把握することが可能である。
SNSが発展した現代では検索エンジンを通して誰でも知りたい情報が取得できる一方で，
それらを用いて検索するという行為を苦手とする人が多く存在する。キーワードマップを用いれば
そのような人たちでも簡単に検索キーワードの選定をすることができる。しかし
検索キーワードの誤表記や表記揺れがあれば正しく情報を取得することができないためそれらに対応した
キーワードマップが必要である。
そこで本研究では，検索を苦手とする人が簡単に知りたい情報を視覚的に取得可能にするために
形態素解析ツールであるMeCabを用いて，検索キーワードの形態素解析を行い
表記揺れや誤表記などに対応した検索支援キーワードマップ作成システムを作成，提案する。(422文字)

% 目次
\tableofcontents
\clearpage
% ------------------------第一章------------------------ %
\chapter{はじめに}
本章では研究の背景と目的について説明する。
\section{背景}
インターネットが急速に発展した現代では，誰もがスマートフォンやPCなどといった電子端末を持ち歩いている。
%%電子端末の利用者調査など裏付けするものがない
知りたい情報が誰でも簡単に取得できるようになった一方で，検索エンジンを用いたキーワード検索を苦手とする人が多くいることが問題となっている。
20代から60代の男女4407名に，普段インターネットを利用して検索をする際の，検索方法や行動に関するアンケート調査を行った結果において，
検索エンジンを利用する際のキーワード検索方法は何かという質問に「1回検索しても答えが出ないので，複数回検索する」，「わからない」が2.5割を占めた。
これらから，知りたい情報を検索しても情報が得られないことや情報を得るために時間がかかってしまう。
以上のことを踏まえて，本研究では，誰でも簡単に自分が知りたい情報を検索できるキーワードマップの作成を行う。
%%社会的問題との関連性が薄い
\section{研究目的}
本研究では，利用者が入力した検索キーワードから，関連するキーワードを正確に取得し，キーワードマップを生成するRubyプログラムを作成する。
%% そして何をどうするのか？何がどうなるのか？(社会的問題と絡める)

% ------------------------第二章------------------------ %
\chapter{関連研究と類似サービス}
本章では，Web検索機能における情報の関連研究と既存のキーワードマップ生成サービスを調査する。

\section{関連研究}
形態素解析を用いたシステムの研究事例について紹介する。

\subsection{形態素解析を用いたトレンド情報の抽出}
寺内，吉田らの研究 \cite{先行研究1}では，特定分野として経営工学に関わる研究に焦点を当て，
その中から「経営情報学会」の論文を論文や図書・雑誌などの
学術情報を検索できるデータベース・サービス『CiNii』から数年分
収集した。トレンド情報の検出手法として形態素解析エンジン
のMeCabを用いて，論文のトレンド情報と捉えられる語句を選別することで
抽出している。

\subsection{Twitterデータのクラスタ分析}
こちらの研究 \cite{先行研究2}では，2016年7月に行われた東京都知事選挙に関するTwitterデータ
のうち，選挙期間中に投稿されたもの収集し，クラスタ分析を行うことによって
，選挙に関する投稿について分析をした。収集したデータの前処理として日本語
形態素解析エンジンのMeCabを利用し，形態素解析を行っている。

\section{キーワードマップ生成サービス}
キーワードマップとは，ある特定のキーワードを中心として，そのキーワードから
派生する関連キーワードを放射状ツリーで階層的につなげた図や表のことである。
特定のキーワードの関連キーワード群を視覚的に把握することが可能であり，
検索キーワードの選定やコンテンツ作成などに用いられている。
キーワードマップ生成サービスについて調査し，キーワードマップの課題点を探る。

\subsection{keysearch Beta}
keysearch Betaは無料で利用可能なキーワードマップ作成ツールである。 \cite{keyseaech}
検索フォームにワードを入力し検索することで，主にGoogleサジェストから検索した
キーワードと関連するキーワードを自動で取得し，キーワードマップを作成することができる。 (図 \ref{fig:keybeta} )
また作成したキーワードマップから関連するワードのみを抽出し，CSVやSVG形式で保存することも
可能である。
keysearch Betaで作成されたキーワードマップは入力したキーワードのセカンドキーワード
までを抽出した二階層になっており，ひと目で情報を整理することができるという特徴がある。
しかし，入力したキーワードのセカンドキーワードまでしか表示されないことから，関連キーワード
を網羅することができず，キーワード選定には向いていない。
\begin{figure}[htb]
	\centering
	\includegraphics[width=15cm]{key.pdf}
	\caption{keysearch betaのキーワードマップ}
	\label{fig:keybeta}
\end{figure}

\subsection{OMUSUBI}
OMUSUBIは無料で利用可能なキーワードマップ作成ツールである。 \cite{OMUSUBI}
検索フォームにキーワードを入力することで，Google，Youtube.Amazon，Bing検索
などのサジェストを自動取得し，それぞれの検索エンジンに沿った
キーワードマップを作成することができる。 (図 \ref{fig:OMUSUBI} ) OMUSUBIで作成されたキーワードマップ
はスクロールで大きさの調整やドラッグすることで上下左右への移動，
ノードをクリックすることでそのキーワードを中心に配置することができ，
キーワードの関連性を階層ごとに把握しやすいことが特徴として挙げられる。
しかし，キーワードマップが表示されないことやノードが重なり
キーワードマップとして見づらいことなど不便な部分もある。

\begin{figure}[htb]
	\centering
	\includegraphics[width=15cm]{omu.pdf}
	\caption{OMUSUBIのキーワードマップ}
	\label{fig:OMUSUBI}
\end{figure}

\section{キーワードマップ生成サービスの課題点}\label{sec:kadai}
課題点として，一つ目は正確なキーワードを入力しなければ，取得したい情報が得られないという点である。
検索フォームに入力されたキーワードの表記揺れによって，サービスの利用者が取得したい情報とは異なる情報の
キーワードマップが生成されることがあるため，一度の検索で入力するキーワードの表記揺れに対応した検索システム
が必要となる。
二つ目は，文章のような長いキーワードを入力した場合，キーワードマップが生成されないという点である。
キーワードマップ生成サービスは，Googleなどの検索サジェストからキーワードを取得しているため，
検索キーワードが検索サジェストに一致しない場合，関連キーワードを取得することができない。よって，
あらかじめ入力された検索キーワードを整理し，検索サジェストに一致しやすくする必要がある。


% ------------------------第三章------------------------ %
\chapter{提案}
本章では， \ref{sec:kadai} 節で挙げた課題点を踏まえてそれを解決するためのシステムの提案を行う。

\section{本研究の提案}
本研究では，検索キーワードを入力することで，誰でも利用することが可能であり，表記揺れや文章などに対応した
キーワードマップ生成することが可能なシステムを構築する。

\section{課題点を踏まえた改善案}
 \ref{sec:kadai} 節で挙げた課題点を踏まえて，キーワードマップ生成に関する改善案を以下のように定義した。

\begin{itemize}

	\item 検索キーワードの表記揺れ
	
	入力された検索キーワードの表記揺れは検索サジェストを取得する前に検索キーワードの
	あいまい検索を行うことによって，正確な情報を取得可能にする。

	\item 検索キーワードの整理
	
	文章のような長いキーワードを入力した場合，検索サジェストと一致しやすくするために
	キーワードの形態素解析を行うことによって，そのキーワードのうち検索に適した要素のみを抽出する。

	\item キーワードマップの網羅性
	
	多くのキーワードの選定を可能にするためには作成されたキーワードマップ内の関連キーワードを多く
	取得する必要がある。そこで，関連キーワードをより多く取得するために検索キーワードから取得した
	サジェストからそれを検索キーワードとして再度検索サジェストを取得する。この動作を数回繰り返すこと
	によって，よりキーワード選定に向けたものにする。

\end{itemize}

\section{あいまい検索の活用}
あいまい検索は，検索キーワードとして入力された情報と類似した情報を検索結果として取得することが可能な
検索機能である。あいまい検索の処理方法は，取得した検索キーワードを言葉として意味を有する部分文字列を
選別し，それらを出現回数や出現集中度を考慮したスコアを算出するという構造となっている。

\subsection{検索キーワードの形態素解析}
検索キーワードの整理には形態素解析を用いる。形態素解析は自然言語処理の一部であり，自然言語を言葉が
意味を有する表現要素の最小単位である形態素まで分割し，それらを品詞として分類，判別する文字列抽出法である。
この技術は検索エンジンの処理やニュースアプリにおける画面上のタイトルの文字組みなどで活用されている。
主な形態素解析エンジンとしてオープンソースの形態素解析ツールである「MeCab」やPython上における形態素解析
に有用な「Janome」などが挙げられる。

\section{システム概要}
本研究では，検索キーワードを入力することで，その検索キーワードの情報を中心とした
キーワードマップの生成が可能なシステムを作成する。(図 \ref{fig:gainennzu} )このシステムはRubyを利用して
作成され，検索キーワードに関する情報はGoogleサジェストから取得している。
検索キーワードの表記ゆれや長い検索キーワードなどを入力した場合でも，情報を取得し
誰でも簡単に利用可能で，より多くの情報を取得することでキーワードの選定に向けたものとする。

\begin{figure}[htb]
	\centering
	\includegraphics[width=15cm]{gainennzu.pdf}
	\caption{キーワードマップ作成プログラムの流れ}
	\label{fig:gainennzu}
\end{figure}

% ------------------------第四章------------------------ %
\chapter{システムの設計}\label{cha:sekkei}
本章では，システムの設計を行う。

\section{システムの全体構成}
本システムはRubyで作成する。Rubyは文字列の正規表現処理に優れており，形態素解析した検索キーワードの


\section{使用技術/開発環境}
本節では本システムで使用する技術についてまとめる。

\subsection{Ruby}
Rubyはまつもとゆきひろによって開発されたオブジェクト指向のプログラミング言語である。国産の
プログラミング言語としては日本初の国際電気標準会議において国際規格に認証されている。特徴として
クラス定義，ガベージコレクション，強力な文字列操作や正規表現処理，マルチスレッド，例外処理機能，
イテレーターとクロージャ，Mixin，演算子オーバーロードなどの機能がある。
Ruby は本システム内の検索キーワードの正規表現処理と検索サジェストの取得するプログラムとして
利用する。本研究で用いるRubyのバージョンはruby 2.7.0 を用いる。

\subsection{MeCab}
MeCabは京都大学情報学研究科と日本電信電話株式会社コミュニケーション科学基礎研究所の共同
ユニットプロジェクトを通じて，開発されたオープンソースの形態素解析エンジンである。言語，辞書，コーパス
に依存しない汎用的な設計方針を採用しており，数多くのプログラミング言語で使用することが可能である。
MeCabによる形態素解析の実行結果は，入力した自然分を形態素にまで分解した後にそれぞれ
表層形，品詞，品詞細分類1，品詞細分類2，品詞細分類3，活用型，活用形，原形，読み，発音という流れで出力される。
本システムでは，MeCabによる形態素解析の出力結果をRubyのプログラム内で利用するためにMeCab-Rubyを用いる。

\begin{itembox}[l]{MeCabによる形態素解析の例}
	\begin{verbatim}
		~$ mecab
		この文章を形態素解析します
		この	連体詞，*，*，*，*，*，この，コノ，コノ
		文章	名詞，一般，*，*，*，*，文章，ブンショウ，ブンショー
		を	助詞，格助詞，一般，*，*，*，を，ヲ，ヲ
		形態素	名詞，一般，*，*，*，*，形態素，ケイタイソ，ケイタイソ
		解析	名詞，サ変接続，*，*，*，*，解析，カイセキ，カイセキ
		し	動詞，自立，*，*，サ変・スル，連用形，する，シ，シ
		ます	助動詞，*，*，*，特殊・マス，基本形，ます，マス，マス
		EOS \end{verbatim}
	\end{itembox}

\subsection{Graphviz}
Graphiviz(Graph Visualization Software)はAT\&T研究所によって開発されたオープンソースのグラフ画像作成ツールである。
データ記述言語の一種で，グラフをデータ構造としてプレーンテキストで表現する言語であるDOT言語を用いて，
テキストファイルをpngやjpegなどの画像ファイルに変換することで，グラフ画像を生成することができる。
本システムでは，入力された検索キーワードと取得した検索サジェストのデータをキーワードマップの画像として生成するために
用いる。また，RubyのコードからGraphvizによるグラフ生成を可能にするためにGvizを用いて画像を生成する。



% ------------------------第五章------------------------ %
\chapter{システム開発}
 \ref{cha:sekkei} 章を元にシステム開発を行う。

\section{検索キーワードの入力と形態素解析}\label{sec:gets}
検索キーワードを入力し，その検索キーワードの形態素解析を行う。
getsメソッドを使用し，キーワードマップとして生成するための核となる検索キーワードを文字列として
キーボードからのデータ入力を可能にする。取得したデータをもとに
MeCab::Taggerクラスのインスタンスを取得し，parseメソッドを使用することで形態素解析の結果を文字列で取得する。
形態素解析の結果はそれぞれ表層形と形態素解析の結果である文字列が
品詞，品詞細分類1，品詞細分類2，品詞細分類3，活用型，活用形，原形，読み，発音という順番で出力され，最後にEOSと出力される。
検索キーワードとして利用する箇所は原形・読み・発音の三種類である。これらを組み合わせて表記揺れや誤表記に対応した検索キーワード
生成する。これらの要素を文字列から抽出し，利用するために表層形とそれ以外の文字列というように二種類の文字列に分割する必要がある。
全ての文字列を分割し配列に要素を入れるためにsplitメソッドを用いる。


\begin{itembox}[l]{検索キーワードの形態素解析}
	\begin{verbatim}
		sentence = gets.chomp
		tagger = MeCab::Tagger.new
		keyword = tagger.parse sentence
		array = keyword.split
		array2 = keyword.split
		\end{verbatim}
	\end{itembox}

\section{検索キーワードの構築}\label{sec:key}
本節では形態素解析した文字列を検索キーワードとして再構築するコードの処理について説明する。
 \ref{sec:gets}節で行った処理から検索キーワードとして利用するために
検索キーワードを形態素解析した情報の入った配列arrayから不必要な情報を抽出する必要がある。
不必要となる情報は形態素解析の結果の品詞，品詞細分類1，品詞細分類2，品詞細分類3，活用型，活用形の部分と文字列のEOSである。
EOSはdeleteメソッドを用いて，文字列のEOSをマッチさせることで配列arrayから除外する。
形態素解析の結果の品詞，品詞細分類1，品詞細分類2，品詞細分類3，活用型，活用形の部分は正規表現を用いる。
原形はMeCabの辞書とマッチした表層形と同じ文字列で出力されるため，正規表現で表層形の文字列を指定して原形以降の文字列を抽出し，
それ以前の文字列は配列arrayから除外する。同じ文字列と区切り文字はsplitメソッドとuniqメソッドを利用することで除外する。
また，検索キーワードに存在しない単語やMeCabの辞書に未登録の単語を入力した場合は形態素解析の結果として原形が出力されないために
表層形と同じ文字列をその要素に入れる処理を行う。

これらの処理を行った配列arrayから表層形の文字列を除外する処理を行う。表層形の文字列は配列arrayの奇数番目に位置する要素であるために
each\_sliceメソッドとmapメソッドを利用して，奇数番目の要素を抽出し，除外する。
injectメソッドとmapメソッドを利用して配列array内に残った要素同士で総当りで組み合わせの配列を生成し，
その配列内の要素をjoinメソッドによって結合することによって表記揺れや誤表記に対応された検索キーワードが生成される。


\begin{itembox}[l]{検索キーワードの生成のコード}
	\begin{verbatim}
array.delete("EOS")
i = 0
(array.length/2).times do
if /#{array[i]}/ =~ array[i+1]
   array[i+1] = array[i]+$'
   array[i+1] = array[i+1].split(/[，|\/]/)
   array[i+1] = array[i+1].uniq
   i += 2 
else
   array[i+1] = [array[i]]
   i += 2
end
end

i = 0
array = array.each_slice(2).map(&:last)
if array.length > 1
array = array.inject(:product).map(&:flatten)
array.length.times do
array[i] = array[i].join()
    i += 1
end
else 
    array= array[0]
end
		\end{verbatim}
	\end{itembox}


\section{検索サジェストの取得}\label{sec:suggest}
本節では検索サジェストの取得とそれのセカンドキーワードの取得について説明する。
本システムでは検索サジェストとしてGoogleサジェストを取得する。Googleサジェストの取得にはGoogle Suggest APIを利用する。
Google Suggest APIは下記のURL末尾にサジェストを取得したい検索キーワードを入力すると，XML形式で検索サジェストが
取得できるAPIである。(図 \ref{fig:gglapi} )


\begin{itembox}[l]{Google Suggest API}
	\begin{verbatim}
		url = "https://www.google.com/complete/search?hl=ja&output=toolbar&q=#[検索キーワード]"
		\end{verbatim}
	\end{itembox}

\begin{figure}[htb]
		\centering
		\includegraphics[width=15cm]{googleapi.pdf}
		\caption{Google Suggest APIのサジェスト取得画面}
		\label{fig:gglapi}
\end{figure}

XML形式で取得したデータはURI.openメソッドを用いて，文字列としてruby内に読み込む。
RubyでXMLから目的の要素を取り出す処理を行うためにremxlライブラリを利用する。
DOMの子要素を取り出すelementsメソッドで不必要な要素を指定することで検索サジェストのみを抽出し，配列suggestにその結果を
格納する。
これらの処理を \ref{sec:key} 節で生成した検索キーワードの要素の数だけ繰り返し，全ての検索サジェストを抽出する。
同じ検索サジェストはuniqメソッドを用いることで配列suggestから除外する。

セカンドキーワードの取得は検索サジェストの取得で行った処理と同様に取得した検索サジェストをもとに行うことによって
取得する。


\begin{itembox}[l]{検索サジェスト取得の処理}
	\begin{verbatim}
		saggest = Array.new
		array.length.times do
		key = array[i]
		url = "https://www.google.com/complete/search?hl=ja&output=toolbar&q=#
		{Addressable::URI.encode(key)}"
		response = URI.open(url)
		response.charset
		encoded = response.read.encode('UTF-8'， response.charset)
		doc = REXML::Document.new(encoded)
		doc.elements.each('toplevel/CompleteSuggestion/suggestion') do |e|
		saggest[j] = e.attributes['data']
		j += 1
		end
		i += 1
		end
		suggest = suggest.uniq
		\end{verbatim}
	\end{itembox}


\section{キーワードマップの生成}
本節では \ref{sec:suggest} 節で取得した検索サジェストをデータをもとにキーワードマップを生成するコードの処理について説明する。
キーワードマップの生成はGvizを用いて行う。
キーワードマップの設定としてglobal layoutメソッドを利用することでキーワードマップのレイアウト・ファイル名・フォントサイズ・ノードの重なりなどの
設定を行うことができる。ノードとはグラフ内における丸や点で表される頂点となるものである。
キーワードマップをより見やすくするために，レイアウトは環状型にしてノード同士が重ならない設定にする。

キーワードマップの中心となる検索キーワードとそれに関連するキーワードの設定を行う。作成するキーワードマップは
検索キーワードを中心のノードとして環状型に関連キーワードのノードが展開されるマップである。
中心に位置するノードに検索キーワードを表示するために，nodeメソッド内のlabelに \ref{sec:gets} 節で入力された変数sentenceを設定する。
同様に関連キーワードとなるノードは前節で取得した検索サジェストの要素が入った配列suggestを設定する。
routeメソッドを用いて，検索キーワードとなる中心ノードから関連キーワードのノードへと接続するエッジを表示させる。
エッジはグラフ内におけるノード間の接続を表す役割を持った線である。
これらの設定を検索サジェストの全要素で行い，同様の設定を検索サジェストと前節で取得した全てのセカンドキーワードをもとに行う。
全ての処理を終えるとキーワードマップが生成される。

\begin{itembox}[l]{キーワードマップの設定コード}
	\begin{verbatim}
		gv = Gviz.new
		gv.graph do
		global layout:'circo'， label:"#{sentence}"， fontsize:20， size:15， overlap:false
		node :"sentence"， {label:sentence}
		suggest.length.times do
		node :"suggest#{i}"， {label: suggest[i]} 
		route :"sentence" => [:"suggest#{i}"]
			suggest2[i].length.times do
			node :"suggest#{i}q#{j}"， {label: s[i][j]} 
		route :"suggest#{i}" => [:"suggest#{i}q#{j}"]
		j += 1
	    end
		i += 1
		j = 0
		end
		end
		gv.save( :keywordmap， :png )  
		\end{verbatim}
	\end{itembox}

\section{検索サジェストが取得できない場合の改善案}
本節では検索サジェストが取得できない場合に行う検索キーワードの整理について説明する。
文章のような長い検索キーワードはGoogle Suggest APIから検索サジェストを取得することができない場合がある。
この場合の改善案として，検索キーワードの形態素解析を行った際に取得した品詞の種類から名詞である単語のみを抽出し，
それを検索キーワードとして再度検索サジェストの取得処理を行う。


\begin{itembox}[l]{検索キーワードの整理}
	\begin{verbatim}
	if suggest.empty?
    v， x， z = 0， 0， 0 
    array3 = []
    array3[v] = []
    (array2.length/2).times do
    array3[v][x] = array2[z]
    x +=1
    z +=1
    array3[v][x] = array2[z]
    array3[v][x].sub!(/，.*/m，"")
    z +=1
    x = 0
    v +=1 
    if v < array2.length/2
    array3[v] = []
    end
    end
    array3.select! {|dt|
        dt.include?"名詞"
    }
    array3 = array3.transpose[0]
    array3 = array3.join(" ")
end
		\end{verbatim}
	\end{itembox}
\section{生成したキーワードマップ}
生成したキーワードマップは図 \ref{fig:keymap}である。
\begin{figure}[htb]
	\centering
	\includegraphics[width=15cm]{keymap.pdf}
	\caption{生成したキーワードマップ}
	\label{fig:keymap}
\end{figure}

\chapter{結論}
本章では，本研究の結論と今後の展望について述べる。

\section{結論}
本研究では，検索することが苦手な人に向けた形態素解析を用いた検索支援のキーワードマップを生成するRubyプログラムを作成した。
作成されるキーワードマップは検索に向かない検索キーワードを入力した場合でもキーワードマップとして生成されるため
検索することが苦手な人でも求める情報を取得することができる。

\section{今後の展望}
今後の展望として，検索サジェストを取得するためにキーワードマップの生成に時間がかかってしまう。また，作成されたキーワードマップ
は視覚的に見づらい部分があるためにより見やすいマップの生成を行っていく。


\begin{thebibliography}{99}
	\bibitem{先行研究1}  寺内 貴洋，吉田 典正， 齋藤 敏雄.“形態素解析を用いたトレンド情報の抽出と可視化システムの構築"

	\url{https://www.mlit.go.jp/common/000228861.pdf}， (参照 2022-12-11).

	\bibitem{先行研究2} 和田 伸一郎.“インタラクティブなデータ・ヴィジュアライゼーション・ツールを用いたTwitterデータクラスタ分析"

	\url{https://www.soumu.go.jp/main_content/000629037.pdf}， (参照 2022-12-18).

	\bibitem{keyseaech} keysearch Beta.“keysearch Beta"

	\url{https://kitsune-room.com/tools/keysearch/}， (参照 2022-12-11).

	\bibitem{OMUSUBI} おむすび.“おむすびキーワード"

	\url{http://omusubisuggest.appspot.com/}， (参照 2022-12-13).
\end{thebibliography}


\end{document}
