\documentclass[japanese]{jnlp_3.3}
\usepackage{jnlpbbl_2.2}
\usepackage[dvipdfmx]{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{url}
\usepackage{hangcaption_jnlp}
\usepackage{array}
%%%%\usepackage{udline}
%%%%\setulminsep{1.2ex}{0.2ex}
%%%%\let\underline=\ul
\allowdisplaybreaks


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% author's definition
\usepackage{multirow}
%%%%\usepackage{url}
%%%%\usepackage{caption}
%%%%\usepackage[dvipdfmx]{color}
\usepackage{calc}
\newcommand{\pre}[1]{\underline{#1}}
\newcommand{\post}[1]{\underline{#1}}
\newcommand{\typoex}[2]{
\begin{itemize}
\setlength{\leftskip}{1cm}
\item[入力誤り] #1
\item[訂正　　] #2
\end{itemize}
}
\newcommand{\systemex}[6]{
\begin{itemize}
\setlength{\leftskip}{1cm}
\item[#4] #1
\item[#5] #2
\item[#6] #3
\end{itemize}
}
\newcommand{\systemez}[8]{
\begin{itemize}
\setlength{\leftskip}{1cm}
\item[#5] #1
\item[#6] #2
\item[#7] #3
\item[#8] #4
\end{itemize}
}
\newcounter{typoegidx}
\setcounter{typoegidx}{1}
\newcommand{\typoeg}[2]{
\vspace{1zh}
\begin{itemize}
\item[(\thetypoegidx)]\mbox{}\vspace{-1.7zh}\typoex{#1}{#2}
\end{itemize}
\refstepcounter{typoegidx}
\vspace{1zh}
}
\newcommand{\typoexm}[4]{
\vspace{1zh}
\begin{itemize}\item[(\thetypoegidx)]\mbox{}\vspace{-1.7zh}
\begin{itemize}
\setlength{\leftskip}{1cm}
\item[#1] #3
\item[#2] #4
\end{itemize}
\end{itemize}
\refstepcounter{typoegidx}
\vspace{1zh}
}
\newcounter{x}
\newcommand{\relativeidx}[1]{(\setcounter{x}{\value{typoegidx}#1}\thex)}
\newcommand{\systemeg}[3]{
\vspace{1zh}
\begin{itemize}
    \item[(\thetypoegidx)]\mbox{}\vspace{-1.7zh}\systemex{#1}{#2}{#3}{入力誤り}{正解　　}{システム}
\end{itemize}
\refstepcounter{typoegidx}
\vspace{1zh}
}
\newcommand{\systemegy}[6]{
\vspace{1zh}
\begin{itemize}
    \item[(\thetypoegidx)]\mbox{}\vspace{-1.7zh}\systemex{#1}{#2}{#3}{#4}{#5}{#6}
\end{itemize}
\refstepcounter{typoegidx}
\vspace{1zh}
}
\newcommand{\systemegz}[8]{
\vspace{1zh}
\begin{itemize}
    \item[(\thetypoegidx)]\mbox{}\vspace{-1.7zh}\systemez{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}
\end{itemize}
\refstepcounter{typoegidx}
\vspace{1zh}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\Volume{28}
\Number{4}
\Month{December}
\Year{2021}
%%%%\Issuetitle{「　　　　」特集号}

\received{2021}{2}{26}
\revised{2021}{5}{31}
%%%%\rerevised{2006}{5}{6}
\accepted{2021}{7}{7}

\setcounter{page}{995}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\jsubject{一般論文}
\jtitle{日本語Wikipediaの編集履歴に基づく\\入力誤りデータセットと訂正システムの構築}
\jauthor{田中　　佑\affiref{Author_1} \and 村脇　有吾\affiref{Author_2} \and 河原　大輔\affiref{Author_3} \and 黒橋　禎夫\affiref{Author_2}}
\jabstract{%
文章執筆時に発生する誤字などの入力誤りは，解析誤りを誘発するため，入力誤り訂正を行うシステムは重要である．入力誤り訂正システムの実現には，学習データとして多量の入力誤りとその訂正ペアが必要であるが，公開されている十分なサイズを持つ日本語入力誤りデータセットは存在しない．これまで，Wikipediaの編集履歴からフランス語などで入力誤りデータセットが構築されてきた．先行研究の手法は，編集のあった単語の特定を必要とするため，単語分割が必要な日本語に直接の適用はできない．本研究では，Wikipediaの編集履歴から，単語単位ではなく，文字単位の編集を手がかりとして入力誤りの候補を取り出し，それらに対しフィルタリングすることで入力誤りを収集する．この手法で約70万文ペアの大規模なデータセットを構築し，さらに，構築手法を評価した．次に，得られたデータセットを用いて，入力誤り訂正システムを構築する．訂正システムは，事前学習seq2seqモデルを用い，入力誤り訂正のみを学習するシステムと，漢字の読みの推定を同時に学習するシステムを構築した．前者と比較して，後者は漢字の変換誤りの訂正において精度が向上した．また，学習データに疑似入力誤りデータを追加して学習し，その精度変化を見た．最後に，他の校正システムと入力誤り認識精度の比較を行い，本研究のシステムの精度が高いことを確認した．
}
\jkeywords{入力誤り，スペルミス，文法誤り，Wikipedia}

\etitle{Building a Japanese Typo Dataset and Typo Correction System Based on Wikipedia's Revision History}
\eauthor{Yu Tanaka\affiref{Author_1} \and Yugo Murawaki\affiref{Author_2} \and Daisuke Kawahara\affiref{Author_3} \and Sadao Kurohashi\affiref{Author_2}} 
\eabstract{%
Correcting typographical errors (typos) is important to mitigate errors in downstream natural language processing tasks. Although a large number of typo--correction pairs are required to develop typo correction systems, no such dataset is available for the Japanese language. Previous studies on building French and English typo datasets have exploited Wikipedia. To collect typos, the aforementioned methods apply a spell checker to words changed during revisions. As the lack of word delimiters in Japanese hinders the application of a spell checker, these methods cannot be applied directly to Japanese. In this study, we build a Japanese typo dataset from Wikipedia's revision history. We address the aforementioned problem by combining character-based extraction rules and various filtering methods. We evaluate our construction method using which we obtain over 700K typo--correction sentence pairs. Using the new dataset, we also build typo correction systems with a sequence-to-sequence pretrained model. As an auxiliary task for fine-tuning, we train the model to predict the readings of kanji, leading to a higher accuracy in the correction of erroneous kanji conversion. We also investigate the effect of pseudo training data. Finally, we demonstrate the higher accuracy achieved by our system for the typo recognition task compared with other proofreading systems.
}
\ekeywords{Typographical Error, Misspelling, Grammatical Error, Wikipedia}

\headauthor{田中，村脇，河原，黒橋}
\headtitle{日本語Wikipediaの編集履歴に基づく\\入力誤りデータセットと訂正システムの構築}

\affilabel{Author_1}{NTTコミュニケーションズ株式会社}{NTT Communications Corporation}
\affilabel{Author_2}{京都大学大学院情報学研究科}{Graduate School of Informatics, Kyoto University}
\affilabel{Author_3}{早稲田大学基幹理工学部}{School of Fundamental Science and Engineering, Waseda University}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\maketitle


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{はじめに}
\label{sec:introduction}

近年，SNS等で一般ユーザーが作成したテキスト (UGC; User Generated Contents) が自然言語処理の重要な研究対象となっている．
UGCには，書籍などの文章にはあまり見られない表現\cite{brody-diakopoulos-2011-cooooooooooooooollllllllllllll,saito-etal-2017-improving,blodgett-etal-2016-demographic,sasano-etal-2013-simple}が含まれ，誤字などの入力誤りも頻繁に発生している．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 1
\begin{figure}[b]
\begin{center}
\includegraphics{28-4ia3f1.pdf}
\end{center}
\hangcaption{入力誤りによる日英機械翻訳での翻訳失敗例．上の画像は正しい文，下の画像は入力誤りのある文を入力した場合を示す．}
\label{fig:misanalysis}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

入力誤りは，人がスムーズにテキストを読むことを妨げるだけではなく，計算機が正しく解析することを妨げる\cite{belinkov2018synthetic} ．
図\ref{fig:misanalysis}は，日本語から英語への機械翻訳における例である．
上の画像に示すように，正しい文を入力すると正しい翻訳結果が得られるのに対し，下の画像に示すように，赤線で示す入力誤りを含む文を入力した場合，翻訳に失敗する．
入力誤りを訂正するシステムがあれば，それを事前に適用することで，解析誤りを減らし，種々の解析精度向上が見込める．
そのため，入力誤り訂正システムは自然言語処理において重要である．

入力誤りは典型的にはキーボードの打ち間違いによるスペルミスだが，編集ミスによって発生する文法誤りも含まれる．
そのどちらの訂正においてもニューラルモデルは成功を収めており\cite{sakaguchi2017robsut,yuan-briscoe-2016-grammatical}，入力誤り訂正システムの構築に有望であると考えられる．
ニューラルモデルは多量の学習データを必要とすることが知られており\cite{koehn-knowles-2017-six}，ニューラル入力誤り訂正システムの実現には多量の入力誤りとその訂正ペアを用意することが重要である．

これまでフランス語\cite{max2010mining}，英語\cite{zesch2012measuring}のスペルミス訂正データセットは，Wikipediaの編集履歴から構築されてきた．
Wikipediaは，多くの人々が日々編集を行い，その編集履歴全てを公開しており，大規模なデータセット構築に適しているためである．
ただし，Wikipediaの編集履歴には，編集の分類の情報は必ずしも付与されていない．
そのため，先行研究では，スペルミス訂正のみを取り出すために，編集があった単語を特定し，スペルチェッカーを適用する等のフィルタリングを行って収集している．
このような先行研究の手法は，編集があった単語の特定が容易な，空白文字で単語が区切られているフランス語などの言語を前提としており，単語分割を必要とする日本語には直接適用できない．
また，フランス語や英語とは異なり，日本語では一般にインプットメソッドを用いてテキスト入力を行い，
漢字の入力には，かな漢字変換\cite{kasahara-etal-2011-error,yamamoto1997}を行う．
かな漢字変換では，目的の漢字の読みを入力し，提示されたその読みを持つ漢字のリストから目的の漢字を選択することで入力する．
この際に誤った漢字を選択した場合にも，入力誤りは発生する．
このような，かな漢字変換時の入力誤り（以後，誤変換と呼ぶ）は，先行研究の手法では対象とされていない．

本研究では，日本語の入力誤りとその訂正ペアをWikipediaの編集履歴から収集し，大規模なデータセット (JWTD; Japanese Wikipedia Typo Dataset) を構築することに取り組む．
本研究では，日本語書き言葉の文として編集前が不自然で編集後が自然となるような局所的な編集を，入力誤り訂正とみなす．
より具体的には，スペルミス訂正，文法誤り訂正，誤変換の訂正を入力誤り訂正として収集対象とする．
なお，Wikipediaでは，い抜き・ら抜きことば\footnote{\url{https://www.nhk.or.jp/kokokoza/tv/basickokugo/archive/basic_kokugo_20.pdf}}は頻繁に訂正されるが，これらも文法誤り訂正の一種とみなして収集対象とする．
Wikipediaの編集履歴には，入力誤り訂正のみでなく，内容の変更などの収集対象外の編集も数多く含むため，入力誤り訂正だけを取り出すことは容易ではない．
本研究では，文字単位の編集及び漢字の読みを手がかりとして入力誤り候補を取り出し，それらに対し言語モデルなどを用いてフィルタリングすることで，入力誤りを収集する．
この手法を用いて，約70万文規模のJWTDを構築した．
また，JWTDの構築手法を評価し，本手法の有効性を確認した．

続いて，本研究では，JWTDを用いて，入力誤り訂正システムを構築する．
ベースラインとなるシステムを，文法誤り訂正において高い精度を得たと報告されているニューラルモデル\cite{katsumata-komachi-2020-stronger}を用いて構築する．
ベースラインの他に，漢字の読みの推定を同時に学習するシステム，疑似データを学習に用いるシステムも構築し，比較を行う．
前者は，誤変換の訂正に役立つと考えられるため，後者は文法誤り訂正において有効であると報告されている\cite{kiyono-etal-2019-empirical}ためである．
JWTDを用いて学習した本研究の入力誤り訂正システム（ベースライン）と他の校正システムとで入力誤り認識において精度の比較を行い，本研究の訂正システムの精度が高いことを確認した．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{関連研究}
\label{sec:related_work}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{入力誤り}

入力誤りは大きく分けて人間に由来するものと，機械による自動認識に由来するものに分類できる．
前者はキーボードの打ち間違いによって発生するスペルミスや，非母語話者や編集ミスによって発生する文法誤り，
後者は光学文字認識 (OCR) や音声認識 (ASR) における認識誤りなどがあり，それぞれ訂正システムの研究がなされてきた\cite{sakaguchi2017robsut,yuan-briscoe-2016-grammatical,weko_12620_1,ERRATTAHI201832}．
本研究では，多くの場合文章入力時にはキーボードが用いられると想定し，スペルミスと文法誤りを対象として扱う．
また，特に母語話者の書いたテキストにおける入力誤りを対象として扱う．
そのため，文法誤りに関して本研究では，非母語話者によって発生する大きな訂正が必要な誤りではなく，母語話者の編集ミスによって発生するような些細な誤りを想定する．

Damerauはスペルミスを，deletion, insertion, substitution, transpositionの4カテゴリに分類している\cite{damerau1964technique}．
本研究では，誤変換も日本語においては代表的な入力誤りであると考え，Damerauの分類に対応するカテゴリ（脱字，衍字，誤字，転字）に誤変換を加えた5カテゴリの分類を用いる．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Wikipediaを利用した入力誤りデータセット}

Maxら\cite{max2010mining}はWikipediaの編集履歴からフランス語スペルミスデータセットを構築している．
彼らの手法は編集前と編集後の差分をとり，変化のあった単語対を取り出すというものである．
この方法は，編集のあった単語対が容易に特定できることを前提としている．
フランス語などの単語区切りが空白文字でなされている言語においては，編集された単語の特定は容易である．
しかし，単語分割の必要がある日本語などの言語では，スペルミスが単語分割に悪影響を及ぼすことで，結果として複数の単語の編集となる場合がある．
その場合，彼らの手法を日本語に直接適用するだけでは，単語分割に悪影響を及ぼす入力誤りを収集することはできない．
本研究では，このような入力誤りも収集できるように，単語単位ではなく文字単位の編集に着目した手法を用いる．

金山ら\cite{kanayama2011wiki}は日本語Wikipediaの編集履歴から編集パターンの抽出を行っている．
彼らは編集を，形式修正・表記修正・内容修正の3種類に分類し，その分類器を作成している．
このうち表記修正は，本研究で扱う入力誤り訂正に近いと考えられるが，両者は異なる．
「コンピュータ」と「コンピューター」などのカタカナ語表記を統一する編集を，彼らは表記修正として扱うが，これは編集前も編集後も日本語書き言葉の文として自然であるため，本研究では入力誤り訂正として扱わない．
そのため，彼らの分類器を入力誤り訂正の抽出に直接利用するのは難しい．
また，彼らのデータは公開されていない．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{公開されている日本語入力誤りデータセット}

公開されている日本語入力誤りデータセットに，GitHub Typo Corpus \cite{hagiwara2020github}がある． 
これはGitHub\footnote{\url{https://GitHub.com}}のcommitログから構築した多言語入力誤りデータセットである．
Hagiwaraらはcommitログ中の編集を，mechanical, spell, grammatical, semantic の4種類に分類し，このうち semantic を除く3種類の編集を入力誤りとして，分類器を学習し，それを用いることで，入力誤りデータを取り出している．
日本語データのサイズは1,500文ほどである．
その中には英単語のスペルミスも含まれているため，日本語の入力誤りに限定すると数はさらに少なく，ニューラルモデルの学習には十分なサイズではない．
そのため，本研究ではテストセットの1つとして利用することにした．

公開されている日本語スペルミスデータに，Babaらのものがある\cite{baba2012spelling}．
Babaらはクラウドソーシングでワーカーにテキストを書かせ，バックスペースを含むキーストロークの情報から英語と日本語のスペルミスデータを得て，スペルミスの頻度を調査している．
日本語データが公開されているが，単語単位で収集されている英語データと違い，単位が明確ではなく，1単語から複数の節まで幅があり，利用しづらい．
加えて，データはキーストローク情報であるアルファベット列であり，本研究の誤変換に相当するデータは含まれていない．

公開されている日本語文法誤りデータセットにNAIST Lang-8コーパスがある\cite{mizumoto-etal-2011-mining}．
これは言語学習者向けのWebサイトであるLang-8\footnote{\url{https://lang-8.com}}から構築した多言語文法誤りデータセットである．
日本語のデータサイズは約850,000文である．
Lang-8コーパスは非母語話者が生成したテキストから構築されているため，文の大部分が訂正されたものが含まれる．
本研究で収集する入力誤りに含まれる文法誤りは，助詞の誤りなどの編集距離の小さな，日本語話者によって書かれた文章でも見られるような文法誤りであり，その点でLang-8コーパスとは異なっている．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{入力誤り訂正システム}

かつては，OCRやASRも含め，入力誤り訂正はnoisy channel modelを用いた統計的機械翻訳の枠組みが主流であったが\cite{electronics9101670,brill-moore-2000-improved,weko_12620_1}，
近年では，ニューラルモデルを用いた手法が成功を収めている\cite{sakaguchi2017robsut,yuan-briscoe-2016-grammatical,8395234,ERRATTAHI201832}．

文法誤り訂正において成功を収めているニューラルモデルの一つにBART \cite{lewis-etal-2020-bart}がある．
BARTはTransformer \cite{vaswani2017attention}を用いたseq2seqモデルであり，大規模な生コーパスで事前学習した後に，各タスクでfine-tuningするモデルである．
BARTの事前学習はノイズに加えられたテキストを復元するタスクを行う．
現在，英語の事前学習済みモデルが公開されている\footnote{\url{https://github.com/pytorch/fairseq/tree/master/examples/bart}}．
KatsumataらはBARTを用いて英語の文法誤り訂正を行っており，事前学習済みBARTを文法誤り訂正タスクでfine-tuningするというシンプルな手法ながら，既存のSOTAに近い結果が得られたと報告している\cite{katsumata-komachi-2020-stronger}．
本研究では，ベースラインとして，同様に事前学習済みBARTを入力誤り訂正タスクでfine-tuningし，日本語入力誤り訂正システムを構築する．
また，多言語においてBARTと同様の事前学習をしたモデルとしてmBART \cite{liu2020multilingual}があり，日本語を含む25ヶ国語で事前学習したモデルが公開されている\footnote{\url{https://github.com/pytorch/fairseq/tree/master/examples/mbart}}．
Katsumataらが行った実験では，単言語で事前学習済みのBARTを用いた英語での結果と比べると，mBARTを用いたドイツ語などの言語での文法誤り訂正の精度は低かった．
そのため，本研究では，事前学習済みモデルとして公開されているmBARTを利用せず，日本語でBARTを事前学習し，それを用いて入力誤り訂正システムを構築する．

ニューラルモデルでは，学習データサイズを大きくすることで精度が向上する傾向がある．
そのため，実際のデータに似たデータ（疑似データ）を生成し，学習データに加える手法がこれまでなされてきており\cite{sennrich-etal-2016-improving}，スペルミス訂正\cite{li2018spelling}，文法誤り訂正\cite{kiyono-etal-2019-empirical}においても精度が向上したと報告されている．
本研究においても，疑似入力誤りデータを生成して，学習に用いる実験を行い，精度が向上するか確認する．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{大規模入力誤りデータセットJWTDの構築手法}
\label{sec:building_dataset}

日本語Wikipediaの編集履歴から入力誤りとその訂正文ペアを図\ref{fig:data_flow}に示す流れで収集し，JWTDを構築する．
まず，Wikipediaの編集履歴に前処理を行った後，マイニングを行い，入力誤りとその訂正文ペアの候補を取り出す．
その後，入力誤り訂正ではないと考えられる編集をフィルタリングすることで，JWTDの誤字・脱字・衍字・転字・誤変換の入力誤りデータを得る．
次に，得られた誤字・脱字・衍字・転字・誤変換の入力誤りデータを用いてBARTをfine-tuningし（\ref{sec:typo_correction_experiment}節で後述），得られたモデルの尤度を用いたフィルタリングを行って，JWTDのその他の入力誤りデータを得る．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 2
\begin{figure}[t]
\begin{center}
\includegraphics{28-4ia3f2.pdf}
\end{center}
\caption{JWTDの構築の流れ．}
\label{fig:data_flow}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Wikipediaの前処理}
\label{sec:preprocessing}

XMLダンプで配布されているWikipediaの編集履歴から入力誤りとその訂正文ペアを取り出すために，まず種々の前処理を行う．
1文内に編集のある文ペアを以下の方法で取り出す．
\vspace{1zh}
\begin{enumerate}
    \setlength{\itemsep}{-0.5zh}
    \setlength{\parskip}{-0.5zh}
    \item 全てのページの全ての版を含むXMLダンプのWikipediaの編集履歴から，編集コメントを取り出す．荒らしなどの不適切な編集を取り除くため，編集コメントを基にWikipediaの版全体から undo や revert されている版を特定し，それらを取り除く．\\
    \item Wikipedia特有のマークアップを取り除き，それぞれの版の本文テキストを取り出す．これにはWikiExtractor\footnote{\url{https://github.com/attardi/wikiextractor}}を用いる．
        ここで，パラグラフごとに改行されている本文テキストを1文ごとに改行する．\\
    \item それぞれのページのそれぞれの版でその直前の版と行単位でdiffをとり，1文の中に編集のある文ペアのみを取り出す．
        行単位のdiffにはPython3 difflibライブラリ\footnote{\url{https://docs.python.org/3/library/difflib.html}}を利用する．
        ここで編集後が10文字以下の文と200文字以上の文の場合その文ペアを取り除く．
        これは，短すぎる文は入力誤り訂正かどうかを判定するには文脈が不足しており，長過ぎる文は通常の文ではない可能性が高いためである．\\
    \item 「A$\to$B」，「B$\to$A」というように編集が循環している文ペアは，編集者の間で論争が起きている編集\footnote{\url{https://ja.wikipedia.org/wiki/Wikipedia:編集合戦}}である可能性がある．
        これらはいずれが適切な編集かを機械的に判断するのが難しいため，同一ページ内に編集が循環している文ペアが存在する場合，どちらも取り除く．
        また，「A$\to$B」，「B$\to$C」というように編集が推移している場合，Bはまだ不適切な文であると考えられる．
        そのため，同一ページ内に，このように編集が推移している文ペアが存在する場合，「A$\to$C」というように編集を統合した文ペアに変換する．
\end{enumerate}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{マイニング}
\label{sec:mining}

前節で得られた編集のある文ペアから，入力誤りとその訂正を有している可能性のある文ペアを取り出す．
対象の入力誤りは誤字・脱字・衍字・転字・誤変換の5カテゴリとする．
編集箇所が以下に示す条件を満たす文ペアを，それぞれのカテゴリとして取り出す．
ここで，1つの編集箇所が複数の条件を満たすことはない．
また，1つの文ペアが複数の編集箇所を持ち，それらが異なるカテゴリの条件を満たす場合，その文ペアは複数カテゴリとして取り出す．
\vspace{1zh}
\begin{description}
\item[誤字: 1文字の入れ替え]\mbox{}
    \begin{itemize}
        \item[(例)]\mbox{}\vspace{-1.8zh}
            \begin{itemize}
                \setlength{\leftskip}{1cm}
                \item[入力誤り]兄の部隊\pre{の}所属していた兵士でもあり、...
                \item[訂正　　]兄の部隊\post{に}所属していた兵士でもあり、...
            \end{itemize}
        \vspace{0.5zh}
        \item[条件]
            \renewcommand{\labelitemii}{\labelitemi}
            \begin{itemize}
                \setlength{\itemsep}{-0.5zh}
                \setlength{\parskip}{-0.5zh}
                \item 編集箇所における文字単位編集距離が1 \\
                \item 編集箇所の文字数変化が0 \\
                \item 編集のあった文字は編集前と編集後ともに，ひらがな又はカタカナ
            \end{itemize}
    \end{itemize}
\vspace{1zh}

\item[脱字: 1文字の抜け]\mbox{}
    \begin{itemize}
        \item[(例)]\mbox{}\vspace{-1.8zh}
            \begin{itemize}
                \setlength{\leftskip}{1cm}
                \item[入力誤り]...民間レスキュー組織をもっていること知られる。
                \item[訂正　　]...民間レスキュー組織をもっていること\post{で}知られる。
            \end{itemize}
        \vspace{0.5zh}
        \item[条件]
            \renewcommand{\labelitemii}{\labelitemi}
            \begin{itemize}
                \setlength{\itemsep}{-0.5zh}
                \setlength{\parskip}{-0.5zh}
                \item 編集箇所における文字単位編集距離が1 \\
                \item 編集箇所の文字数変化が$+$1 \\
                \item 挿入文字は，ひらがな又はカタカナ
            \end{itemize}
    \end{itemize}
\vspace{1zh}

\clearpage
\item[衍字]\mbox{}\begin{description}
    \item[(a): 余分な1文字の挿入]\mbox{}
        \begin{itemize}
            \item[(例)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                    \setlength{\leftskip}{1cm}
                    \item[入力誤り]特に免疫力の差などがそう\pre{う}である。
                    \item[訂正　　]特に免疫力の差などがそうである。
                \end{itemize}
            \vspace{0.5zh}
            \item[条件]
                \renewcommand{\labelitemii}{\labelitemi}
                \begin{itemize}
                    \setlength{\itemsep}{-0.5zh}
                    \setlength{\parskip}{-0.5zh}
                    \item 編集箇所における文字単位編集距離が1\\
                    \item 編集箇所の文字数変化が$-$1\\
                    \item 削除文字は，ひらがな又はカタカナ
                \end{itemize}
        \end{itemize}
    \vspace{1zh}

    \item[(b): 直前の文字列と一致する2文字以上の余分な文字の挿入]\mbox{}
        \begin{itemize}
            \item[(例)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                    \setlength{\leftskip}{1cm}
                    \item[入力誤り]高校在学中の１９６３年に虫プロに入社\pre{に入社}。
                    \item[訂正　　]高校在学中の１９６３年に虫プロに入社。
                \end{itemize}
            \vspace{0.5zh}
            \item[条件]
                \renewcommand{\labelitemii}{\labelitemi}
                \begin{itemize}
                    \setlength{\itemsep}{-0.5zh}
                    \setlength{\parskip}{-0.5zh}
                    \item 編集箇所がその直前もしくはその直後の文字列と一致する\\
                    \item 編集箇所の文字数変化が$-$1以下\\
                    \item 削除文字は，編集箇所の文字数変化が$-$1ならば漢字，$-$2以下ならばひらがな又はカタカナ又は漢字
                \end{itemize}
        \end{itemize}
    \end{description}
\vspace{1zh}

\item[転字: 隣接する2文字間の転置]\mbox{}
    \begin{itemize}
        \item[(例)]\mbox{}\vspace{-1.8zh}
            \begin{itemize}
                \setlength{\leftskip}{1cm}
                \item[入力誤り]現在の\pre{こと}ろ、大滝最後の新曲になっている。
                \item[訂正　　]現在の\post{とこ}ろ、大滝最後の新曲になっている。
            \end{itemize}
        \vspace{0.5zh}
        \item[条件]
            \renewcommand{\labelitemii}{\labelitemi}
            \begin{itemize}
                \setlength{\itemsep}{-0.5zh}
                \setlength{\parskip}{-0.5zh}
                \item 編集箇所における文字単位編集距離が2\\
                \item 編集箇所における文字単位ダメラウ・レーベンシュタイン距離\cite{damerau1964technique}が1\\
                \item 編集のあった文字は編集前と編集後ともに，ひらがな又はカタカナ
            \end{itemize}
    \end{itemize}
\vspace{1zh}
\item[誤変換]\mbox{}\begin{description}
    \item[(a): 同一の読みを持つ漢字の入れ替え]\mbox{}
        \begin{itemize}
            \item[(例)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                    \setlength{\leftskip}{1cm}
                    \item[入力誤り]まだ、全学全てが大学院に\pre{以降}していないため、...
                    \item[訂正　　]まだ、全学全てが大学院に\post{移行}していないため、...
                \end{itemize}
            \vspace{0.5zh}
            \item[条件]
                \renewcommand{\labelitemii}{\labelitemi}
                \begin{itemize}
                    \setlength{\itemsep}{-0.5zh}
                    \setlength{\parskip}{-0.5zh}
                    \item 編集箇所における編集前後の読みが一致\\
                    \item 編集のあった文字は編集前と編集後ともに，漢字を含む
                \end{itemize}
        \end{itemize}

            \vspace{0.5zh}
    \item[(b): 近い読みを持つ漢字の入れ替え]\mbox{}
        \begin{itemize}
            \item[(例)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                    \setlength{\leftskip}{1cm}
                    \item[入力誤り]交代\pre{龍}が戦死ではなく、「アメリカに旅立つため」...
                    \item[訂正　　]交代\post{理由}が戦死ではなく、「アメリカに旅立つため」...
                \end{itemize}
            \vspace{0.5zh}
            \item[条件]
                \renewcommand{\labelitemii}{\labelitemi}
                \begin{itemize}
                    \setlength{\itemsep}{-0.5zh}
                    \setlength{\parskip}{-0.5zh}
                    \item 編集箇所における編集前後の読みが，誤字または脱字または衍字 (a) または転字を含む\\
                    \item 編集のあった文字は編集前と編集後ともに，漢字を含む
                \end{itemize}
        \end{itemize}
    \end{description}
\end{description}
            \vspace{0.5zh}
編集箇所はJuman++ \cite{tolmachev-etal-2018-juman}\footnote{\url{https://github.com/ku-nlp/jumanpp}}の形態素単位での差分箇所とする．
差分の計算にはPython3 difflibライブラリを用いる．
ここで，差分箇所が隣接している場合はそれらをひとつに統合している．
そのため，単語分割を狂わせ，見かけ上複数単語の編集となる入力誤りも収集できる．
漢字の読みの解析にはJuman++とIPA辞書を用いたMeCab \cite{kudo-etal-2004-applying}\footnote{\url{https://taku910.github.io/mecab/}}を用い，どちらか一方において条件を満たせばよいことにする．
文字の種類（ひらがな・カタカナ・漢字）の判定には，Python3 regex\footnote{\url{https://pypi.org/project/regex/}}ライブラリを用いる．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{フィルタリング}
\label{sec:filtering}

前節のマイニングで得られた文ペアには，入力誤り訂正とは関係ないと考えられる編集も含まれる．
それらを取り除くため，以下の方法でフィルタリングを行う．


\vspace{+1zh}
\paragraph{品詞・形態素解析}
マイニングで得られた文ペアには，以下のような人名・時制・Wikipedia特有のスタイルに関する編集が多く見られる．


\typoexm{編集前}{編集後}{これに対し、若き科学者・芹沢大\pre{介}の発明したオキシジェン...}{これに対し、若き科学者・芹沢大\post{助}の発明したオキシジェン...}


\typoexm{編集前}{編集後}{白浜町に設置され\pre{る}インターチェンジは以下のようになる。}{白浜町に設置され\post{た}インターチェンジは以下のようになる。}

\typoexm{編集前}{編集後}{絵画\pre{と}は、基本的には、線や色彩をもちいて、物の形や姿を...}{絵画は、基本的には、線や色彩をもちいて、物の形や姿を...}

\relativeidx{-3}はフィクションでの登場人物の人名に関する編集，
\relativeidx{-2}は時制に関する編集，
\relativeidx{-1}はWikipediaで特に頻繁に見られたスタイル統一のための編集である．
これらは，文脈によっては編集後が内容として適切な文かもしれないが，この1文においては，編集前も編集後も書き言葉の文として自然である．
そのため，これらは入力誤り訂正ではないと考え，形態素解析器Juman++の解析結果を用いて取り除く．
編集箇所の解析結果に品詞細分類が人名であるものを含む場合，人名に関する編集として取り除く．
編集箇所の解析結果の原型が編集前後で同一であり，活用形が基本形とタ形のペアの場合，時制に関するものとして取り除く．
編集箇所が「と/は」と「は」のペアであり「と」の品詞が格助詞の場合，\relativeidx{-1}のようなスタイル統一の編集として取り除く．


\vspace{+1zh}
\paragraph{リダイレクトデータ}
マイニングで得られた文ペアには，記事内で用いる用語を統一するための編集が多く見られる．
\typoexm{編集前}{編集後}{１８４０年　－　ジョージ・ウォルフ、ペンシル\pre{バ}ニア州知...}{１８４０年　－　ジョージ・ウォルフ、ペンシル\post{ベ}ニア州知...}
「ペンシルバニア」「ペンシルベニア」のような単語は表記は異なるが，どちらも書き言葉の文として自然であり，この編集は入力誤り訂正ではないといえる．
Wikipediaではこのような単語を検索すると，どちらも同一ページに遷移するリダイレクト機能\footnote{\url{https://ja.wikipedia.org/wiki/Wikipedia:リダイレクト}}がある．
この情報を用いて，このような単語間での編集を含む文ペアを取り除く．

\vspace{+1zh}
\paragraph{言語モデル}
マイニングで得られた文ペアには，以上に挙げた以外にも，以下のような本研究の定義する入力誤りとは関係のない些細な編集が多い．

\typoexm{編集前}{編集後}{...を受けた後に大幹部に抜擢され\pre{て}、日本支部長に就任した。}{...を受けた後に大幹部に抜擢され、日本支部長に就任した。}
\typoexm{編集前}{編集後}{...て「フェニックス」を掲げ、新た\pre{に}都市開発に取り組んだ。}{...て「フェニックス」を掲げ、新た\post{な}都市開発に取り組んだ。}
また，記事によっては，日本語の通常の文ではない文字列で編集が見られることがある．
以下は，漢文の引用中で見られた編集である．
\typoeg{...數法日月星辰，敬授民時，分命羲仲居\pre{鬱}夷曰：暘谷，敬道日出，...}{...數法日月星辰，敬授民時，分命羲仲居\post{嵎}夷曰：暘谷，敬道日出，...}
このような文字列は，日本語文として編集前も編集後も不自然であるため，取り除くことが望ましい．

これらのような編集のパターンは無数に存在し，それらをフィルタリングするルールを包括的に記述するのは困難である．
そこで，BARTとLSTMモデルを用いて，2つの方法でフィルタリングを行い上記のような編集を取り除く．

1つ目は\ref{sec:typo_correction_experiment:pretraining}節で後述する事前学習済みBARTでの尤度をもとにフィルタリングを行う．
これは，\relativeidx{-3}，\relativeidx{-2}のような編集を持つ文ペアを対象としたフィルタリングである．
表\ref{table:vanilla_bart_lm_example}のように訂正箇所を[mask]トークンで置換した文を入力して，編集前・編集後の文が出力される尤度をそれぞれ計算する．
尤度が大きいほどその言語モデルにとってその文が自然なものであるといえるため，編集による尤度の増加が大きいものは入力誤り訂正である可能性が高いと考えられる．
それぞれの入力誤りの種類で閾値を定め，編集による尤度の差が閾値より小さい文ペアを取り除く．
ここで，衍字 (b)・転字・誤変換 (a) にはこのフィルタリングは行わない．
衍字 (b) においては精度が十分高い，転字においてはデータ量が少ない，誤変換 (a) においては「若干$\to$弱冠」などの高頻度語から低頻度語への正しい訂正が取り除かれるためである．
閾値は，\ref{sec:creating_gold_dataset}節で後述の入力誤り評価データの作成方法と同様の方法で収集した入力誤りかどうかのラベル付きデータ10,000文ペアを基に，F値を最大化するように決定する．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 1
\begin{table}[t]
\input{03table01.tex}
\hangcaption{「今日はいい【転機$\to$天気】だ。」を事前学習済みのBARTモデルで尤度計算する際に与える入出力．}
\label{table:vanilla_bart_lm_example}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2つ目は，訂正後の文を文字単位LSTM言語モデルに入力した際に出力される，文字単位尤度の平均をもとにフィルタリングを行う．
これは，\relativeidx{-1}のような文ペアを対象としたフィルタリングである．
文字単位LSTM言語モデルの学習データには日本語Wikipediaの最新ページ全てを使う．
編集後の文の文字単位尤度平均が小さい場合，編集後の文が不自然な文と考えられる．
閾値を定め，文字単位尤度平均が閾値より小さい文ペアを取り除く．
閾値はヒューリスティックに決定する．

以上の，品詞・形態素解析，リダイレクトデータ，言語モデルを用いたフィルタリングを通過したものを，誤字・脱字・衍字・転字・誤変換の入力誤りデータとする．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{その他の入力誤りデータ収集}
\label{sec:sonota_collecting}

前節までの方法は特定のカテゴリを対象として入力誤りを収集するため，収集できない入力誤りが存在すると考えられる．
例えば，誤字カテゴリでは文字単位編集距離が1である入力誤りのみを対象としており，編集距離2以上の誤字は収集できない．
また，編集距離2以上の編集は，編集距離1のものに比べて，入力誤り訂正以外の編集の割合が高いため，\ref{sec:mining}節のマイニングの編集距離条件を2以上に緩め，\ref{sec:filtering}節のフィルタリングを同様に行う方法では不十分な質のデータしか得られない．
そこで，編集距離2以上の誤字などの入力誤りの収集では，入力誤り訂正を学習したモデルを用いて，入力誤り訂正である可能性が高い編集をその他の入力誤りとして収集する．
この入力誤り訂正モデルには，誤字・脱字・衍字・転字・誤変換の入力誤りデータでfine-tuningしたBARTモデルを用いる（\ref{sec:typo_correction_task}節で後述）．
表\ref{table:finetuned_bart_lm_example}のように編集前の文を入力に与え，編集前・編集後の文が出力される尤度をそれぞれ計算する．
編集による尤度の増加が大きいものは，その編集が入力誤り訂正である可能性が高いと考えられる．
閾値を決めて，訂正による尤度の差が閾値より大きいものをその他として収集する．
閾値決定には，\ref{sec:creating_gold_dataset}節で後述の入力誤り評価データの作成方法と同様の方法で収集した入力誤りかどうかのラベル付きデータのうち，マイニング（\ref{sec:mining}節）を適用した際にふるい落とされる7,962文ペアを用いる．
適合率がフィルタリング（\ref{sec:filtering}節）までのデータセット構築手法の適合率（\ref{sec:dataset_eval_result}節で後述）以上であり，かつ，再現率を最大化するように閾値を決定する．
その他の収集対象例を以下に示す．
その他では，編集距離が2文字以上の誤字の他にも，漢字の脱字など様々なものが対象となる．
\vspace{1zh}
\begin{description}
    \item[その他]\mbox{}
        \begin{itemize}
            \item[(例1)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                        \setlength{\leftskip}{1cm}
                    \item[入力誤り]ダイオキシン類は、非意図的に発生\pre{しまう}物質であり、主に...
                    \item[訂正　　]ダイオキシン類は、非意図的に発生\post{する}物質であり、主に...
                \end{itemize}
                \vspace{1zh}
            \item[(例2)]\mbox{}\vspace{-1.8zh}
                \begin{itemize}
                        \setlength{\leftskip}{1cm}
                    \item[入力誤り]登場人については、魔導物語及びぷよぷよシリーズの...
                    \item[訂正　　]登場人\post{物}については、魔導物語及びぷよぷよシリーズの...
                \end{itemize}
        \end{itemize}
\end{description}
\vspace{1zh}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 2
\begin{table}[t]
\input{03table02.tex}
\hangcaption{「今日はいい【転機$\to$天気】だ。」を入力誤り訂正タスクでfine-tuning済みのBARTモデルで尤度計算する際に与える入出力．}
\label{table:finetuned_bart_lm_example}
\vspace{-1\Cvs}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{JWTDの分析と評価}
\label{sec:evaluating_dataset}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{JWTDの分析}

\ref{sec:building_dataset}章の手法を2019年6月の日本語Wikipediaに適用し，JWTDを構築した．
JWTDのデータサイズを表\ref{table:dataset_size}に示す．
ここで，複数カテゴリの入力誤りを有する文ペアはそれぞれのカテゴリで重複してカウントしている．
そのため，各カテゴリの文ペア数の合計と全ての文ペア数は一致していない．
合計約70万文ペアの入力誤りデータが得られた\footnote{データセットは \url{http://nlp.ist.i.kyoto-u.ac.jp/?日本語Wikipedia入力誤りデータセット} で公開している．}．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 3
\begin{table}[t]
\input{03table03.tex}
\caption{JWTDのサイズ．}
\label{table:dataset_size}
\vspace{-0.5\Cvs}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 4
\begin{table}[t]
\input{03table04.tex}
\hangcaption{上位10個の入力誤り（値は各カテゴリにおける総編集箇所数に対する\%）．「$\to$」は左から右への編集，「+」は追加する編集，「$-$」は削除する編集を表す．}
\label{table:typo_ranking}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

JWTDにおける各入力誤りの上位10個の訂正を表\ref{table:typo_ranking}に示す．
訂正の単位はJuman++で訂正前・後の文をそれぞれ形態素分割した形態素列での最小編集である．

脱字に「る$\to$いる」「+い」が見られるが，それらは主に以下のような，い抜きことばの訂正であった．

\typoeg{...基本的にＣＤデビューをしてない人を指す。}
{...基本的にＣＤデビューをして\post{い}ない人を指す。}
い抜きことばは話し言葉で用いられるが，書き言葉においては一般に不適切とされる．
百科事典であるWikipediaでは書き言葉が適切であり，\ref{sec:introduction}章で述べたように本研究ではい抜きことばも入力誤りとしている．

転字は他と違い，カタカナ文字での訂正が多い傾向が見られた．
また，表にあるような「シュミレーター$\to$シミュレーター」は，入力誤りによってではなく，前後の音が入れ替わる音位転換\cite{gengogakunyumon}と呼ばれる言語現象によって生じている可能性がある．
JWTDの転字は音位転換の言語資源としての活用も考えられる．

誤変換 (a) では，「製作$\to$制作」「運行$\to$運航」のように意味が似ている漢字間の訂正が見られた．
これらの漢字は使い分けの判断が難しく，また，入力誤りとは言えないものも含まれる．
また，誤変換 (b)では，「声優$\to$俳優」のように入力誤り訂正ではなく，意味的な訂正であると考えられるものが見られる．
このようなものを取り除くことは今後の課題である．

その他では，他のカテゴリがカバーしていない，「月$\to$年」といった漢字における誤字などや，「+する」といった2文字以上の脱字といった多様な入力誤りが収集できていることがわかる．

次にJWTDにおける各入力誤りでの品詞における上位5個の訂正を表\ref{table:typo_hinsi_ranking}に示す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 5
\begin{table}[t]
\input{03table05.tex}
\hangcaption{上位5個の品詞（値は各カテゴリにおける総編集箇所数に対する\%）．「$\to$」は左から右への編集，「+」は追加する編集，「$-$」は削除する編集を表す．
また，「(名詞, 名詞)」等は2形態素の編集があった場合のそれらの品詞を表す．}
\label{table:typo_hinsi_ranking}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

誤字・脱字・衍字 (a) の1位は助詞に関するものであった．
これより，JWTDは文法誤り訂正のデータも多く含んでいることがわかる．

誤字・転字に「未定義語$\to$名詞」が見られるが，これらは以下のような，カタカナ文字での編集が多かった．
\typoeg{マイクロソフトのエクセ\pre{ツ}などの商用ソフトウェアは、この...}{マイクロソフトのエクセ\post{ル}などの商用ソフトウェアは、この...}

\typoeg
{...本人の頭が一瞬だけ拡大で映ってしまうハプ\pre{ンニ}グが起きた。}
{...本人の頭が一瞬だけ拡大で映ってしまうハプ\post{ニン}グが起きた。}

また，誤字・転字・誤変換 (b)には「(名詞, 名詞)$\to$名詞」が見られる．
これらは入力誤りによって，Juman++の形態素解析における形態素数が変化した例である．
実例は以下である．

\typoeg
{...因島市の\pre{ヘ}ッドタウン的な立場であった。}
{...因島市の\post{ベ}ッドタウン的な立場であった。}

\typoeg{メモ付きのポ\pre{ロラ}イド写真}
{メモ付きのポ\post{ラロ}イド写真}

\typoeg
{モンスターズ　現代アメリカ\pre{決算句}短編集　Ｂ・Ｊ・ホラーズ編...}
{モンスターズ　現代アメリカ\post{傑作}短編集　Ｂ・Ｊ・ホラーズ編...}
それぞれの形態素単位の編集は，\relativeidx{-3}「ヘッド/タウン$\to$ベッドタウン」，\relativeidx{-2}「ポロ/ライド$\to$ポラロイド」，\relativeidx{-1}「決算/句$\to$傑作」であり，2形態素（単語）の訂正が行われたことになる．
複数単語に渡る入力誤り訂正は，単語分割の必要のないフランス語や英語での先行研究\cite{max2010mining,zesch2012measuring}では収集対象にされておらず，それらの手法では収集できないものである．

\subsection{クラウドソーシングによる評価\label{sec:evaluating_dataset:crowdsourcing}}
クラウドソーシングを用いて，JWTDの評価を行った．
評価対象はランダムに選んだ記事3,000ページ中から得られた文ペアを用いた．
同じ訂正が数多く存在しているページが存在したため，データの偏りを避けるために，選ばれたページ内に同一の訂正が4つ以上含まれていた場合，そのうちの3つのみをランダムに採用した．
評価対象となった文ペア数を表\ref{table:crwdsrc_eval_datasize}に示す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 6
\begin{table}[b]
\input{03table06.tex}
\caption{クラウドソーシングの評価対象データサイズ．}
\label{table:crwdsrc_eval_datasize}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{タスク内容}
\label{sec:task2}

編集前と編集後の文を同時に提示して，それぞれ書き言葉として自然かどうかを質問した．
このとき，提示する際は単に文A，文Bとして提示し，どちらが編集前か編集後かをわからないようにした．
選択肢は「Aは書き言葉として自然な文であるが，Bは不自然な文である」，「Bは書き言葉として自然な文であるが，Aは不自然な文である」，「どちらの文も自然である」，「どちらの文も不自然である」，「わからない」の5つとした．
それぞれの文ペアにつき10人のワーカーに回答してもらった．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{結果}

文ペアのうち，1つの選択肢が過半数の票を持つ編集を，その回答によって分類した．
過半数を超えている回答が「Aは書き言葉として自然な文であるが，Bは不自然な文である」もしくは「Bは書き言葉として自然な文であるが，Aは不自然な文である」の場合は，
編集前の文が不自然・編集後の文が自然という回答のとき「正しい訂正」，編集前の文が自然・編集後の文が不自然という回答のとき「間違った訂正」と分類した．
過半数を超えている回答が，「どちらの文も自然である」の場合「どちらも自然」，「どちらの文も不自然である」の場合「どちらも不自然」，「わからない」の場合「わからない」と分類した．
どの選択肢も過半数の票を持たないものは「その他」に分類した．
このようにして得られた分類結果を表\ref{table:new_dataset_crowdsourcing}に示す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 7
\begin{table}[t]
\input{03table07.tex}
\caption{クラウドソーシングによるJWTD評価結果（値は\%）．}
\label{table:new_dataset_crowdsourcing}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ここで，過半数を超えている回答が，編集前の文が不自然・編集後の文が自然という回答のペアを「正しい訂正」，編集前の文が自然・編集後の文が不自然という回答のペアを「間違った訂正」と分類している．

全体では72.7\%のペアが「正しい訂正」と分類された．
脱字の「どちらも自然」が19.7\%と他と比較して高いが，このうち27.2\%が以下のような「の」の抜けであった．

\typoeg{播磨国龍野藩１０代（最後）藩主。}
{播磨国龍野藩１０代（最後）\post{の}藩主。}
「の」の抜けの編集は，「どちらも自然」に分類されたものが44.6\%に対して，以下の\relativeidx{+0}のような「正しい訂正」に分類されたものも37.9\%あり，「の」の抜けが入力誤りであるかどうかは，文脈によるといえる．

\typoeg{...降伏条件の実施ため必要と認める措置を執る...}
{...降伏条件の実施\post{の}ため必要と認める措置を執る...}
このような「どちらも自然」な編集を取り除く方法として，\ref{sec:filtering}節の言語モデルフィルタの改良などの方法が考えられ，今後の課題である．

転字の「わからない」「その他」の割合が他より高い．
転字では，以下のようなカタカナ文字での編集が多く，入力誤りかどうかの判断には知識が必要とされるためだと考えられる．
\typoeg{六本木一丁目にあるカリーヴ\pre{スル}トを食べられるインビス}
{六本木一丁目にあるカリーヴ\post{ルス}トを食べられるインビス}
これらの中には例のような，「正しい訂正」と分類されるべきものも多く見られたため，転字の「正しい訂正」の実際のスコアは表よりも高い可能性がある．

誤変換 (a) は「その他」の割合が高いことから，ワーカーの判断が分かれていることがわかる．
これは，誤変換 (a) の訂正は他と違い漢字の知識を必要とするためだと考えられる．
また，誤変換 (a) の「間違った訂正」と分類された中には以下の\relativeidx{+0}のような「正しい訂正」とされるべきものが含まれていた．
そのため，誤変換 (a) の「正しい訂正」の実際のスコアは表よりも高い可能性がある．

\typoeg{ＥＳＩＥは\pre{若干}２０歳にして単なるアーティストではなく...}
{ＥＳＩＥは\post{弱冠}２０歳にして単なるアーティストではなく...}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{入力誤り評価データによる評価}

\ref{sec:building_dataset}章の手法で構築したJWTDは主に特定のカテゴリの入力誤りを対象として収集するため，収集から漏れた入力誤りが存在すると考えられる．
そのため，適合率だけではなく再現率も含めた評価を行うことが望ましい．
再現率を評価するためには，カテゴリの制限のない網羅的な入力誤りデータが必要である．
そのような入力誤りデータを収集し，それを用いてJWTD構築手法を評価した．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{入力誤り評価データの作成}
\label{sec:creating_gold_dataset}

クラウドソーシングを用いて網羅的に入力誤りデータを収集し，それを入力誤り評価データとした．
クラウドソーシングに用いたデータは，\ref{sec:preprocessing}節で取り出した編集箇所を持つ文ペアからランダムに選んだ11,000文ペアである．

%%%%\vspace{1zh}
\paragraph{タスク内容\label{sec:creating_gold_dataset.task}}
質の良い評価データを作るために，2段階の方法でクラウドソーシングを行った．
どちらもそれぞれ5人のワーカーに回答してもらった．

1段階目のタスクは，編集がどのような編集かを分類するタスクである．
編集前と編集後の文を提示して，「内容の変更・追加・削除」，「表現の変更・追加・削除」，「誤字・脱字・衍字・漢字の変換ミスの修正」，「その他・わからない」の4つの選択肢の中から1つ選んでもらった．
「誤字・脱字・衍字・漢字の変換ミスの修正」が過半数を得た文ペアを入力誤りに関係するペアとし，2段階目のタスクの対象データとした．

2段階目のタスクは\ref{sec:task2}節のタスクと同じく，編集前後の文が自然かどうかを問うタスクである．

%%%%\vspace{1zh}
\paragraph{結果}
1段階目のタスクにおいて，「誤字・脱字・衍字・漢字の変換ミスの修正」が過半数を占めた文ペアは1,773個であった．
それらを対象に行った2段階目のタスクで，編集前の文が不自然・編集後の文が自然という回答が過半数を占めた文ペアは1,127個であった．
この1,127個の文ペアを入力誤り評価データとした．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{評価結果}
\label{sec:dataset_eval_result}

入力誤り評価データを含む，\ref{sec:creating_gold_dataset}節でクラウドソーシングに用いた11,000文ペアに対し，\ref{sec:building_dataset}章の手法を適用してJWTDの構築手法を評価した．
JWTD構築手法を適用して得られた文ペアを$J$，入力誤り評価データを$G$とし，$|J \cap  G|/|J|$を適合率，$|J \cap  G|/|G|$を再現率として計算する（$|X|$はXの文ペア数を表す）．
結果を表\ref{table:eval_building_dataset_method_with_gold}に示す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 8
\begin{table}[b]
\input{03table08.tex}
\caption{データセット構築手法の評価（適合率・再現率・F値の値は\%）．}
\label{table:eval_building_dataset_method_with_gold}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

JWTDの構築手法の評価結果は適合率73.4\%，再現率62.4\%となった．
また，表からマイニング，フィルタリング，その他カテゴリの入力誤りの収集を経ることで，F値が向上していることが確認できる．

入力誤り評価データのうち，JWTDの構築手法で取り出せなかったものは，\ref{sec:filtering}節の事前学習済みBARTモデルを用いたフィルタによって取り除かれたものが多かった．
実際，表\ref{table:eval_building_dataset_method_with_gold}のマイニング後とフィルタリング後の間での，再現率低下の70\%がBARTモデルフィルタによるものであった．
以下にBARTモデルフィルタによって取り除かれた入力誤り例を示す．
\vspace{1zh}
\typoeg{...売買を阻止、地域の健康プログラム\pre{を}支援と、自身の縄張り...}{...売買を阻止、地域の健康プログラム\post{の}支援と、自身の縄張り...}
一方で，BARTモデルを用いたフィルタは以下の\relativeidx{+0}のような入力誤り訂正ではない編集を取り除くことで，適合率の向上に大きく貢献している．
実際，表\ref{table:eval_building_dataset_method_with_gold}のマイニング後とフィルタリング後の間での，適合率向上の88\%がBARTモデルフィルタによるものであった．
\typoexm{編集前}{編集後}{...のでは」との憶測を抱いたファン\pre{が}多かったらしく、鈴木自...}{...のでは」との憶測を抱いたファン\post{は}多かったらしく、鈴木自...}
BARTモデルフィルタは適合率の向上とともに再現率の低下をもたらしており，その再現率の低下を抑えることが今後の課題といえる．

また，数は少ないながら，以下のような漢字の読みに関するもの\relativeidx{+0}，似た見た目の漢字\relativeidx{+1}の入力誤りもJWTDの構築手法では取り出せていなかった．
このような入力誤りは，\ref{sec:sonota_collecting}節のその他カテゴリの収集に用いるモデルを改良することによって，収集できる可能性があり，今後の課題である．
\typoeg{米津玄師（\pre{こめつ} けんし、１９９１年（平成３年）３月１０日－）...}
{米津玄師（\post{よねづ} けんし、１９９１年（平成３年）３月１０日－）...}
\typoeg{ＢＩＭの中に空気や\pre{鹿}が吸い込まれていく真空モードに入る。}{ＢＩＭの中に空気や\post{塵}が吸い込まれていく真空モードに入る。}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{入力誤り訂正システム}
\label{sec:typo_correction_method}

本研究では入力誤り訂正システムに用いるニューラルモデルとして，seq2seq事前学習モデルBARTを採用する．
BARTを日本語テキストで事前学習し，その後，JWTDを用いた入力誤り訂正タスクでfine-tuningすることで，入力誤り訂正システムを構築する．
本研究では入力誤り訂正タスクのみでfine-tuningする方法の他に，fine-tuning時に漢字の読みの推定を同時に学習を行う方法，fine-tuning時にJWTDに加えて疑似データを用いて学習する方法を提案する．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 9
\begin{table}[b]
\input{03table09.tex}
\hangcaption{「A B C . D E .」に対してBARTの事前学習タスクのノイズを加えた例（＿はmaskトークンを表す）．}
\label{table:bart_pretraining}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{BART}

BARTはTransformerをベースとしたseq2seq事前学習モデルである．
事前学習モデルは，大規模な生コーパスで自己教師学習を行い（事前学習），その後目的のタスクでfine-tuningを行うモデルである．
seq2seqモデルであるBARTの他には，言語モデルのBERT \cite{devlin-etal-2019-bert}などがある．
BARTで行う事前学習のタスクは，ノイズを加えられたテキストから元のテキストを生成するものであり，token masking，token infilling，token deletion， sentence permutation， document rotation の5種類がある．
例を表\ref{table:bart_pretraining}に示す．
token maskingとtoken infillingはテキスト内のトークンをmaskトークンに置き換えるノイズである．
両者の違いは，前者は1個のトークンを1個のmaskトークンに置き換え，後者は0個以上のトークンを1個のmaskトークンに置き換える点である．
token deletionはトークンを削除するノイズ，sentence permutationは文章中の文を入れ替えるノイズ，document rotationは文章を転回させるノイズである．
Lewisら\cite{lewis-etal-2020-bart}がNLIなどのいくつかのタスクでBARTをfine-tuningした実験では，text infillingのみで事前学習を行ったモデル，text infilling と sentence permutation で事前学習を行ったモデルの精度が高かった．
本研究では，本研究の入力誤り訂正タスクは1文単位で行うことから，sentence permutationのノイズは不必要であると考え，text infillingのみで事前学習をする．
また，本研究では事前学習済みBARTをJWTDの入力誤り訂正タスクでfine-tuningしたものをベースラインとする．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{読み推定の同時学習}
\label{sec:yomi_multitask}

本研究で扱う入力誤りのうち，誤変換は漢字の読みが同一または近い誤りである．
そのため，漢字の読みの情報は，誤変換の訂正に役立つことが予想される．
本研究では，入力誤り訂正タスクと同時に漢字の読みを推定するタスクを学習する手法を提案する．
漢字の読みを推定するタスクは，原文からその読みを出力するタスクと原文の読みから元の原文を出力するタスクの2種類とする．
表\ref{table:bccwj_input}に原文からその読みを出力するタスクの例を示す．
それぞれ及びそれら両方のタスクを入力誤り訂正タスクとを同時に学習するモデルを作成し，ベースラインと精度比較する．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 10
\begin{table}[b]
\input{03table10.tex}
\caption{原文から読みを出力する漢字の読み推定タスクの入出力例．}
\label{table:bccwj_input}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{疑似データ}
\label{sec:pseudo_data}

ニューラルモデルはデータを増やすと精度が向上する傾向があり，文法誤り訂正や機械翻訳ではデータセットサイズを大きくするために，疑似的なデータを生成し，そのデータを学習データに加える手法が成功を収めている．
疑似データを生成する代表的な手法に，逆翻訳\cite{sennrich-etal-2016-improving}がある．
逆翻訳は，原言語から目的言語への変換である翻訳の学習において，原言語と目的言語の対データサイズが小さいが，目的言語のデータは十分にある場合に用いられる手法である．
翻訳とは逆向きである，目的言語から原言語への変換を学習したモデルを用いて，目的言語データから原言語データを生成し，それらを疑似的に原言語と目的言語の対データとすることで，翻訳の学習データサイズの拡張を行う．

本研究でも，疑似データを作成し，学習データサイズを増やすことによって精度が向上するかを確認する．
疑似データは，ランダムに入力誤りを生成する方法と，逆翻訳によって生成する方法で生成する．
以下に同一の文から前者で生成した入力誤り\relativeidx{+0}と後者の方法で生成した入力誤り\relativeidx{+1}の例を示す．
\typoeg{...ナカムラ大統領の手腕が試され\pre{ぴ}大事な新年がスタートした}{...ナカムラ大統領の手腕が試され\post{る}大事な新年がスタートした}
\typoeg{...ナカムラ大統領\pre{が}手腕が試される大事な新年がスタートした}{...ナカムラ大統領\post{の}手腕が試される大事な新年がスタートした}
このように，ランダムに生成するデータは多様なデータであり，逆翻訳で生成するデータは実際の入力誤りらしいデータである．
このような2種類の疑似データをJWTDに加えて，学習を行う．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{入力誤り訂正システム実験}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{実験設定}
\label{sec:typo_correction_experiment}

JWTDを利用して，入力誤り訂正システムの実験を行った．
BARTを事前学習し，JWTDを用いて，入力誤り訂正タスクでfine-tuningする．
JWTDの入力誤り訂正タスクのみを学習するモデル（ベースライン），JWTDの入力誤り訂正タスクと漢字の読み推定タスクを同時に学習するモデル（読みの同時学習），JWTDに加え疑似データを用いて入力誤り訂正タスクを学習するモデル（疑似データ）を
作成し，これら3つのモデルで精度比較を行った．
また，ベースラインとMicrosoft Word等の他の校正システムとで精度比較を行った．
精度比較は，入力誤りのカテゴリごとでの性能，カテゴリを限定しない入力誤り全般での性能，入力誤りを含まない文において不必要な編集を行わないかの3種類の観点で行った．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{BARTの事前学習}
\label{sec:typo_correction_experiment:pretraining}

BARTモデルを日本語テキストで事前学習した\footnote{事前学習済みモデルは \url{http://nlp.ist.i.kyoto-u.ac.jp/?BART日本語Pretrainedモデル} で公開している．}．
公開されている事前学習済みBARTモデルは英語のみである．
また，日本語を含む多言語で事前学習したmBARTが公開されているが，本研究のタスクでは日本語以外の言語の情報は必要なく，加えて，mBARTの日本語分割基準は我々とは異なり不整合が生じる．
そのため，独自に日本語で事前学習した．
事前学習の学習データには，日本語Wikipediaの約1,800万文を用いた．
トークン単位は，テキストをJuman++で形態素分割した後にそれらをsubword分割\cite{sennrich2016neural}したものを用いた．
subword分割にはSentencePiece \cite{kudo2018sentencepiece}を利用し，語彙サイズは32,000とした．
事前学習ではtext infillingタスクを行った．
encoderとdecoderがそれぞれ6層のモデル (base) とそれぞれ12層のモデル (large) で事前学習した．
隠れ層の次元は，baseは768，largeは1,024である．
バッチサイズは512とし，baseでは50万step，largeでは25万step学習した．
事前学習にWikipediaを利用したため，入力誤り訂正評価に用いる，入力誤り評価データと\ref{sec:typo_correction_task}節で後述のJWTDテストセットのデータの一部が事前学習データにリークしていると考えられる．
そのため，これらのデータを用いた評価は厳密な評価ではないことに注意されたい．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{入力誤り訂正タスク}
\label{sec:typo_correction_task}

入力誤り訂正タスクでは，JWTDを以下のように学習・検証・テストセットの3種類に分割して得た，学習・検証セットを用いて，各カテゴリの入力誤りデータ，及び，全ての入力誤りデータでfine-tuningを行う．

まず，\ref{sec:evaluating_dataset:crowdsourcing}節の評価で正しい訂正と分類された文ペアをJWTD テストセットとする．
次に，JWTDから，JWTD テストセット・入力誤り評価データ（\ref{sec:creating_gold_dataset}節）を含む記事ページから得られた文ペアを取り除く．
それらのうち，それぞれのカテゴリで1,000文ペアを検証セットとし，他を学習セットとする．
なお，このような分割により，学習に用いるJWTDの学習・検証セットと，評価に用いるJWTD テストセット・入力誤り評価データは，どちらもWikipediaが収集元であるものの，収集元の記事ページは異なる．
また，JWTD テストセットはカテゴリごとに分類された入力誤りデータであるため，入力誤り訂正のカテゴリごとの評価が可能である点が，入力誤り評価データと異なる．
JWTDの学習・検証・テストセットのサイズを表\ref{table:finetuning_datasize}に示す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 11
\begin{table}[b]
\input{03table11.tex}
\caption{JWTDの学習・検証・テストセットサイズ}
\label{table:finetuning_datasize}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{漢字の読みの推定タスク}

漢字の読み推定タスクでは，
\pagebreak
現代日本語書き言葉均衡コーパス (BCCWJ; Balanced Corpus of Contemporary Written Japanese \cite{maekawa2014balanced})のコアデータ40,584文を学習データとして用いた．
\ref{sec:yomi_multitask}節で述べたように，漢字の読み推定タスクは，原文を入力して読みを出力するタスクと，その逆向きである，読みを入力して原文を出力するタスクの2種類であり，それに加えて両方のタスクを同時に学習するモデルも作成した．
ここで，原文はBCCWJの原文文字列，読みはBCCWJの発音形出現形を用いた．
なおBCCWJの発音出現形は，例えば「将棋」は「ショーギ」が対応するように，必ずしもキーボードで入力する読みとは一致していない．
本研究では，キーボード入力時の誤り訂正が対象であるため，キーボードで入力する読みが望ましいと考えられる．
発音出現形をキーボードで入力する読みに変換したデータを用いた実験は今後の課題である．
読み推定タスクの入力単位はBCCWJの短単位をsubword分割したものとした．
同時学習を行うモデルでは，まず，入力誤り訂正タスクと漢字の読み推定タスクでfine-tuningした後，入力誤り訂正タスクのみでfine-tuningした．
入力誤り訂正タスクにおいては，JWTDの全ての入力誤りデータを用いた．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{疑似データ}

疑似データを作成し，JWTDと混合したデータでfine-tuningを行う．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{疑似データ作成方法}
    疑似データは\ref{sec:pseudo_data}節で述べたようにランダムに入力誤りを生成する方法（ランダム）と，逆翻訳を行って生成する方法（逆翻訳）の2種類である．
    どちらの方法でも，疑似データを作成するソースデータは読売新聞データを用いた\footnote{\url{https://database.yomiuri.co.jp/about/glossary/}}．

    ランダムでは，\ref{sec:mining}節のマイニングの条件を満たすようなノイズをランダムに加えて，誤字・脱字・衍字・転字・誤変換の疑似入力誤りデータを作成する．
    ここで，ランダムに生成することが困難なその他の入力誤りの生成は行わなかった．
    誤変換に関しては，Wikipedia全体の本文テキストをJuman++で形態素解析した読みの情報をもとに，文中の漢字を含む形態素を同一の/近い読みを持つ形態素に置換する方法で生成した．

    逆翻訳では，JWTDのその他を除く誤字・脱字・衍字・転字・誤変換の入力誤りを用いて，fine-tuningで訂正後の文から訂正前の文を学習させたBARTをもとに逆翻訳を行い，疑似データを作成する．
    ここで，ランダムな生成方法と条件を揃えるため，その他の生成は行わなかった．
    生成されたテキストに再度マイニング（\ref{sec:mining}節）を行って得られた文ペアを疑似データとした．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{疑似データとJWTDの混合方法}
    fine-tuningに用いるJWTDの入力誤りデータはその他を抜いた誤字・脱字・衍字・転字・誤変換である．
    JWTDと疑似データを混合したものに対して，疑似データ割合が0.0$\sim$1.0になるように混合した．
    疑似データの割合が1.0の場合はJWTDの学習データと同じサイズとした．
    混合する際には，それぞれのカテゴリのデータサイズの比率はJWTDと同様になるようにした．
    疑似データはランダムのみ，逆翻訳のみ，混合とした．
    混合はランダムで生成した疑似データと逆翻訳で生成した疑似データをそれぞれ0.5の割合で混ぜたものである．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{fine-tuning方法}
    モデルはBART baseを用い，疑似データとJWTDを混合したデータでfine-tuningした後，JWTDのみでfine-tuningを行った．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{評価方法}
\label{sec:eval_settings}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{入力誤り訂正}

評価指標は入力誤り訂正の適合率・再現率・F値を用いた．
入力誤り訂正の適合率・再現率は次の定義で計算した．
各文において，訂正前の文と訂正後の文の文字単位の最小編集$G$と，
訂正前の文とシステム出力文の文字単位の最小編集$O$を求め，$|G\cap O|$を求める．
全ての文における$|G\cap O|$の合計を$N_T$，$|G|$の合計を$N_G$，$|O|$の合計を$N_O$として，
適合率=$N_T/N_O$，再現率=$N_T/N_G$とした．
ここで最小編集の計算には python-Levenshtein ライブラリ\footnote{\url{https://pypi.org/project/python-Levenshtein/}}を用いた．

評価には，JWTD テストセット・入力誤り評価データ・GitHub Typo Corpusの3つを用いた．
GitHub Typo Corpusは，Hagiwaraらの分類器での入力誤りである確率 (prob\_typo) が0.9より大きい日本語データから，英語のスペルミス訂正を除いた，557文を用いた．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{他の校正システムとの比較}
\label{sec:other_proofreading_systems:settings}

 本研究で構築した入力誤り訂正システムと他の校正システムとで精度比較を行った．
 他の校正システムは，Microsoft Word\footnote{\url{https://www.microsoft.com/ja-jp/microsoft-365/word}}とYahoo! 校正支援API\footnote{\url{https://developer.yahoo.co.jp/webapi/jlp/kousei/v1/kousei.html}}の2つを用いた．
 精度比較は，入力誤りを含む文におけるシステムの入力誤り認識精度と，入力誤りを含まない文におけるシステムの振舞いの2つの尺度で行った．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \paragraph{Microsoft Wordの設定}
 日本語における入力誤り認識のみの評価に限定するために，校正結果のうち言語設定が日本語とされている箇所のみを評価に用いた．
 校正の設定は，「文書のスタイル」を「通常の文」に設定し，他は初期設定のままとした．
 利用したWordのバージョンはMicrosoft Word for Mac 16.48である．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \paragraph{Yahoo! 校正支援APIの設定}
 Yahoo! 校正支援APIは，校正のカテゴリを17種類に分けて出力を行う．
 本研究においては，それら17種類のうち，F値が最大となるようなカテゴリを選択して，評価を行った．
 API利用時期は2021年5月である．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \paragraph{評価方法}
 二つの校正システムの出力の多くが，訂正箇所の指摘のみであったため，入力誤り訂正ではなく，訂正すべき箇所を推定するタスク（入力誤り認識）で評価した．
 校正システムが出力した訂正箇所（区間）が，正解の訂正箇所（区間）を含むかどうかを数え上げ，適合率・再現率・F値を計算する．
 前章で作成した訂正システムにおいては，入力とシステム出力の差分箇所を訂正箇所とした．
 評価には，入力誤り評価データとGitHub Typo Corpusを用いた．
 この2つを評価に用いたのは，前者はWikipedia，後者はGitHubにおける入力誤りの分布を反映したデータであり，入力誤り認識の総合的な性能の比較に適切なためである．
 Wordにおいてはそれぞれランダムに100個サンプルしたもので我々が人手で評価した．

 また，入力誤りを含まない文を入力したときの評価も行った．
 校正システムは入力誤りのない文での不必要な訂正の提案は行わないことが望ましく，その観点での評価のためである．
 入力誤りを含まないと考えられる読売新聞データ100文を与えて，システムの訂正箇所の数を数えて，比較する．
 読売新聞データは，記事の見出しを除いた本文のみを用いた．
 この評価におけるYahoo! 校正支援APIで訂正箇所を数え上げる校正カテゴリは，入力誤り評価データでの入力認識誤りのF値を最大化するカテゴリであり，かつ，GitHub Typo Corpusでの入力誤り認識のF値を最大化するカテゴリとした．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{結果と考察}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{入力誤り訂正タスク（ベースライン）}

JWTDの各カテゴリでfine-tuningし，各カテゴリのJWTDのテストセットで評価した結果を表\ref{table:each_category_score}に示す．
ここで，「全て」はJWTD全てのカテゴリでfine-tuningしたモデルを，全てのカテゴリのテストセットを用いて評価した結果を表す．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 12
\begin{table}[p]
\input{03table12.tex}
\hangcaption{各カテゴリでfine-tuningしたモデルの，各カテゴリのJWTDテストセットにおける評価結果（値は\%）．}
\label{table:each_category_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 13
\begin{table}[p]
\input{03table13.tex}
\caption{入力誤り評価データとGitHub Typo Corpusにおける入力誤り訂正評価結果（値は\%）．}
\label{table:gold_correction_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

全体を通して，BART baseよりもBART largeの方が高いスコアが得られた．
BART baseの転字では正解が1つも得られなかった．
これは学習データ・テストデータ数が不十分であることが理由として考えられる．
衍字 (b) はBART base，BART largeとも高いスコアであり，比較的簡単な訂正タスクであるといえる．
一方で，誤変換 (b) は衍字 (b) より学習データサイズが大きいが，スコアが最も低く，最も難しいタスクであるといえる．

入力誤り評価データとGitHub Typo Corpusにおける結果を表\ref{table:gold_correction_score}に示す．

BART large モデルは適合率71.4\%，再現率58.6\%であった．
表\ref{table:eval_building_dataset_method_with_gold}のデータセット構築手法の適合率，再現率と比較して，十分高いスコアだと考えられる．
GitHub Typo Corpus におけるスコアは入力誤り評価データに比べて低かった．
これはWikipediaとGitHubのcommitログではテキストのドメインが大きく異なることが原因であると考えられる．

また，正解データの訂正とは異なるため不正解と扱われているが，正しい訂正だと考えられるものがいくつか見られた．
それらを以下に示す．
\systemeg{造物主であるフォルトゥナが存在する限り、何度\pre{もでも}復活する。}{造物主であるフォルトゥナが存在する限り、何度\post{でも}復活する。}{造物主であるフォルトゥナが存在する限り、何度\pre{も}復活する。}

\systemeg{レオンが不在の間は帝国を守っ\pre{てて}いたが、クジンシーの襲撃の受け、...}
{レオンが不在の間は帝国を守っ\post{て}いたが、クジンシーの襲撃の受け、...}
{レオンが不在の間は帝国を守っ\post{て}いたが、クジンシーの襲撃\post{を}受け、...}
\relativeidx{-2}は，訂正が異なるものの，システムの訂正も妥当な訂正だと考えられる．
\relativeidx{-1}は，正解データに入力誤りが残っており，その入力誤りを訂正した例である．
このような例が存在するため，実際の入力誤り訂正のスコアは表\ref{table:gold_correction_score}のものより高い可能性がある．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{読みの同時学習}

表\ref{table:gold_correction_score}に読みの同時学習を行ったモデルの入力誤り評価データとGitHub Typo Corpusでの評価結果を示す．
ここで，「BART base (large)」はJWTDの全ての入力誤りデータを用いた入力誤り訂正タスクのみで学習したモデル，「BART base (large) w/ 原文$\to$読み」は原文から読みを推定するタスク，「BART base (large) w/ 読み$\to$原文」は読みから原文を推定するタスク，「BART base (large) w/ 両方向」はその両方を，入力誤り訂正タスクと同時に学習したモデルの結果を示している．
漢字の読み推定タスクを同時学習したモデルは，ベースラインの結果に比べ，概ね，適合率は下がるが，再現率は上がる傾向が見られる．
また，F値においても向上が見られる箇所もある．
ただし，GitHub Typo CorpusにおけるBART baseの結果では，同時学習したモデルのスコアが下がっている．
同時学習したモデルはベースラインのモデルよりも，アルファベット文字列での不必要な編集が多く見られた．
そのため，アルファベット文字列を多く含むGitHub Typo Corpusにおいてその影響が大きく現れたのだと考えられる．
読み推定の学習に用いたBCCWJのデータには，RADIOとラジオのように，アルファベット文字列にカタカナの読みが対応する場合があった．
それらのデータによって，アルファベット文字列を編集するような学習がなされ，生成能力に悪影響が出たのではないかと考えられる．
「w/ 原文$\to$読み」「w/ 読み$\to$原文」間で大きな差は見られず，これらと「w/ 両方向」の間にも大きな差は見られなかった．

次に表\ref{table:kanji_conversion_score}，\ref{table:mistype_conversion_score}にベースラインと漢字の読み推定を同時学習したモデルの，JWTDテストセットの誤変換カテゴリにおける評価結果を示す．
ほぼ全てのスコアにおいて，ベースラインよりも読み推定を同時学習したモデルが高いスコアとなった．
これより読み推定を同時に学習することは誤変換の訂正に有効であることがわかる．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 14
\begin{table}[t]
\input{03table14.tex}
\caption{JWTDテストセットの誤変換 (a) における入力誤り訂正評価結果（値は\%）．}
\label{table:kanji_conversion_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 15
\begin{table}[t]
\input{03table15.tex}
\caption{JWTDテストセットの誤変換 (b) における入力誤り訂正評価結果（値は\%）．}
\label{table:mistype_conversion_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ベースラインモデルが間違え，読み推定を同時学習したモデルが正解した入力誤りを以下に示す．
ここで，「w/o 読み」は「BART large」，「w/ 読み」は「BART large w/ 原文$\to$読み」の出力結果を表している．

\systemegy{...山頂、火口付近から、\pre{待つの木}のような形の暗い雲を見た。}{...山頂、火口付近から、\pre{待つ木}のような形の暗い雲を見た。}{...山頂、火口付近から、\post{松の木}のような形の暗い雲を見た。}{入力誤り}{w/o 読み}{w/  読み}
\systemegy{ＸＤａｒｗｉｎのより\pre{細菌}のバージョンはルートレース...}{ＸＤａｒｗｉｎのより\pre{新しい}バージョンはルートレース...}{ＸＤａｒｗｉｎのより\post{最近}のバージョンはルートレース...}{入力誤り}{w/o 読み}{w/  読み}
正解の訂正である「待つ$\to$松」「細菌$\to$最近」という訂正をする文ペアは，誤変換 (a) の学習データに含まれていた．
しかし，ベースラインは\relativeidx{-2}では誤変換ではなく1文字を削除する衍字としての編集を行い，\relativeidx{-1}では正解とは異なる漢字へと編集を行ってしまっている
\footnote{\relativeidx{-1}の「新しい」への訂正も，正しい訂正と考えられる．
しかしながら，漢字の読みの編集距離に着目すると，「新しい」を誤って「細菌」と入力した可能性よりも，「最近」を誤って「細菌」と入力した可能性の方が高いと考えられる．
その点では，入力誤りの訂正として「最近」への訂正の方がより適切な訂正であるといえる．}．
一方で，読み推定を同時に学習したモデルはどちらも正解していた．読み推定の学習データには，「待つ」「松」「細菌」「最近」の読みを推定するデータが含まれていた．
これらの読み推定の学習が，誤変換訂正の学習の手助けとなり，正解に繋がったのではないかと考えられる．


以下のような，読み推定の学習データでは学習できない読みに関する誤変換訂正は，ベースラインが不正解の場合，同時学習したモデルにおいても不正解のままであった．
\systemegz{...彼は警察にも\pre{全量}市民と評判の人物だったことから、...}{...彼は警察にも\post{善良}市民と評判の人物だったことから、...}{...彼は警察にも\post{全米}市民と評判の人物だったことから、...}{...彼は警察にも\post{全米}市民と評判の人物だったことから、...}{入力誤り}{正解}{w/o 読み}{w/  読み}
モデルの入力トークン単位分割では，「全量」は「全量」，「善良」は「善良」，「全米」は「全/米」と分割される．読み推定の学習データに「善良」の読みを推定するデータは含まれていたが，「全量」の読みを推定するデータは含まれていなかった．
この対処としては，読み推定の学習データを増やすことが考えられる．
また，読み推定の学習データに「全量」の読みを推定するデータは含まれていないものの，「全」と「量」の読みを推定するデータは含まれていた．
そのため，モデルの入力トークン単位が文字単位である場合は，本実験の読み推定の学習データのままで全量の読みを学習できる．
入力トークン単位が文字単位である入力誤り訂正システムの構築は今後の課題である．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 3
\begin{figure}[t]
\begin{center}
\includegraphics{28-4ia3f3.pdf}
\end{center}
\hangcaption{疑似データ実験結果．縦軸が適合率・再現率・F値，横軸が学習データ中の疑似データの割合を表す（値は\%）．}
\label{fig:psuedo_result}
\vspace{-0.75\Cvs}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{疑似データの利用}

実験結果を図\ref{fig:psuedo_result}に示す．
評価には入力誤り評価データを用いた．
図の実線を見ると，疑似データの利用による再現率の向上が見られる．
しかし，適合率は疑似データの利用により低下し，F値にはあまり変化は見られないため，適合率と再現率はトレードオフになっているといえる．
これらから，適合率より再現率を優先させたい場合には疑似データを利用することが有効であるといえる．
また，疑似データを含むデータのみでfine-tuningしたモデルと，その後JWTDでfine-tuningしたモデルでは，適合率・再現率において両者のスコアに差がみられるが，F値においては大きな変化は見られなかった．
点線の結果を見ると，疑似入力誤りの生成方法では，疑似入力誤りの割合が大きいとき，混合の結果がよいことが読み取れる．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{他の校正システムとの比較}

 入力誤り認識結果を表\ref{table:other_proofreading_systems_score}に示す．
 本研究のシステムが入力誤り評価データだけではなく，テキストドメインの異なるGitHub Typo Corpusにおいても，再現率・F値において高いスコアであることが確認できる．
 しかし，適合率においては，Wordよりも低い．
 より適合率の高いシステムを構築することは今後の課題である．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 16
\begin{table}[b]
\input{03table16.tex}
\caption{入力誤り評価データとGitHub typo corpusにおける入力誤り認識評価結果（値は\%）．}
\label{table:other_proofreading_systems_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 17
\begin{table}[b]
\input{03table17.tex}
\par\vspace{-1\Cvs}
\caption{入力誤り認識結果の実例．}
\label{table:recog_exam}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 入力誤り認識結果の例を表\ref{table:recog_exam}に示す．
 誤変換以外の\relativeidx{-3}のような衍字などの入力誤りは，Wordが指摘できているものがあったが，\relativeidx{-2}のような誤変換は，本研究のシステムのみが指摘できているものが多かった．
 \relativeidx{-1}はJWTD では収集していない編集距離の大きい入力誤りであり，本研究のシステムは指摘できておらず，今後の課題である．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 18
\begin{table}[b]
\input{03table18.tex}
\caption{新聞データでの訂正箇所数．}
\label{table:cleantext_score}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 新聞データを与えたときの訂正箇所数を表\ref{table:cleantext_score}に示す．
 Wordに比べて，本研究のシステムの訂正箇所が多かった．
 本研究のシステムであるBART largeが行った訂正は，半数が文字の抜けを指摘するものであった．
 それらは，以下のような，間違いではないが不必要な訂正であった．

\typoexm{新聞　}{システム}{...個別に栄養・食事指導した場合などは加算する。}{...個別に栄養・食事\post{を}指導した場合などは加算する。}

\typoexm{新聞　}{システム}{...同署は、状況などからひき逃げされたと断定、逃げた車を探している。}{...同署は、状況などからひき逃げされたと断定\post{し}、逃げた車を探している。}

本研究のシステムは，実用の観点では，このような不必要な訂正の提案を減らすことが今後の課題といえる．
これは，学習データに入力誤りを含まない文を用いることなどで改善すると考えられる．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{おわりに}
\label{sec:conclusion}

本研究では日本語Wikipediaの編集履歴から，入力誤りデータセットを構築する手法を提案した．
文字単位の編集と漢字の読みを手がかりに，誤字・脱字・衍字・転字・誤変換の入力誤り候補をマイニングし，言語モデル等を用いたフィルタリングを行うことで，これらカテゴリの入力誤りを収集した．
さらに，入力誤り訂正を学習したモデルを用いて，追加でその他の入力誤りを収集し，合計約70万文規模のデータセット (JWTD; Japanese Wikipedia Typo Dataset) を構築した．
JWTDの構築手法を評価し，その質を確認した．

入力誤り訂正システムにおいては，入力誤り訂正タスクと同時に漢字の読み推定タスクを学習する手法を提案した．
入力誤り訂正タスクのみで学習したシステムと提案手法のシステムを比較して，提案手法のシステムが誤変換の訂正において高い精度であることであることを確認した．
また，JWTDの他に疑似データを学習データに追加したときのシステムの精度変化を確認した．

今後の課題としては，まず，データセットの質をさらに高めることが挙げられる．
これにより，同時に，訂正システムの精度向上につながると期待できる．
データセットの質の向上には，フィルタリングの方法やその他の入力誤りの収集方法をより洗練することが有効であると考えられる．
入力誤り訂正システムに関しては，異なるドメインのテキストにおいても頑健に振る舞うシステムの構築と不必要な編集の抑制が挙げられる．
前者は事前学習時に多様なドメインのテキストを用いる方法，後者はfine-tuning時の学習データに入力誤りのないデータを加える方法が考えられる．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\acknowledgment

本論文の内容の一部は，Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics: Student Research Workshopで発表したものである\cite{tanaka-etal-2020-building}．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bibliographystyle{jnlpbbl_1.6}
\bibliography{03refs}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{biography}
\bioauthor{田中　　佑}{%
2019年京都大学工学部情報学科卒業．2021年同大学院情報学研究科修士課程修了．
2021年よりNTTコミュニケーションズ株式会社に在職．
}
\bioauthor{村脇　有吾}{%
2011年京都大学大学院情報学研究科博士後期課程修了，博士（情報学）．同年京
都大学学術情報メディアセンター特定助教，2013年九州大学大学院システム情報
科学研究院助教，2016年京都大学大学院情報学研究科助教，2020年同講師，現在
にいたる．テキスト解析および計算言語学に関する研究に従事．言語処理学会，
情報処理学会各会員．
}
\bioauthor{河原　大輔}{%
1997年京都大学工学部電気工学第二学科卒業．1999年同大学院修士課程修了．
2002年同大学院博士課程単位取得認定退学．東京大学大学院情報理工学系研究
科学術研究支援員，独立行政法人情報通信研究機構主任研究員，京都大学大学
院情報学研究科准教授を経て，2020年より早稲田大学基幹理工学部情報通信学
科教授．自然言語処理，知識処理の研究に従事．博士（情報学）．情報処理学会，
言語処理学会，人工知能学会，電子情報通信学会，ACL，各会員．
}
\bioauthor{黒橋　禎夫}{%
1994年京都大学大学院工学研究科電気工学第二専攻博士課程修了．博士（工学）．2006年4月より京都大学大学院情報学研究科教授．自然言語処理，知識情報処理の研究に従事．言語処理学会10周年記念論文賞，同20周年記念論文賞，第8回船井情報科学振興賞，2009 IBM Faculty Award等を受賞．2014年より日本学術会議連携会員．
}

\end{biography}


\biodate




\end{document}

