チャットボットの仕組み

### チャットボットの種類
ルールベース
L ルールに沿った反応をする

機械学習型
L あらかじめ学習させた膨大なデータの中から、人工知能が最も適したと判断した回答

### チャットボットの仕組み
キーワード分析
L キーワードに対する回答をデータベースから探す

回答
L 自分で言葉を組み立てる能力がないため、設定したデータベースから回答を選び返答される
L データベースを充実させるほど、たくさんの質問を答えることができる

形態素分析して、単語の配列の中にキーワードが含まれていれば、決められた回答を行う でOK?

array_intersectで配列の中にキーワードが含まれているかで回答する。

$query = ["商品","の","見積もり","金額","教えて","欲しい"];
// $wo = ["昨日","買った","商品","を","返金","したい"];
$estimate = ["見積","見積もり","予算"];
$company = ["会社","社長","地図"];
$refund = ["返金","お金","返せ","ふざけるな"];

if(count(array_intersect($estimate, $query)) != 0) {
	echo "営業担当よりご案内いたします。";
} elseif (count(array_intersect($company, $query)) != 0) {
	echo "会社情報をご覧ください";
} elseif (count(array_intersect($estimate, $query)) != 0) {
	echo "コンタクトセンターにお繋ぎいたします。";
} else {
	echo "本日の営業は終了しました。";
}

これ、チャットボットの意味あんのか?? 
問い合わせの数を減らしても顧客満足度が上がっているかは謎だな。

再配達依頼とか、決まった要望に対して一定のルールで入力を促すのはわかるが。。。
& 機械学習型のチャットボットは気になるな。

「この商品を買った人はこんな商品も買っています」を実装したい

この商品を買った人はこんな商品も買っています をやりたい。割とマジで。
テンション・リダクション効果があるらしい。Amazonの商品レコメンドやYoutubeの動画

yahoo shopping: この商品を見た人は、こんな商品にも興味を持っています
楽天: この商品を見ている人はこちらもチェック
amazon: この商品に関連する商品, よく一緒に購入されている商品

アルゴリズム
L 協調フィルタリング -> 好みが近い人が好きな商品をオススメする

{ “Aさん”:[ “商品A”, “商品B”}, “Bさん”: [“商品C”, “商品G”, “商品H”], … }
レコメンド対象との共起数をとり、共起数が高い順にオススメとして表示する
お客さんごとに、「Aさんの買った商品の集合」と「そのお客さんの買った商品の集合」の積集合の長さを取る

### ロジックのイメージ
自分の買った商品 a b c
Aさんの買った商品 b c d
Bさんの買った商品 d
Cさんの買った商品 f g
Dさんの買った商品 a e

自分の買った商品と近いのはAさん -> dをレコメンド
次に自分の買った商品と近いのはDさん -> 次にeをレコメンド
まだ購入してない時は売れ筋商品をレコメンド

こんな感じ?

### 配列の持ち方
一緒に買われている商品を配列に持って、カウントしていく

こういうデータがあるとする。
山田 a
山田 b
山田 c
田中 b
田中 f
佐藤 a
佐藤 g
後藤 e
後藤 f

一緒に買われている商品なので、同じ人をforループで回して、商品ごとに一緒に買われている商品をkey(商品)とvalue(一緒に買われている類似度)で追加していく
a => [b =>1, c=>1]
b=>[a=>1, c=>1]
c=>[a=>1, b=>1]
b=>[a=>1, c=>1, f=>1]
f=>[b=>1]
a=>[b=>1, c=>1, g=>1]
e=>[f=>1]
f=>[b=>1, e=>1]

つまり、outputを見ると、まず商品ごとの変数が必要

初期データ
$data => [ $山田[a, b, c], $田中[b, f], $佐藤[a, g], $後藤[e, f]]


$山田の中でforeach, $田中の中でforeach, $佐藤の中でforeach

商品一覧の配列から各商品ごとの一緒に買われている商品の連想配列をkey順にソートして出力

これ、別にpythonじゃなくても何の言語でもできそうやな
まず、注文データから初期データを作って、それからforeachをして、次に出力
とりあえず作ってみよう 頭使うからチョコレート食べながらコーディングしたい

