1週間で学ぶScalaの日本語文字列処理

日本語の言語処理技術をScalaで開発するための事前知識としての日本語文字列処理についてDay 1からDay 7までの1週間で学習します。

受講要件は特にございませんが、本コースはScalaの質問応答システムの受講要件です。

本教材を使った学習方法について説明します。

Day 1からDay 7まで各Dayごとに一つずつリポジトリを用意しています。次はDay 2の例です。各Dayのファイル構成は基本的に同じです。

リポジトリのファイル構成(Day 2の例)
scalastringcourseday2/
  ├ doc/
  │ ├ string_course_day2.key /* スライドのKeynoteファイル */
  │ ├ string_course_day2.pdf /* スライドのPDFファイル(SlideShareアップロード用) */
  │ └ ... /* 読み物のMarkdownファイル */
  ├ image/... /* スライドの画像ファイル(読み物に埋め込む用) */
  ├ project/... /* SBTのビルド定義に関するファイル */
  ├ quiz/quiz.xml /* クイズの問題と正解 */
  ├ src/
  │ └ test/
  │   └ scala/
  │     └ Day2TestSuite.scala /* サンプルコード */
  ├ LICENSE /* Apache License Version 2.0 */
  ├ .gitignore /* Gitリポジトリに管理させないファイルを定義するgitignoreファイル */
  ├ README.md /* リポジトリの説明のためのMarkdownファイル */
  ├ SUMMARY.md /* リポジトリの目次のためのMarkdownファイル */
  ├ book.json /* GitBookのオプション(バージョンやプラグインなど) */
  └ build.sbt /* リポジトリのSBTのビルド定義ファイル */
学習の流れ
  1. まずは動画とスライドを閲覧してどのような内容を学ぶのか全体像を掴んでください。動画は各Dayごとのエッセンスを短くまとめたものです。スライドは読み物を補完する目的で作成しているため、全体の説明の流れを大まかに概観する目的で閲覧下さい。スライドのみでは説明が不足します。
  2. 次に、Dayごとにリポジトリのsrc/testの下にあるサンプルコード(.scalaファイル)を実行して挙動を確認してください。
  3. 次に、目次(SUMMARY.md)にリンクする各Dayの読み物(doc/の下のMarkdownファイル)を読んで、サンプルコードと読み物の理解を深めてください。
  4. 資料を読んだ後はクイズに挑戦してください。クイズはREADME.mdにリンクが貼られています。Day 1を除く各Dayごとに10問あります。読み物からコラムを除いた範囲から出題します。満点で合格です。何度でも挑戦可能です。
  5. 各クイズに合格したら、もしよろしければDayごとのアンケートに答えてください。
  6. 全Dayのクイズに合格したら最終クイズに挑戦してください。最終クイズは100問あります。100問中60問はDay 2からDay 7までのクイズで出題されたものと同じ問題です。残りの40問は全Dayの読み物のコラムから出題します。満点で合格です。こちらも何度でも挑戦可能です。ここまでで1週間分の内容です。
  7. 最終クイズに合格したら、もしよろしければ全体としてのアンケートに答えてください。
  8. 最後に、学習したことの応用として任意参加のタスクを用意します。自由に挑戦してください。

各Dayにご意見・ご質問等ございます方は、各リポジトリにissueを立ててください。このページや全体的なことについてはツイッターアカウント@ynupcにてご対応させていただきます。

想定する学習時間


リポジトリ クイズ タスク

目次

Day 1 概要と環境設定

1. 概要

2. 環境設定
2.1 ScalaとJDK
コラム:API
コラム:Style
2.2 SBT
2.3 単体テスト用ライブラリ
コラム:IDE
コラム:サンプルコードの文字コード
2.4 その他のライブラリ

Day 2 リテラル・補間子・特殊な文字

1. リテラル
コラム:非ヒープ領域によるOutOfMemoryError
コラム:OutOfMemoryErrorやStackOverflowErrorの対処法
(1)プログラム上で使用するメモリ容量を減らす
(2)物理的に割り当てる容量を変更する
コラム:逆アセンブリ・逆コンパイル
(1)逆アセンブリ
(2)逆コンパイル
1.1 文字に関するリテラル
コラム:世界統一文字コードの歴史 〜なぜ1文字が1つのCharで表せなくなったのか〜
1.2 文字に関するリテラルの例
コラム:Scalaのvalとvarの使い分け
コラム:日本語の半角円記号とバックスラッシュ記号の混同問題
1.3 生文字リテラル
コラム:文字列の一致
コラム:文字の一致
1.4 生文字リテラルの改行のインデントを揃える方法

