Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
日本語でもいい感じに改行したい!! / Split Japanese sentence for...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Trickart
September 18, 2021
Technology
4.1k
3
Share
日本語でもいい感じに改行したい!! / Split Japanese sentence for UILabel and SwiftUI Text
iOSDC2021発表資料
Trickart
September 18, 2021
More Decks by Trickart
See All by Trickart
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
170
Xcode MCPでスクリーンショット撮りを90%自動化する
trickart
0
110
External Accessory入門
trickart
0
930
Other Decks in Technology
See All in Technology
個人AIからチームAIへ:開発における品質と生産性の再設計
moongift
PRO
0
320
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
0
270
はじめてのDatadog
kairim0
0
240
Platform engineering for developers, architects & the rest of us (AI agents)
danielbryantuk
0
160
組織の中で自分を経営する技術
shoota
0
230
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.8k
さきさん文庫の書籍ができるまで
sakiengineer
0
320
Oracle Cloud Infrastructure:2026年5月度サービス・アップデート
oracle4engineer
PRO
1
280
エンジニアは生成AIと どのように向き合うべきか? ことばの意味という観点から
verypluming
3
300
類似画像検索モデルの開発ノウハウ
lycorptech_jp
PRO
4
1.1k
Databricks 月刊サービスアップデート 2026年05月号
tyosi1212
0
120
Datadog 認定試験の概要と対策
uechishingo
0
210
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
290
Agile that works and the tools we love
rasmusluckow
331
21k
Chasing Engaging Ingredients in Design
codingconduct
0
200
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
380
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
The Spectacular Lies of Maps
axbom
PRO
1
770
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
日本語でもいい感じに改 行したい!! trickart(@trickart4121)
みなさん
こういった 経験ありませんか?
レイアウトはこんな感じでいいか!
一応初代SEでも確認しておくか…
よいしょ…ん…?
あっ…!!
None
変なところで改行されてし まっている!! 😇
幅に合わせて縮めるやつでいいじゃん - adjustFontSizeToFitWidthをtrueにする - これで解決!!
None
お品書き - 一行表示じゃダメなケースについて - UILabelの改行制御(NSLineBreakMode) - 制御文字について(WORD JOINER) - 形態素解析
- 改行制御ツールの実装 - パッケージング - おまけ
一行表示では良くないときある… - フォントサイズを縮めたくないことも… - ユーザー層的にフォントは大きくしておきたい場合 - めちゃ長テキストで米粒サイズになってしまう場合 - etc…
あらかじめ改行しておけば…? 「iOSDC/2021/開催中」とした
あらかじめ改行しておけば…? 12 Pro Maxでは改行されすぎてる感じがしてしまう… そもそもあらかじめやっておけない場合もある
どうすれば…😇
UILabelって こういうとこいい感じに やってくれないの…?
もちろんやってくれます!
英語なら!!
NSLineBreakMode - Viewの幅より長かったときどうするか? - そのままクリップする(byClipping) - はみ出す文字の前で改行する(byCharWapping) - はみ出す単語の前で改行する(byWordWrapping) -
etc…
でも日本語だと .byWordWrappingでも…
😇
つまり 「Word」扱いされてない ってコト…?
そんなときは… WORD JOINER!!
WORD JOINERとは? - 制御文字の一種 - 幅がゼロの文字で、挿入した箇所は改行されなくなる - Unicodeのコードポイントは2060 →これを単語内にたくさん挿入すればいいはず
実験 - WORD JOINERを入れる・入れないで比較
実験 - WORD JOINERを入れる・入れないで比較 🎉
これで 改行させない方法は わかった。
じゃあ逆に どこで改行させれば…?
手作業は…
こんなときは… 形態素解析!!
形態素解析とは 文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語 の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分 割し、それぞれの形態素の品詞等を判別する作業である。 by 形態素解析 – Wikipedia →単語の分割と品詞判別ができる!!
OSSな形態素解析エンジン - ChaSen - JUMAN - MeCab ←今回はこれを使います
MeCabとは - 工藤拓氏によって開発された形態素解析エンジン - C++製でC言語、Java、Python、Rubyからも利用可能 - BSD/GPL/LGPLのトリプルライセンス - macOSやiOSでも利用されている -
Homebrewで簡単にインストールできる
MeCabとは
MeCabをSwiftからどう使う? - MeCabはC++製 - 今の所Swiftから直接C++ライブラリを使うことはできない →Objective-C++を使えばOK!! MeCabのC APIとSwiftのC Interopを使う案についてはおまけに
Objective-C++とは? - Objective-C++はObjective-CとC++を合体させた言語 - 拡張子は.mm - Objective-C++からC++のクラスを扱える - Swift →
Objective-C++ → C++
Objective-C++とは? Objective-C++ C言語 オブジェクト指向 Objective-C C++
全体像 MeCab (C++) ツール (Swift) ラッパー (Objective-C++)
ラッパーを書く - Objective-C++でただひたすら書く - 構造体とかStringをSwift向けに変換したりする - MeCabはchar *を返すのでNSStringに変換
- やっぱりSwift Packageとして使いたい - ラッパーだけでなくMeCab自身や辞書データもSwift Packageにする 書いたラッパーをSwift Packageにする
- C++なのにSwift Package? - Swift PackageはC/C++/Objective-C/Objective-C++の コードをパッケージング出来る - 1ターゲットにSwiftとObjective-Cを同居させたりすること はできない
MeCab as a Swift Package
- ビルド設定はPackage.swiftで行う - defineはcSettingsのdefine MeCab as a Swift Package
- コンパイラに渡す設定はPackage.swiftで行う - ライブラリのリンクはlinkerSettingsのlinkedLibrary - iOSにもiconvはあるので安心 MeCab as a Swift
Package
- Objective-C/SwiftからC/C++のライブラリを使うためには module.modulemapが必要 MeCab as a Swift Package
- 辞書データをSwift Packageにするには? - Swift 5.3からSwift PackageにBundleを追加することが出来 るようになった →辞書データだけBundleしたパッケージを作る MeCabIPAdic
as a Swift Package
- Swift PackageにファイルをBundleするにはresourcesで copyすればOK MeCabIPAdic as a Swift Package
これでSwiftから MeCabが使える!! \\٩( 'ω' ) و//
実装する - 単語に分割したら単語中の文字の間にWORD JOINERを 入れる 青いそら → 青い/そら → 青¥u{2060}い/そ¥u{2060}ら
つなぐ単語 - すべての単語を分割してしまうと見栄えが良くない - すきとおっ/た (動詞/助動詞) - 夏/で/も (名詞/助詞/助詞) -
句読点や括弧閉 (禁則処理) →これらは前の単語と結合してしまう
実装する
あらかじめLocalizable.strings - あらかじめWORD JOINERを仕込んでおきたい - MeCabIPAdicがデカいので同梱したくない… - Localizable.stringsを出力するCLIコマンド - $
muscat in.strings out.strings
完成!! - 名前はMuscatといいます - https://github.com/trickart/muscat
今度こそ
補足1 NLTaggerは? - AppleはNLTaggerというクラスを提供している - NLTaggerではだめなのか? - 英語だと単語分割・品詞判別できる - 日本語だと品詞が全部「OtherWord」になってしまう
- 品詞がないと助詞の連結などができないためボツ MeCabを選んだのはぶっちゃけMeCabしか知らなかったから
補足2 SwiftUIは? - SwiftUIにはlineBreakModeとかないけど使えるの? - 特に何も指定してないけど使えます!!
補足3 辞書データについて - MuscatではMeCabIPAdicを使用 - 辞書は差し替えようと思えば差し替えられるため mecab-ipadic-NEologdを使ったりすることも可能
補足4 muscat CLIの実装について - 引数やオプションの処理はswift-argument-parserを使用 - Property Wrapperでスッキリしてるのでおすすめ - Localizable.stringsはPropertyListDecoderで読み込める
- ただ普通に[String:String]でデコードするとDictionaryは 順番を保証しないので順番が不定になってしまう - swift-collectionsのOrderedDictionaryを使えば…?
補足5 先行事例について - 作ったあとに先行事例について調べたらあった - GoogleのBudou 🍇 - Python製のツールで形態素解析して単語の区切に HTMLのspanタグを挿入するツール
- よく考えたら昔Googleのブログで見たかも… - Muscatの名前はBudouにあやかってつけました
補足6 MeCab C APIとSwift C Interop - MeCabはC++製だがC言語向けのAPIがある - SwiftはC言語の関数を使用できる
- Objective-C++使わなくてもいいのでは…? - 試したところXcodeでデバッグ実行したらメモリリーク警告 が発生 - 実装が悪いかもしれないが、原因が特定できなかった 為断念した - 将来追加されるであろうSwift C++ Interopに期待
ご清聴ありがとうございました 参考資料 MeCab: Yet Another Part-of-Speech and Morphological Analyzer Bundling
Resources with a Swift Package | Apple Developer Documentation C++ライブラリをiOSプロジェクトに追加する方法について - Zenn