決済系APIを実装したい

### PayPal
月間のペイパルによる売上高
30万円以下:3.6 % + 40 円 / 件
30万円超 100万円以下:3.4 % + 40 円 / 件
100万円超 1,000万円以下:3.2 % + 40 円 / 件
1,000万円超:2.9 % + 40 円 / 件

paypalの実装方法:
https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7

### Stripe
手数料:3.6%
-> smartHR, Booking.com, slack, shopify, freee, cookpad
-> Ruby, Java, Scala and Javascript

### PAY.JP
ベーシックプラン
月額費用:0¥
visa / master:3.0%
jcb / american express / dinersclub /discover:3.6%

プロプラン
月額費用:10,000¥
visa / master:2.59%
cb / american express / dinersclub /discover:3.3%

-> クレジットカード決済を導入できる
-> bizreach, baseなど

### Square
https://squareup.com/jp/ja
3.6%(Visa/MasterCard/American Expressのみ)
-> 決済種類豊富
-> HPを見る限り、店舗中心か

とりあえず、上から順番に試していきますかー

yahoo shoppingの買い物カゴの挙動とID

ヤフーショッピングの買い物カゴの挙動を調査する

### 商品詳細ページ


yahooも商品ID:523085をURLにしています。

https://store.shopping.yahoo.co.jp/insair-y/523085.html
https://store.shopping.yahoo.co.jp/${shopID}/${itemID}.html

vwitem:523085, vwcatalog:insair-y, vwquantity
addcartでカートに商品を入れている。

<form name="addCart" action="https://order.shopping.yahoo.co.jp/cgi-bin/cart-form" method="post" accept-charset="EUC-JP" onsubmit="return false;">
                            
                            
<input name="vwitem" type="hidden" value="523085">
<input name="vwcatalog" type="hidden" value="insair-y">
<input name=".autodone" type="hidden" value="https://store.shopping.yahoo.co.jp/insair-y/523085.html">

// 省略
<input name="vwquantity" type="text" value="1" class="elTextBox" maxlength="3" onclick="this.select(0, this.value.length);" data-updown-quantity-box="">

js

$(function() {
    YAHOO.JP.shp.common.getSeleptah.init({
        domain     : 'https://store.shopping.yahoo.co.jp',
        deviceType : 'pc',
        position   : 1,
        moduleNum  : 5,
        itemId     : 'insair-y_523085',
        pcatId     : '22664',
        genre      : '49495',
        brand      : '113',
        price      : 12000,
        service    : 'shp',
        targetId   : 'seleptahItems',
        apicrumb    : 'hogehoge',
        ruleBucketId : '',
    });
});

商品をカートに入れる

<p class="elWrpButton" id="cartbtn">
        <a href="javascript:void(0);" class="elCartButton elButton" data-ylk="sec:cartbtn;slk:addcart;pos:0;">
            <span>商品をカートに入れる</span>
        </a>
    </p>

Commerce21iframeJsの記載があり、Commerce21をベンダーに使っている様に見える。

### ショッピングカート

数量変更

<a href="javascript:void(0);" style="display:none;" id="afterBuy-insair-y-0" data-ylk="slk:buyltr;pos:1"></a>                                     <script>
                                        document.write('<ul class="elFunction"><li class="elLater"><label><input type="checkbox" name="chk-insair-y-0" value="サウンドバー スピーカー サウンドスピーカー テレビスピーカー スピーカー Bluetooth 壁掛け 高音質 HT-SB-115  ホームシアター アイリスオーヤマ"><span class="elLabel">後で注文する</span></label></li></ul>');
                                    </script>

削除

<script>
                        document.write('<input type="text" name="item_num-0" id="dcNum03hogehoge" maxlength="3" class="dcNum dcMeiryo" value="1" >\
                        <input type="submit"name="delete-293201139" value="削除" class="dcOrderDelete" id="dhogehoge" data-ylk="slk:delete;pos:1">');
                        </script>