2. 補間子
2.1 s補間子
2.2 f補間子
2.3 raw補間子
2.4 文字列リテラル+raw補間子と生文字リテラルの違い
2.5 補間子の自作

3. 特殊な文字
3.1 エスケープシーケンス
3.2 Unicodeシーケンス
コラム:Unicodeシーケンスの特殊な挙動、native2ascii
コラム:幽霊文字
コラム:波ダッシュと全角チルダの問題
3.3 OS依存文字

Day 3 コードポイントとサロゲートペア

1. コードポイントとサロゲートペアの理論
1.1 コードポイント
コラム:BOMとエンディアン
コラム:UTF-8のBOMを削除する方法
(1)バイナリエディタによるUTF-8のBOMの手動削除
(2)ScalaによるUTF-8のBOMの自動削除
コラム:UTF-8のセキュリティ問題、Nimda
コラム:UTF-8のテキストのMySQLへの保存、utf8mb4
1.2 サロゲートペア
1.3 コードポイントとサロゲートペアの相互変換式

2. コードポイントとサロゲートペアの実装
2.1 サロゲートペア (Array[Char])とコードポイント (Int)の相互変換
2.1.1 サロゲートペア (Array[Char])からコードポイント (Int)への変換
2.1.2 コードポイント (Int)からサロゲートペア (Array[Char])への変換
2.2 コードポイント (Int)からChar数 (Int)の取得
2.3 コードポイント (Int)から上位サロゲート (Char)や下位サロゲート (Char)の取得
2.3.1 コードポイント (Int)から上位サロゲート (Char)の取得
2.3.2 コードポイント (Int)から下位サロゲート (Char)の取得
2.4 CharSequenceやStringやChar配列 (Array[Char])からコードポイント (Int)の取得
2.4.1 指定インデックス (Int)にある文字のコードポイント (Int)の取得
2.4.2 順方向に解析しコードポイント (Int)を取得
2.4.3 逆方向に解析しコードポイント (Int)を取得
2.4.4 サロゲートペアに対する挙動
2.5 CharSequenceとStringの相互変換
2.5.1 StringからCharSequenceへの変換
2.5.2 CharSequenceからStringへの変換
2.6 CharSequenceやStringとChar配列 (Array[Char])の相互変換
2.6.1 CharSequenceからChar配列 (Array[Char])への変換
コラム:IntStream
2.6.2 StringからChar配列 (Array[Char])への変換
2.6.3 Char配列 (Array[Char])からStringへの変換
2.7 StringからChar数 (IntまたはLong)やコードポイント数 (IntまたはLong)の取得
2.7.1 StringからChar数 (IntまたはLong)の取得
2.7.2 Stringからコードポイント数 (IntまたはLong)の取得
2.8 CharSequenceやStringとコードポイント配列 (Array[Int])の相互変換
2.8.1 コードポイント配列 (Array[Int])からStringへの変換
2.8.2 CharSequenceやStringからコードポイント配列 (Array[Int])への変換
2.9 コードポイント数 (Int)だけ移動した位置のインデックス (Int)の取得
2.10 Stringからイテレータの生成
2.10.1 StringCharacterIteratorによるChar単位のイテレータ
2.10.2 IntStreamによるChar単位のイテレータ
2.10.3 IntStreamによるコードポイント単位のイテレータ
2.11 Java 7以前のStringからコードポイント配列 (Array[Int])への変換

Day 4 Stringの文字コード変換と数値型との相互変換

1. Stringの文字コード変換
1.1 Charsetの正式名称とエイリアス
1.2 文字コードの変換
コラム:Windowsのコマンドプロンプトの文字コード変更
コラム:Microsoftの日本語文字コードの歴史(Shift-JIS, Windows-31Jなど)
コラム:MalformedInputExceptionとUnmappableCharacterExceptionの回避方法

