テキストの類似度を使ってモジュールを判定してみよう
RPAエンジニア 大庭
Webサイトのリニューアルのとき、リニューアル前のページからリニューアル後のページにデータを移行することがあります。そのとき、リニューアル前のページで使われていたある1つのモジュールが何のモジュールか判断したいとします。人間の場合、ブラウザで表示されるWebページを見たり、ソースの内容からどのモジュールが使われているかを判断しますが、今回はUiPathのRPAロボットによって実験的にモジュールを判定する方法をご紹介します。
「StringSimilarity.NET」パッケージをプロジェクトにインストールする
UiPath Studioの画面の「パッケージを管理」リボンをクリックします。するとウィンドウが表示されるので、ウィンドウ左の「すべてのパッケージ」を選択して、検索ボックスに「StringSimilarity.NET」と入力します。パッケージ一覧の中にいくつか候補が表示されますが、パッケージ名が「StringSimilarity.NET」でバージョンが5.0.0(執筆時点の最新バージョンです)のものを選択します。ウィンドウ右上の「インストール」ボタンをクリックした後に右下の「保存」ボタンをクリックしてプロジェクトにパッケージをインストールします。
モジュールのテンプレートHTMLテキストファイルを用意する
リニューアル前のページで使われているモジュールのソースを記入したテンプレートHTMLテキストファイルを、モジュール1種類に対して1つずつ作成します。このとき、モジュール内のテキストや属性の値は空にします。ファイル名はそのモジュールだとわかるように命名します。作成したファイルは1つのフォルダーにまとめて保存しておきます。
モジュールごとにテキストや属性の値を空にする
リニューアル前のページからモジュールのHTMLを取得して、そのモジュールのテキストや属性の値を空にします。ここで、ページ全体のHTMLテキストの中からモジュールのHTMLテキストを取得したり、モジュール内のテキストや属性の値を空にする操作は、「AngleSharp」というパッケージをプロジェクトにインストールすることで実現できます。詳しい使い方についてはまた改めて別の記事でご紹介する予定です。
「StringSimilarity.NET」の使い方
まず、変数パネルで変数を追加します。型名を「F23.StringSimilarity.NormalizedLevenshtein」、既定値を「New F23.StringSimilarity.NormalizedLevenshtein()」として初期化します。次に、代入(System.Activities.Statements.Assign)アクティビティで右辺に「変数名.Similarity(比較したい文字列1, 比較したい文字列2)」と入力して、左辺にDouble型の変数を入力します。すると、左辺の変数に0から1の間の数値で2つの文字列の類似度が格納されます。
HTMLテキストの類似度を取得してモジュールを判定する
代入アクティビティで、右辺を「Directory.GetFiles(テンプレートHTMLテキストファイルを保存したフォルダーのパス)」とし、左辺に配列型の変数を入力して、テンプレートHTMLテキストファイルのパスの配列を取得します。繰り返し(コレクションの各要素)(UiPath.Core.Activities.ForEach)アクティビティでこの配列を指定します。
繰り返し内での操作
テキストファイルを読み込み(UiPath.Core.Activities.ReadTextFile)アクティビティで、配列の要素であるテンプレートHTMLテキストファイルのパスを指定してそのファイルを読み込みます。代入アクティビティを使って右辺を「変数名.Similarity(テキストや属性値を空にしたモジュールのHTMLテキストの変数, 読み込んだテンプレートHTMLテキストの変数)」とし、左辺をDouble型の変数とします。条件分岐(UiPath.Core.Activities.IfElseIf)アクティビティを使い、その数値がそれまでの繰り返しの最大値よりも大きかった場合、新しくその数値を最大値とし、読み込んだテンプレートHTMLテキストのファイル名を代入アクティビティを使って一時的に変数に格納します。そうすることで、繰り返し処理が終わったときに最も類似度の高かったモジュールが何かを、変数に格納されたファイル名から判定できます。
モジュールによっては、例えば画像の要素がaタグで囲われていたりいなかったりというHTMLテキストの揺らぎがあるので、完全にテンプレートHTMLテキストに一致していなくても、RPAロボットでどのモジュールの可能性が一番高いかを判定できます。ただ、HTMLの記述が似ているほかのモジュールと誤って判定する可能性もあるので、このやり方は補助的に使用するのが良いと思います。RPAロボットでのモジュールの判定は、最初にモジュールのタグ名やクラス名が一致するかどうかで判定して、それらが同じでHTMLの記述が異なる別々のモジュールがある場合などに今回の方法を使用するとよいのではないでしょうか。