【UiPath】RPA×AIを活用して個別のニーズに対応することをめざす(チャットボット、感情分析）


#0.はじめに
はじめまして、少し傾斜の傾いた安普請のアパートの17平米に潜む3年目SEです。

UiPathにはじめて関わったのは2017年の12月で、1年目のころ。
Orchestrator(以下OC)導入プロジェクトで、バージョンはたしかUiPath2016.4~2017.1でした。

当時は詳細な導入手順、[ステップバイステップ導入ガイド](https://www.uipath.com/ja/resources/whitepaper/orchestrator_install_guide)のようなものはなく、公式ガイドとフォーラムでAWSのEC2上にOCを構築する方法について試行錯誤していました。

其の後、プロジェクトを離脱しましたが
OCとElasticsearch/Kibanaの連携などさわる機会に恵まれました。

最近は、新人のOR黎明期にナレッジを書き溜めなかったことをすこし惜しんだり、
久しぶりにさわるUiPathの機能の変革に衝撃を受けたり、
コグニティブ・オートメーションアクティビティを触ったりするのが、UiPathとの接点です。

Ai.Computer Vision Activityのセットアップでつまづいた時の図(UiPathのバージョンが古かった)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/18d0b691-c034-d217-18c7-feca97992e67.png)

なお本記事の類似に以下の記事が有ります。
https://qiita.com/tyoko/items/5ac66dd903b6cc8ae773

#1.本記事で書くことのあらまし<a id="anchor2"></a>

RPAに限らずAI、つまりはML領域でできることをさがすと

**「①所感を感情分析して、ニュートラル~ネガティブであれば検知してアラートあげてくれると良いよね」**
**「②自分の選好にあうニュースをセレクトして、流してくれたら良いよね」**
と普段の会話から、ニーズを発見することがあります。

RPAの利点で、マクロと異なるのはシンプルなUIゆえの引継ぎやすさと作成の容易さで、一度作成するとマクロと比べて保守もしやすい。
よって上述の要求に対してRPAはシーズになります。

全体的に、あるいは部分的にそれらを実現する方法を探る（Tipsレベルで書き留める）のが本記事の趣旨です。

ところで先日、Fintechのカンファレンスに参加したところ、[2020を占う8つのトレンド](https://www.sbbit.jp/article/fj/37433?page=2#head3)のうち、
"行き過ぎたAIの是正"が2020年のトレンド候補として取り上げられていました

最近では[AI採用によるモラル低下](https://www.businessinsider.jp/post-200122)が取り沙汰されていますが、ハイパーパーソナライゼーションによる表裏が、来年も続きそうです。

個人的には個のニーズに対応できるのがAIの美点と考えていて、
私生活でもSELFというアプリで新宿二丁目のデータを学習した[ユキオ](https://prtimes.jp/main/html/rd/p/000000008.000018339.html)という人工知能エンジンとやりとりしても、ツッコミが個別具体的な様をみるとそう思います。
AIは学習次第でevilになるケースもありますが、モラルを学習できるのであれば[AI上司](https://ifuu-doudou.com/aiboss/aigm/index02/)に期待できるところです。


#2.実装

##2.1. 環境準備

###2.1.1 インスタンス作成

※端末のライセンスが切れてしまったので、AWSのEC2上でCommunity版を稼働させます。

Win10の任意のAMIを選択しています。
・AMI:Microsoft Windows Server 2019 Base-2019-11-13-AutogenByAWSMP
・Instance Size:t2.micro
・total memory:1GB
・UiPath Community Edition 2019.5

作成したEC2に接続してUiPathを起動。[Activate]します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/79f1f9c5-e9cf-5031-7c6f-2716581f5756.png)

また[Machine]接続の為、hostnameを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/e9780fb4-2350-2500-b376-dfa1b0f7a250.png)


###2.1.2 ロボット接続

[OCのデモサイト](https://cloud.uipath.com/)でOC側の設定をします。[MACHINES]ではさきほど確認したhostnameで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/a93702fc-7709-9692-72f0-013ee0ecf3ed.png)

※デモサイトの新規登録の方法は⇒[他の方のサイト](https://www.cresco.co.jp/blog/entry/11387/
)をご参照ください。

Robotの登録についても画面上でできるのですが
[Orchestrator API](https://www.uipath.com/hubfs/Documentation/OrchestratorAPIGuide_2016.2/UiPathOrchestratorAPIGuide_2016.2.html#AddRobot)に慣れるため、APIを叩いて登録します。
※その前に、[Environment]が必要とorchetrator API referenceに載っているため、[Environment]を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/ca3caaf6-2dc5-e590-ea30-23208b7e3707.png)



[PostWoman](https://postwoman.io/?method=POST&url=https://platform.uipath.com/odata/Environments(1)/UiPath.Server.Configuration.OData.AddRobot&contentType=application/json)を使用して、OrchestratorのAPIを叩きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/61c9e894-82e9-45d7-28d7-a24b8cf1054b.png)
※このときPostWomanのProxy設定をenabledにします。disableではPOST送信できないようです。
[12/25現在]robotの作成確認ができず、手動で追加しました。




クライアント側にもどります。
OC側ロボット作成時に発行された[Machine Key]をUiPath Robotに入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/9c2876cd-5fea-0903-b6d4-6b09ebb80a8f.png)

接続準備は完了です。

パッケージのダウンロードも進めておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/412329d0-6bfe-9c88-1e12-4584bfca5526.png)

##2.2ネガティブな文体を検知し、slackに送る

アウトラインは以下です。 以下、ⅳ:に焦点を当てます。

ⅰ:　未読メールで日報が件名に入ってるものを検出
ⅱ:　[所感]の文字列をアンカーに、所感の内容を取得
ⅲ:　自然言語処理解析にかけて、極性　ポジ(+) ネガ(-) ニュートラル(±)のスコアを算出
ⅳ:　基準値以上のネガ(-)スコアであれば、slackに通知


ii):は社内ポリシーの関係で、UiPathでさくっと実現するには厳しく。GASで雰囲気だけ参考に。
※Googleアカウントの2段階認証の設定が外れていると、アプリパスワードが発行できず、
gmailのアクティビティが使用できない。
代替として、GASでGSSに文章を溜めることを考えましたが、（12/25現在）未試行。

```javascript:件名マッチング
function Function(){
  // 件名のマッチング
var regBiz = new RegExp('*日報' + '.*?')

  // 最大スレッド数
  var MAX_THREADS = 30;// 
 
  var cnt = 0;  
// 受信トレイのメッセージを取得する  
var threads = GmailApp.getInboxThreads(0, MAX_THREADS);  
Logger.log("len="+threads.length); 
for (var i = 0; i < threads.length; i++) 
{    var thread = threads[i];  
 var subject = thread.getFirstMessageSubject();   
      if (!subject.match(regBiz)) 
        continue;   
      // スレッド内のメッセージを取得する   
        var messages = thread.getMessages();    
        var msg = messages[messages.length - 1];   
      // 未読のメッセージのみ処理する    
        if (!msg.isUnread()) continue;    
          msg.markRead(); // 既読にする    
         // ネットから情報を取得する   
         try {      // JSONデータを受信    
           var text = UrlFetchApp.fetch(apiURI).getContentText();     
           var obj = JSON.parse(text);     
           // 値を取り出す      
           var title = obj["title"];    
           var desc = obj["description"]["text"];   
```         
      
ⅲ:　UiPathでは以下のアクティビティがよさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/8b97d157-45bb-de60-0a87-4445a33471e8.png)

あるいはSatnfordのNLPアクティビティが使えるので、
以下のコードを書かなくとも実装が可能です。

```java:NLP
package test;
import java.util.List;
import java.util.Properties;

import edu.stanford.nlp.ling.CoreAnnotations.NamedEntityTagAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.TextAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;

/**
 *  ner sammple
 *
 */
public class NERSample {
    public static void main(String[] args) {
        String text = "I ask everyone to not rush to judgment and allow the investigation to be completed,"
                + " Orange County Sheriff Jerry Demings said at a news conference in Orlando.";

        Properties properties = new Properties();
        properties.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner");
        StanfordCoreNLP coreNLP = new StanfordCoreNLP(properties);
        Annotation annotation = new Annotation(text);
        coreNLP.annotate(annotation);
        List<CoreLabel> labels = annotation.get(TokensAnnotation.class);
        for (CoreLabel label : labels) {
            System.out.println(label.get(TextAnnotation.class) + "\t"
                    + label.get(NamedEntityTagAnnotation.class));
        }
    }
}
```  

ⅳ：slackに通知の準備として、下記の[Bot User OAuth Access Token]を控えます。[Client ID]やその他もろもろのTokenが載っている画面ではないので注意します。
https://docs.uipath.com/studio/lang-ja/docs/enabling-gmail-for-email-activities

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/0aeaf1b3-0020-f6c6-9de3-f6d1448ba58f.png)