2. Stringと数値型の相互変換
コラム:JavaでのStringとプリミティブ型の相互変換
(1)widening primitive conversion
(2)narrowing primitive conversion
(3)プリミティブラッパークラス
(4)auto-boxing conversion
(5)auto-unboxing conversion
(6)プリミティブ型からStringへの変換
(7)Stringからプリミティブ型への変換
コラム:検査例外と非検査例外
2.1 JavaのBooleanラッパークラスのparseBooleanメソッドによる文字列からのBooleanへの変換
2.2 数字(Charまたはコードポイント)から数値(Int)への変換
2.3 N進数表記
2.3.1 特定の進数表記
2.3.2 任意の進数表記
2.3.3 文字とN進数表記での数値の相互変換
2.4 既存クラスに変換メソッドを足したように見せる方法
2.4.1 Enrich My Libraryパターン
2.4.2 implicit classesを用いたEnrich My Libraryパターン
コラム:スコープ外でのリソースの自動解放、using
(1)Loanパターン
(2)CONCEPTパターン

Day 5 ミュータビリティとフォーマット

1. ミュータビリティ
1.1 ミュータビリティ
1.2 スレッドセーフティ
コラム:テレスコーピングコンストラクタパターン・JavaBeansパターン・ビルダーパターン
(1)テレスコーピングコンストラクタパターン
(2)JavaBeansパターン
(3)ビルダーパターン
コラム:マルチスレッドプログラミング
1.3 文字列クラスのミュータビリティとスレッドセーフティ
1.4 String
1.5 StringBuffer/StringBuilder
1.6 StringJoiner
1.7 String.joinメソッド
コラム:可変長引数に関するのJava/Scala互換性
コラム:コレクションに関するJava/Scala互換性
コラム:java.util.Iteratorとjava.lang.Iterableの違い
1.8 PrintWriter (StringWriter)/PrintStream (ByteArrayOutputStream)
1.9 java.nio.Buffer

2. フォーマット
2.1 Stringのformatメソッド
2.2 DateTimeFormatter
2.3 DateFormatとSimpleDateFormat
2.4 NumberFormatとDecimalFormat
2.5 ChoiceFormat
2.6 MessageFormat
2.7 テンプレートエンジン
コラム:XMLリテラルによるテンプレート処理

Day 6 正規表現と文字列操作

1. 正規表現
コラム:自然言語はチョムスキー階層での何型文法?
1.1 一致
1.1.1 完全一致(表層文字列)
1.1.2 完全一致(正規表現)
1.1.3 部分一致(表層文字列)
コラム:文字列探索アルゴリズム
1.1.4 部分一致(正規表現)
1.1.5 前方一致(表層文字列)
1.1.6 前方一致(正規表現)
1.1.7 後方一致(表層文字列)
1.1.8 後方一致(正規表現)
1.1.9 最長一致・最短一致
1.2 分割
1.2.1 区切り文字による分割
1.2.2 行末文字による分割
1.2.3 分割位置をインデックスによる指定した分割
1.2.4 条件に従わなくなった位置による分割
1.3 置換
1.3.1 表層文字列の一致による置換
1.3.2 正規表現の一致による置換
1.3.3 範囲指定による置換
1.3.4 複数のCharの同時置換
1.4 抽出