js

 item: [{name: "サウンドバー スピーカー サウンドスピーカー テレビスピーカー スピーカー Bluetooth 壁掛け 高音質 HT-SB-115  ホームシアター アイリスオーヤマ", id: "insair-y_523085", store_id: "insair-y", product_category: "22664", price: 12000, num: 1, sum_price: 12000, point: 120, rate_point: 1}]

商品詳細とカートの挙動は大枠は掴めたので次はテストコードと行きたい。

rakutenの買い物カゴの挙動とID

楽天の買い物カゴの挙動とIDの使われ方を調査する

### 商品詳細ページ

ソースを見ると、URLの”gcv1-bk-w”が商品IDで、”item_number”として全てのkeyになっている様に見える。
item_numberとは別にitem_id 10000201がある。
shop_idはintの6桁の数字

<input value="331955" type="hidden" name="shop_id"><input value="ネスプレッソ公式 楽天市場店" type="hidden" name="shop_name"><input value="10000201" type="hidden" name="item_id"><input value="【公式】ネスプレッソ カプセル式コーヒーメーカー ヴァーチュオ ネクスト C クラシックブラック GCV1-BK-W | コーヒーメーカー コーヒーマシン エスプレッソマシーン おしゃれ 一人暮らし 家庭用 本格 一人用 コーヒー カプセル お手入れ簡単 Nespresso" type="hidden" name="item_name"><input value="GCV1-BK-W" type="hidden" name="item_number"><input value="nespresso" type="hidden" name="shopurl"><input value="/nespresso/gcv1-bk-w/" type="hidden" name="pageurl">

買い物かごへのbutton
->
-> 数量はunitsで管理している。

<form method="post" id="purchaseForm" data-timesale-id="10000201" action="https://basket.step.rakuten.co.jp/rms/mall/bs/cartadd/set?l2-id=item_PC_SingleNormalItem">
// 省略
<td class="floatingCartPurchaseButtonsContainer"><span class="unit">個数&nbsp;
</span><input value="1" type="text" size="4" name="units" id="units" class="rItemUnits"><span class="floatingCartSplitButtons"><span class="floatingCartSplitButtons">
// 省略
<span class="cart-button-container"><button data-ratParam="all" data-ratId="fixed_add" data-ratEvent="pv,appear" class="cart-button add-cart new-cart-button "><span class="normal"><img src="https://r.r10s.jp/com/img/rms/storefront/pc/page/plussign_23x23.png"><span>商品をかごに追加</span></span></button>

__event、shop_bid(shopid), item_id, inventory_flagを送っている。

<input value="ES01_003_001" type="hidden" name="__event"><input value="331955" type="hidden" name="shop_bid"><input value="10000201" type="hidden" name="item_id"><input value="1" type="hidden" name="inventory_flag">

買い物カゴへの追加はページ遷移していないので、onClickイベントでJSでやっているっぽい。

### 買い物カゴのページ

数量変更

				<select id="units_hogehoge" class="change-units" name="units&#91;0&#93;" autocomplete="off">

 
					<option value="1"  selected>1</option>
	<option value="2" >2</option>
	<option value="3" >3</option>
	<option value="4" >4</option>
	<option value="5" >5</option>

削除

<span class="remove-button">
				<a href="#" id="cartdelete_331955_hogehoge" class="cart-delete ratCustomEvent" data-rat-key="ratcart" data-rat-val="delete_pc">削除</a>
			</span>