UiPath⇒Slackの通知に、Paul SealさんのSlackBotMessagesを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/53877f70-9672-b62d-ae6e-bb5ec176e1c2.png)

Send Slack messageアクティビティのパラメータは最低限Token([Bot User OAuth Access Token]持たせる)とchannel or mailaddress & Messageの入力が必要のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/f4e619be-eeb4-decb-5c44-3c6a21bc565a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198177/7769048f-fe5c-45d0-7d0c-9ae3b30ad75e.png)

slackからRobotを起動するには、
POST https://platform.uipath.com/odata/Jobs/UiPath.Server.Configuration.OData.StartJobs
を改良すればよさそうで、outgoingwebhookを使用し、
slack⇒OC⇒slackの流れが実現できそうですが、今回はここまでにします。



#あとがき


UiPathの機能は驚くほど柔軟なので、
slackからOrchestratorを呼ぶ手順が充実することで、[チャットアプリとRPAとの連携](https://thinkit.co.jp/article/16756?page=0%2C1)のように、個人の用途にあったRobotがより浸透するというのが本記事試みての実感でした。


#参考
[1]https://www.cresco.co.jp/blog/entry/11387/
[2]https://qiita.com/hiroeis/items/c48c23f09010467b8b90
[3]https://dev.classmethod.jp/cloud/aws/analysis-sentiment-using-analysis-jobs-on-amazon-comprehend/
[4]http://arakilab.media.eng.hokudai.ac.jp/~ptaszynski/data/2011.02.24_HRC-Symposium.pdf
[5]https://gallery.uipath.com/packages/UiPathTeam.SendSlackMessage.Activities/
[6]https://docs.uipath.com/activities/lang-ja/docs/google-vision-text-detection
[https://gendai.ismedia.jp/articles/-/65769?page=4]
[7]https://www.businessinsider.jp/post-200122
[8]https://stories.mlh.io/make-robots-automate-your-life-or-at-least-your-email-d728342257e4
[9]https://docs.uipath.com/studio/lang-ja/docs/enabling-gmail-for-email-activities
[10]https://qiita.com/toshiyuki_tsutsui/items/604f92dbe6e20a18a17e
[11]https://uipath-ai-expo.jp/
[12]https://qiita.com/miriwo/items/11b717dfc501b5b4e286