2. 文字列操作
2.1 比較
コラム:グルジア文字のletter case
コラム:letter caseの変換の非対称性
2.2 パスフィルタ
2.2.1 N番目の文字の取得
2.2.2 部分文字列の取得
2.2.3 先頭の一文字の取得
2.2.4 先頭のN文字の取得
2.2.5 末尾の一文字の取得
2.2.6 末尾のN文字の取得
2.2.7 条件式を満たす文字や文字列の取得
2.3 カットフィルタ
2.3.1 N番目の文字の削除
2.3.2 部分文字列の削除
2.3.3 先頭の一文字の削除
2.3.4 先頭のN文字の削除
2.3.5 先頭の文字列が一致したら削除
2.3.6 末尾の一文字の削除
2.3.7 末尾のN文字の削除
2.3.8 末尾の文字列が一致したら削除
2.3.9 先頭・末尾の空白文字削除
2.3.10 末尾改行文字削除
2.3.11 条件式を満たす文字や文字列の削除
2.4 ソート
2.4.1 Charによる文字列リストの正順ソート
2.4.2 Charによる文字列リストの逆順ソート
2.4.3 Charによる文字のソート
2.5 集合演算
2.5.1 最大
2.5.2 最小
2.5.3 総和
2.5.4 相乗
2.5.5 和集合
2.5.6 差集合
2.5.7 重複排除
2.5.8 積集合
2.5.9 組合せ
2.5.10 順列
2.6 インデックス
2.6.1 正方向に解析して最初に現れたインデックスを取得
2.6.2 逆方向に解析して最初に現れたインデックスを取得
2.6.3 正方向に解析して条件を最初に満たしたインデックスを取得
2.6.4 逆方向に解析して条件を最初に満たしたインデックスを取得
2.6.5 インデックスを全て取得
2.6.6 インデックスが定義されているか
2.7 イテレーション
2.7.1 イテレータ
2.7.2 写像
2.7.3 N-gramの生成
2.7.4 行分割
コラム:配列と連結リスト
2.8 文字列間の文字に注目した類似度
2.8.1 文字列間の文字に注目した比較単位
コラム:N-gramの読み方
2.8.2 文字LCSによるF1値
2.8.3 文字N-gramによるF1値
2.8.4 ハミング距離
2.8.5 レーベンシュタイン距離
2.8.6 ダメラオウ・レーベンシュタイン距離
2.8.7 ジャロ距離
2.8.8 ジャロ・ウィンクラー距離
2.8.9 ベクトル化
2.8.10 ベクトル間の類似度
2.8.11 ベクトル間の距離
2.8.12 ベクトル間の包含度
2.8.13 文字列間の類似度・非類似度・包含度に関する表

Day 7 字種と文字の正規化

1 字種
1.1 Unicodeコードポイントのグループ分け
1.1.1 Unicodeスクリプト
1.1.2 Unicodeブロック
1.1.3 Unicodeカテゴリ
1.1.4 Unicodeバイナリ・プロパティ
1.2 java.lang.Characterクラスによる文字の字種情報の取得
1.2.1 Character.getName
1.2.2 Character.getType
1.2.3 Character.getDirectionality
1.3 java.lang.Characterクラスによる文字の字種判定
1.4 正規表現の字種によるマッチング
1.4.1 POSIX文字クラス(US-ASCIIのみ)
1.4.2 java.lang.Characterクラス(単純なjava文字タイプ)
1.4.3 Unicodeスクリプト、ブロック、カテゴリ、バイナリ・プロパティのクラス
1.4.4 POSIX文字クラスと定義済の文字クラスの互換性
1.4.5 日本語の字種のマッチング
1.4.6 主に日本語フォントで用いられる漢字の定義とマッチング
1.5 字種の変換
1.5.1 letter case
1.5.2 文字のletter caseの変換
1.5.3 文字列のletter caseの変換
1.5.4 ひらがなとカタカナの相互変換

2. 文字の正規化
2.1 文字の等価性
2.1.1 正準等価性
2.1.2 互換等価性
2.2 Shift-JIS・EUC-JP・ISO-2022-JPでの正規化
コラム:日本語専用文字コード(区点コード・Shift-JIS・EUC-JP・ISO-2022-JP)
(1)区点コード
(2)Shift-JIS
(3)EUC-JP
(4)ISO-2022-JP
コラム:マルチバイト文字のマッチングエラー
コラム:Shift-JISのダメ文字問題
2.3 Unicode正規化
2.4 オプション
2.5 文字列オプション
2.6 正規化文字列
2.6.1 正規化処理の流れ
2.6.2 ファイル構成
2.6.3 辞書ファイルのフォーマット
2.6.4 辞書ファイルの置換規則の実行順序
2.6.5 懸念事項
2.7 日本語の句点による文分割と文の正規化
2.8 引用符による文の解析

動画


スライド

Scalaの文字列処理 Day1 概要と環境設定 from ynupc
Scalaの文字列処理 Day 2 リテラル・補間子・特殊な文字 from ynupc
Scalaの文字列処理 Day 3 コードポイントとサロゲートペア from ynupc
Scalaの文字列処理 Day 4 Stringの文字コード変換と数値型との相互変換 from ynupc
Scalaの文字列処理 Day 5 ミュータビリティとフォーマット from ynupc
Scalaの文字列処理 Day 7 字種と文字の正規化 from ynupc