js

	grp15_ias_prm = {
		rakuten_pid: 2,
		service: 'ICHIBA',
		page: 'cart',
		d: 'pc',
		shopid: ['331955'],
		itemid: ['nespresso:10000201'],
		genreid: ['565115'],
		itemname: 
                 // 省略

ratTag
-> shopIDとitemIDで管理している。
-> ItemGenreのIDもあり。

<form class="ratForm" name="ratForm" id="ratForm" style="display:none;">
		<input type="hidden" name="rat" id="ratAccountId" value="1">
		<input type="hidden" name="rat" id="ratServiceId" value="3">
		<input type="hidden" name="rat" id="ratPageLayout" value="pc">
		<input type="hidden" name="rat" id="ratSiteSection" value="checkout">
		<input type="hidden" name="rat" id="ratAdobeSiteSection" value="cart">
		<input type="hidden" name="rat" id="ratPageType" value="cart_modify">
		<input type="hidden" name="rat" id="ratPageName" value="step0_shopping_basket">
		<input type="hidden" name="rat" id="ratCheckout" value="">
		<input type="hidden" name="rat" id="ratItemId" value="331955/10000201">
		<input type="hidden" name="rat" id="ratPrice" value="25300">
		<input type="hidden" name="rat" id="ratItemCount" value="1">
		<input type="hidden" name="rat" id="ratItemGenre" value="565115">
		<input type="hidden" name="rat" id="ratItemTag" value="">
		<input type="hidden" name="rat" id="ratItemVariation" value="&#91;{}&#93;">
		<input type="hidden" name="rat" id="ratOrderId" value="">
		<input type="hidden" name="rat" id="ratCouponId" value="">
		<input type="hidden" name="rat" id="ratCouponPrice" value="">
		<input type="hidden" name="rat" id="ratPointPrice" value="">
		<input type="hidden" name="rat" id="ratShippingFee" value="">
		<input type="hidden" name="rat" id="ratOrderList" value="">
		<input type="hidden" name="rat" id="ratTotalPrice" value="">
		<input type="hidden" name="rat" id="ratItemCountOrder" value="">
		<input type="hidden" name="rat" id="ratCvEvent" value="{'cart_go_checkout':1, 'cart_add':0}">
		<input type="hidden" name="rat" id="ratShopUrlList" value="nespresso">
		<input type="hidden" name="rat" id="ratCustomParameters" value="{'cart_type':'cart_view', 'display_of_card_packaged_registration':'0', 'asuraku_item_flg':'0', 'deal_item_flg':'1', 'rba_item_flg':'0', 'rba_order_flg':'', 'set_deliverydate':''}">

いやーこれ結構大変だなー

amazonの買い物カゴの挙動を見よう

amazonの買い物カゴで、IDをどう使っているのか調査する

### amazon

カートに入れるbuttonがinput type=”submit”としています。

<span class="a-declarative" data-action="dp-pre-atc-declarative" data-dp-pre-atc-declarative="{}" id="atc-declarative">
<span id="submit.add-to-cart" class="a-button a-spacing-small a-button-primary a-button-icon"><span class="a-button-inner"><i class="a-icon a-icon-cart"></i><input id="add-to-cart-button" name="submit.add-to-cart" title="カートに入れる" data-hover="左から&lt;b&gt;__dims__&lt;/b&gt;を選択して&lt;br&gt;ショッピングカートに追加" class="a-button-input" type="submit" value="カートに入れる" aria-labelledby="submit.add-to-cart-announce"><span id="submit.add-to-cart-announce" class="a-button-text" aria-hidden="true">カートに入れる</span></span></span>
</span>

“a”:”B08C9R7MVT”,”quantity”:”1″と書いてあるので、恐らくB08C9R7MVTが商品IDではないかと思う。

<script type="a-state" data-a-state="{&quot;key&quot;:&quot;turbo-checkout-page-state&quot;}">{"turboWeblab":"RCX_CHECKOUT_TURBO_DESKTOP_NONPRIME_87784","strings":{"TURBO_CHECKOUT_HEADER":"今すぐ購入:ナパバレーの日本人醸造家 ハヤシワインズ 2015 パウロニア・カベルネソーヴィニヨン [カリフォルニア/赤ワイン/750ml]","TURBO_LOADING_TEXT":"注文内容を読み込み中"},"inputs":{"a":"B08C9R7MVT","quantity":"1","oid":"","addressId":""},"configurations":{"isSignInEnabled":true,"initiateSelector":"#buy-now-button","prefetchEnabled":true},"buttonID":"buy-now","eligibility":{"isEligible":false},"turboWeblabTreatment":"T2","timeout":"5000"}</script>
</div>

商品ページのcookie

商品追加

やはり、”B08C9R7MVT”を渡しています。

<div id="huc-v2-order-row-item-B08C9R7MVT" data-asin="B08C9R7MVT" data-itemid="Ca5ba925d-a3ea-4f29-b288-38f3bfe04fe2" class="a-box a-box-thumbnail huc-middle-vertical huc-no-radius huc-v2-order-row-image-box huc-green-border huc-v2-order-row-item"><div class="a-box-inner">
    <img alt="" src="https://m.media-amazon.com/images/I/31j5L8Leq4L.jpg" class="huc-no-radius huc-v2-order-row-image huc-v2-table-col">
  </div></div>

ここで、Cookieを見ても、どの値が商品のCookieかは不明

カートの編集ページ

数量変更
-> name=”quantity”としているので、quantityで管理している事がわかる。

<span class="a-dropdown-container"><label class="a-native-dropdown">数量:<span class='sc-offscreen-label' aria-label='数量'></span></label><select name="quantity" autocomplete="off" data-a-touch-header="数量" tabindex="0" data-action="a-dropdown-select" class="a-native-dropdown a-declarative">
            
            
                <option value="0" data-a-css-class="quantity-option">
                    0 (削除)
                </option>
// quantity
<input name="submit.update-quantity.hogehoge38f3bfe04fe2"
       value="更新"
       data-action=""
       aria-label="更新"
       type="submit"
       class="a-color-link"/>

                    </span>

削除

<input name="submit.delete.hohoge"
       value="削除"
       data-action="delete"
       aria-label="削除 ナパバレーの日本人醸造家 ハヤシワインズ 2015 パウロニア・カベルネソーヴィニヨン &#91;カリフォルニア/赤ワイン/750ml]"
       type="submit"
       class="a-color-link"/>
            </span>

なるほど、商品カートは基本、商品IDとquantityで管理し、カートではquantity(数量)とdelete(削除)の機能があるって事がわかった。

景気動向指数(CI)のAPI取得 その2

総務省統計局の景気動向指数統計データをJSON形式で取得をしたい。

※民間企業の勤務条件制度等調査を表示した例

– 統計表情報取得仕様
https://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?<パラメータ群>

API仕様
appId, lang,surveyYears, openYears, statsField …

1. アプリケーションIDの発行
e-statマイページのAPI機能(アプリケーションID発行)から、appIdを発行する
*************

2. 景気動向指数のデータセット
景気動向指数
統計ID:00100406

-> Excelのみ、DB/APIは提供されていない
-> ExcelのファイルID(statInfId)の命名規則が分かればDL出来そうではある
-> 速報値は月次で5営業日に出している


-> RSSも見つけられない

### 日銀の機械学習による景気分析
「景気ウォッチャー調査」のテキストマイニング―
-> 少しだけ読んだが、テキストマイニングも先行指標の一部なので、テキストマイニングだけで景気動向指数として公表するのは抵抗がある。

別の方法を模索するか。

景気動向指数(CI)のAPI取得 その1

景気動向指数(composite indexes)をAPIで取得/自動更新したい

景気動向指数とは?
内閣府:景気統計
> 景気動向指数は、生産、雇用など様々な経済活動での重要かつ景気に敏感に反応する指標の動きを統合することによって、 景気の現状把握及び将来予測に資するために作成された指標

1.採用系列
(1)生産 (2)在庫 (3)投資 (4)雇用 (5)消費 (6)企業経営 (7)金融 (8)物価 (9)サービス

2.選定基準
(1)経済的重要性
(2)統計の継続性・信頼性
(3)景気循環の回数との対応度
(4)景気の山谷との時差の安定性
(5)データの平滑度
(6)統計の速報性

3.景気循環の考え方
先行(主に需給の変動)、一致(主に生産の調整)、遅行(主に生産能力の調整)

4.変動算出
対象変化率 = { (当月値 – 前月値) / ((当月値 – 前月値)/2) } x 100

5.採用系列
– 先行系列
最終需要財在庫率指数、鉱工業用生産財在庫率指数、新規求人数、実質機械受注、新設住宅着工床面積、消費者態度指数、日経商品指数、マネーストック(M2)(前年同月比)、東証株価指数、投資環境指数、中小企業売上げ見通しDI

– 一致系列
生産指数、鉱工業用生産財出荷指数、耐久消費財出荷指数、所定外労働時間指数、投資財出荷指数、商業販売額、商業販売額、営業利益

– 遅行系列
第3次産業活動指数、常用雇用指数、実質法人企業設備投資、家計消費支出、法人税収入、完全失業率、きまって支給する給与(製造業、名目)、消費者物価指数、最終需要財在庫指数

経済社会総合研究所の実績値数値はPDFで公開されているが、APIはないのかな。

色々見ていたところ、e-Stat開発者向けページがあるようです。
e-Stat API機能
なんか出来そうです。取り敢えず登録しました。

SAPのようなERPをDjangoで作りたい

ERPとは? : Enterprise Resource Planning(統合パッケージ)
-> 調達システム、経理システム、在庫システムなどヒトモノカネ情報の管理を一緒にした

### SAPの主なモジュール
– Financial Accounting(FI): 財務会計、業務データが流れてくる
– Controling(CO): 管理会計、業績管理や間接費の管理
– Sales and Distribution(SD): 販売管理、注文を受けてから商品を出荷、請求書
– Material Management(MM): 在庫購買管理、どこに何を発注したか、値段、在庫

### モジュール一覧
Sales and Distribution(販売管理), Material Management(在庫購買管理), Production Planning and Control(生産計画/管理), Plant Maintenance(プラント保全), Warehouse Management(倉庫管理), Financial Accounting(財務会計), Controlling(管理会計), Human Resources(人事管理), Project System(プロジェクト管理), Quality Management(品質管理), Investment Management(設備投資管理), Real Estate(不動産管理), Document Management System(文書管理), Classification(分類), クロスアプリケーション(Cross Application)

SAP Tutorial

– 各システムのログイン画面
– メニュー:各システム一覧(office, logistics, accounting, human resources….)
 L 各システムの帳票ページに遷移できる
– 各入力メニュー
 L ユーザが入力データのパラメータを編集できる
– IDEがトップにあり、その下に、地域、国、システム、従業員、ポジション、機能などでカテゴライズできる
– Masterデータ(client, company, sales area, personal record)と入力データを切り分ける
– メニューはツリー構造で表示する

SAP Engineer

ざっくりとは、各モジュールごとにアプリケーションを作っていき、データ連携させるってことだな。
ゼロから作るなら、(1)販売管理、(2)在庫購買管理、(3)財務会計 ぐらいから始めたいところか。
問題はどこまでやり込むかだな。

プログラミング言語 人気ランキングの比較

### TIOBE
ロジック : Index Definition
-> 検索エンジンに対して、クエリを発行した結果を元にランキングを付けている。

+"<language> programming"

1位 Java, 2位 C, 3位 Python, 4位 C++, 5位 C#, 6位 Visual Basic.NET, 7位 JavaScript, 8位 PHP, 9位 SQL, 10位 Go

### PYPL
1位 Python, 2位 Java, 3位 Javascript, 4位 C#, 5位 PHP, 6位 C/C++, 7位 R, 8位 Objective-C, 9位 Swift, 10位 Matlab
ロジック: The Index is created by analyzing how often language tutorials are searched on Google

### RedMonk: Programming Language Ranking
ロジック: GitHubのアクティブリポジトリ、StackOverflowでの質問、Redditでの投稿数、求人サイトでの募集の数
1位 JavaScript, 2位 Python, 3位 Java, 4位 PHP, 5位 C#, 6位 C++, 7位 Ruby, 8位 CSS, 9位 TypeScript, 9位 C

### GitHub Octoverse
Top OSS
1位 microsoft/vscode, 2位 MicrosoftDocs/azure-docs, 3位 flutter/flutter, 4位 firstcontributions/first-contributions, 5位 tensoflow/tensorflow, 6位 facebook/react-native, 7位 kubernetes/kubernetes, 8位 DefinitelyTyped/DefinitelyTyped, 9位 ansible/ansible, 10位 home-assistant/home-assistant

Top Language
1位 JavaScript, 2位 Python, 3位 Java, 4位 PHP, 5位 C#, 6位 C++, 7位 TypeScript, 8位 Shell, 9位 C, 9位 Ruby

Google indexとGitHubだとランキングに差があるが、概ねJava, Python, JavaScriptが上位はほぼ変わらずか。