今回は、前回解説した「スマートテキスト」についてさらに詳しく調べてみました。

そもそも、電話番号やURL/URI、メールアドレスに関しては、特定の文字だけ、あるいは特定の文字列パターンがあるため、比較的、検出は容易です。たとえば、電話番号の場合、数字、ハイフン、カッコなどの文字がつながり、国番号まで入れると数字部分は最大15桁(ITU-T E.164)というルールになっているため、それほど複雑でないプログラムで検出が可能です。ただし、電話番号によく似た普通の数字と区別を付けるのは困難ですが、ユーザーがダイヤルするのを助けるという意味では、パターンに合致すれば、電話番号による通話アプリへのリンクにすることは問題ないでしょう。

これに対して、住所は、かなり面倒な問題です。というのは、住所の表記は地域依存が高いため、たとえ同じ英語を使う国、アメリカと英国では表記方法やルールが違っています。英語では、日本語とは逆に住所を書くというのを学校で習ったとは思いますが、あれは、一般的な住所の表現方法であって、そもそも住所などの割り当ては、行政機関が行い、その表記方法については法律や学校などで習うルールなどさまざまなものがあります。

たとえば、アメリカでは、住所の表記でカンマを入れるのは、州の略号(2文字のアルファベット)の直前のみ、としていることが多いのに対して、イギリスなどでは、カンマの利用は比較的自由で、通りや都市名をカンマで区切ったものをよく見かけます。また、アメリカでは、住所を表記するとき、州の名前を2文字のアルファベットとするのが普通ですが、イギリスでは州名を略すことはほとんどないようです。郵便番号もアメリカは数字のみなのに対して、イギリスでは、ロンドンなどでアルファベットと数字からなる郵便番号が使われています。同じ英語であっても、住所の表現パターンは同じではないのです。

となると、ルールをプログラムして「住所」を検出するというのは、かなり大変な問題です。もちろん、アメリカ限定、イギリス限定としてシステムのロケール(言語と地域の設定)で切り替えればいいという問題でもありません。システムは、日本で日本語を使う設定であっても、アメリカから来たメールや、米国企業のWebサイトでアメリカの住所を見る場合もあるでしょう。

アンドロイドで機械学習を使ってスマートテキストを実現しているという意味は、おそらく、この住所文字列の検出に機械学習が使われているということではないかと思われます。もちろん、メールアドレスやURLの判定も機械学習で可能ですが、複雑ではないプログラムでも比較的高い精度が保てるため、わざわざ機械学習にしているとは思えません。

スマートテキストの機能は、アンドロイドのGUI部品であるTextViewから利用できるようです。TextViewは、アプリ内で画面に文字を表示するGUI部品で、その設定により、電話番号やメールアドレス、URLなどをリンクにすることができます。その内部で「TextClassifier」というAPIを使って、表示するテキストを分析しています。

そこで、簡単なプログラムを作って、アンドロイドのバージョンごとにテキスト中の「URL」、「電話番号」、「メールアドレス」、「メールアドレスに似たURI」、「住所」が自動認識されるかどうかを試してみました。テキストは、英語と日本語を用意し、2つのTextViewを配置して表示させています。テストしたのは、

  • Android 6.0.1 (Marshmallow。APIレベル23。写真01)
  • Android 7.1.1 (Naugat。APIレベル25。写真02)
  • Android 8.0.0 (Oreo。APIレベル26。写真03)
  • Android 8.1.1 (Oreo。APIレベル27。写真04)

の4つのアンドロイドです。テスト対象としたのは「URL」、「ドメイン名」、「電話番号」、「メールアドレス」、「URI」(メールアドレスに似ている)、「住所」の6つで、「URL」、「ドメイン名」、「URI」については、通常版と国際対応による日本語を含むもの、電話番号は米国式(1-800で始まる)と日本式(03で始まる)で、住所も米国方式と日本のものを入れてみました。

Android 6.0.1では、国際対応のメールアドレス(user@ドメイン名例.jp)と住所がリンクになりませんでした。これに対して、Android 7.1.1では、米国の住所や国際対応のメールアドレスもリンクになっています。

さて、Android 8.0.0とAndroid 8.1.1では、違いはわずかしかなく、なぜか8.0.0(APIレベル26)で日本の郵便番号だけがリンクになっています。ただし、これは、電話番号として解釈されているようです。

Android 8.1(APIレベル27)でスマートテキストが導入される以前から「TextView」には、文字列に含まれる電話番号などを自動的にリンクに変換するAutoLinkという機能が搭載されていました。このため、APIレベル23のAndroid 6.0.1でもある程度、テキストから自動的にリンクを作ることができます。また、以前からこのAutolinkでは、対象に「住所」が含まれていたのですが、実際には指定しても動作しませんでした。それが、Android 7.1.1からは、住所もAutoLinkで自動的にリンクになっています。おそらく、Googleは、以前から住所を認識させようとある程度努力してきたのだと思われます。

ただ、日本語の住所に関しては、まだ完全には、認識できないようです。Webページなどのテキストでは、住所らしい部分を自動選択しているようですが、Android 6.0.1でも同じような範囲が選択されるため、Webブラウザ内で、文字種などにより選択範囲を決めていると考えられます。

ただし、前回示したように住所らしい部分を選択すれば、日本語でも、ポップアップメニューに地図アプリを提示します。このため、日本語では、選択範囲として提示された文字列が住所かどうかを判定することはできても、文字列のどこからどこまでが住所なのか(あるいはそもそも住所が含まれているかどうか)を正しく判定できないのではないかと思われます。

  • 写真01: Android 6.0.1では、米国の住所が認識されないほか、国際化ドメイン名によるメールアドレスも認識されていない

  • 写真02: Android 7.1.1では米国の住所が認識され、国際化ドメイン名によるメールアドレスも認識されている

  • 写真03: Android 8.0.0では、日本語の郵便番号の部分がリンクになっているが、これはどうやら電話番号と間違って認識したようだ

  • 写真04: Android 8.1.1では、日本語の郵便番号部分の誤認識はなくなったが、やはり日本語の住所を認識できなかった