契約番号 01 第 016 号 高度情報化支援ソフトウェアシーズ育成事業 データマイニングにおける最適区間相関ルールの 効率的発見を支援するシステムの開発 A Data Mining System for Supporting Efficient Discovery of Association Rules with Optimized Ranges 論 文 平成 14 年 1 月 株式会社東大総研 胡 振江 (Zhenjiang Hu) 東京大学大学院 情報理工学研究科 〒113-0033 東京都文京区本郷 7-3-1 E-mail: [email protected] 2 Java は, 米国およびその他の国における米国 Sun Microsystems, Inc.の商標もしくは登録商標 です. その他, 本文中に現れる商品名などは各販売元または開発メーカーの登録商標または製品 です. なお, 本文中では TM マークなどは明記していません. 3 和文概要 膨大な蓄積データから相関関係のある有意義な情報を抽出するデータマイニングの理論や技術 へ の 需 要 が こ こ 数 年 大 き く な っ て き て い る. マ ー ケ ッ ト バ ス ケ ッ ト 分 析 (market basket analysis) に対する相関ルールの抽出は, データマイニングにおける計算上難しく重要な問題で ある. 有意義な相関ルールの抽出のため, 我々は次のようなデータマイニングシステムを実装し た. まず, 異なる大きさのデータベースを効率的に扱うため, 標準的な Apriori アルゴリズムと, 我々が最近提案した新しいアルゴリズムの二つのアルゴリズムを統合した. 次に, 最適区間相関 ルールの抽出において複雑な条件を指定することができるようにした. このシステムを喫茶店の POS データベースを使ってテストした. 実験の結果から有意義な相関ルールの抽出において, 我々のシステムは高速かつ実用的であることが検証された. 4 ABSTRACT The general goal of data mining is to extract interesting correlated information from large collection of data. A key computationally-intensive subproblem of data mining involves mining association rules for market basket analysis. To help extracting useful association rules, we implemented a data mining system, which not only unifies the two algorithms (the standard Apriori algorithm and our new algorithm proposed recently) to deal with different size of database in a more efficient way, but also allows one to specify involved conditions to mine association rules with optimized ranges of his interest. We have test our system using the POS database from a coffee shop, and the experimental results indicate that out system if both fast and practical for mining useful association rules. 5 ― 目 次 ― 1. 背景と目的............................................................................................................ 7 2. 技術開発の内容 .................................................................................................. 10 2.1. 相関ルールの抽出アルゴリズム実現.......................................................................10 2.2. 最適区間相関ルールの抽出アルゴリズムの実現..................................................... 11 3. システムの開発・実装........................................................................................ 12 3.1. システムの全体像...................................................................................................12 3.2. 機能およびその構成要素 ........................................................................................13 3.2.1. 相関ルールの効率的な抽出機能 ............................................................................... 13 3.2.2. 最適区間相関ルールの抽出機能 ............................................................................... 17 4. 評価・考察.......................................................................................................... 21 4.1. 稼働環境 .................................................................................................................21 4.2. CSV 形式データベース仕様....................................................................................21 4.3. システムの評価 ......................................................................................................22 5. 終わりに ............................................................................................................. 25 5.1. まとめ.....................................................................................................................25 5.2. 今後の課題 .............................................................................................................25 6. 参考文献 ............................................................................................................. 26 6 1. 背景と目的 高度情報化支援ソフトウェアシーズ育成事業の研究テーマ 「データマイニングにおける最適区 間相関ルールの効率的発見を支援するシステムの開発」 は, 実施者の独創的な技術シーズの掘り 起こしなどを行い, 将来的に有望と考えられるソフトウェアに関する研究開発を推進し, 産業分 野への技術移転を目指すものである. 近年, バーコードやクレジットカードなどのデータ収集技術の大幅な進歩と, 記憶装置の劇的 な低価格化によって, 非常に膨大なデータを蓄積することができるようになった. このようにし て蓄積された膨大なデータから, 例えば 「目玉商品 A を購入した顧客は高い確信度で日用品 B を 購入する」 という規則が得られたとすれば, 目玉商品 A が他のどの日用品 B の売上に貢献するか が明瞭になる. さらに目玉商品 A を購入した顧客の何パーセントが日用品 B を購入するかが分か れば, 売上の予測にもある程度つながる. このように, 膨大なデータの中から, 無関係に見えそう なデータ間の関係を見つけだしたり有用な情報だけを選り分けたりする, データマイニングの理 論や技術への需要がここ数年大きくなってきている. 「目玉商品 A を購入した顧客は高い確信度で日用品 B を購入する」 という規則を (目玉商品 A = yes) ⇒ (日用品 B = yes) と表現する. 一般に, A, B, C, D, …をあるデータベースの項目とするとき, (A = a) AND (B = b) ⇒ (C = c) AND (D = d) という形をした規則を相関ルール (association rule) と呼ぶ. また, 相関ルールの左辺を 「前項 条件」, 右辺を 「後項条件」 と呼ぶ. このような相関ルールの価値を判定する基準として, サポー ト (support), コンフィデンス (confidence), ゲイン (gain) の 3 つが存在する. • サポート: 前項条件と後項条件とを同時に満たすデータの, 全データに対する割合. サポート= • 前項条件と後項条件とを同時に満たすデータ数 全体のデータ数 コンフィデンス: 前項条件を満たすデータのうち, 後項条件も同時に満たすデータの割 合. コンフィデンス= 前項条件と後項条件とを同時に満たすデータ数 前項条件を満たすデータ数 7 • ゲイン: 前項条件と後項条件とを同時に満たすデータの割合と, 前項条件の割合に最小 のコンフィデンスとして与えた数値をかけ合わせたものとの差. ゲイン= サポート − (前項条件を満たすデータ数)× (最小のコンフィデンス) 全体のデータ数 このような相関ルールは, 一般的に離散値をもつ属性を扱ったものである. しかしながら, 現 実のデータベースでは通常, 年齢や預金残高のような数値属性が存在する. これらの数値属性を, 離散値をもつ属性として考えても良いが, 数値間の順序も考慮した結合ルールがあれば有用であ る. このような結合ルールに, 最適区間相関ルールというものがある. 最適区間相関ルールとは, 数の属性を含むルールの中である条件を満たし, 1. 数の属性の区間が最長 (すなわちサポートが最大), または 2. この区間においてゲインが最大 となるような相関ルールを抽出するものである. 最適区間相関ルールの具体的な問題の例として, 「パンを買った顧客がバターを買う相関ルールの中で, サポートが 50%から 70%の間, コンフィ デンスが 30%以上, ゲインが 90%以上という条件のもと, 最長の顧客年齢区間を求める」 などが ある. 従来の手法では発見される相関ルールは数が多く, その中からどのようにして有意義なものを 見出すのかが問題とされている. さらに, 既存の手法のみでは 「サポート, コンフィデンス, ゲイ ンについて, それらがある閾値以上である」 という単純な条件のときしか効率的に最適区間相関 ルールを抽出することができないため, 要求に充分に応えていないのが現状である. このような問題を解決するため, 本研究開発では, 適切な条件を記述して対話的に最適区間相 関ルールを高速に絞り込むためのシステムを開発した. 本システムの具体的な目的は, 大きく次 の二つである. • 相関ルールを抽出するアルゴリズムの研究に関して 大規模なデータベースに対して効率よく動作する既存の Apriori アルゴリズムと, 中規模 のデータベースに対して高速に動作する我々のアルゴリズムとを実装し, 本システムに統合 することを目的とする. • 最適区間相関ルールの研究に関して 本研究開発ではより複雑な, 「サポート, コンフィデンス, ゲインの任意の組み合わせと任 8 意の範囲」 によって記述された条件に対して, 条件を満たす最適区間相関ルールを効率的に 発見するための支援システムの開発を目的とする. これらの特徴によって, 情報社会においてますます増え続ける膨大な情報を有効に活用し, よ り有意義な科学的発見を支援することができるようになると期待できる. 9 2. 技術開発の内容 本研究開発では, まず, 相関ルールを抽出する二つのアルゴリズム― (1) 大規模なデータベ ースに対して効率の良い既存の Apriori アルゴリズムと, (2) 中規模なデータベースに対して考案 した Apriori アルゴリズムよりはるかに速いアルゴリズム―を実現し, 1 つのシステムに統合す る. 次に, 相関ルールの中から, サポート, コンフィデンス, ゲインによる任意の組み合わせ, 任 意の範囲で記述された条件で, 効率的に最適区間相関ルールを抽出するためのアルゴリズムを実 現する. 最後に, これらのサービスを提供するサーバと, サービスを利用するクライアントから なるシステムを構築し, 実際にネットワーク上で実行できる環境をつくる. 本研究開発のうち主要な技術課題は, 今までに我々が提案した二つのアルゴリズム, • 相関ルールの抽出アルゴリズム, • 最適区間相関ルールの抽出アルゴリズム, の実現とそれらの有効性を実証することである. 2.1. 相関ルールの抽出アルゴリズム実現 一つ目の技術課題は, 相関ルールを抽出する二つのアルゴリズム―大規模なデータベースに 対して効率的な既存の Apriori アルゴリズムと, 中規模なデータベースに対して効率的な我々が 提案した高速アルゴリズム―を統合して, データベースのサイズに基づいて抽出アルゴリズム を選択できるようなシステムを実現することである. 我々の提案したアルゴリズムを効率的に実 現するために, 中間の頻出集合を効率的に操作するためのデータ構造を設計し, Java 言語を用い て実際のプログラムを行う. 代表者である胡は, プログラム運算手法に基づいて, 相関ルールを抽出するための新しい効率 的なアルゴリズム[1, 2]の導出に成功している. その成果は本研究開発の核となる理論である. これまでに我々が提案したアルゴリズムは, 関数型言語 Haskell を用いて実現したが, 実際に 使えるシステムを作るには Java のような効率の良い言語で実装しなければならない. また, 既存 のアルゴリズムとの性能比較や, 実際のデータ解析への適用はまだなされていない. 10 2.2. 最適区間相関ルールの抽出アルゴリズムの実現 二つ目の技術課題は, サポート, コンフィデンス, ゲインに任意の組み合わせと, それらの任意 の範囲で記述された条件に対して, 効率的に最適区間相関ルールを抽出するアルゴリズムを実現 することである. このアルゴリズムの実現のため 「最小属性を持つ多次元探索木」 の設計が重要 である. また, 使いやすいインターフェースの設計も重要である. 我々は, プログラム運算手法に基づいて, 従来のものより一般的な最適区間相関ルールを抽出 するための問い合わせ言語の定義と, 効率的な実現手法を提案し, 国際会議で発表し[3], その成 果に評価を得ている. この成果は本研究開発の核となる理論である. また, 本アルゴリズムの実 現に重要な 「最小属性を持つ多次元探索木」 の理論については文献[4]を基礎としている. 本研究開発で, これらの理論をもとに, ARMiner の開発環境の上に Java 言語でアルゴリズム を実現する. 11 3. システムの開発・実装 3.1. システムの全体像 本システムは, サーバ, クライアント, および, サーバとクライアントの通信という三つの部分 から構成される. サーバ側では, 一般的な相関ルールを効率的に抽出するアルゴリズムを実現す る機能, 最適区間相関ルールを抽出する機能, および, テストデータの生成とシステム評価を行 う機能から構成される. クライアント側では, サーバに実装された機能を利用するための相関ル ール抽出のためのインターフェース, 最適区間相関ルール抽出のためのインターフェース, およ び, 解析結果の表示機能より構成される. サーバとクライアントの通信は, サーバとクライアン ト間のプロトコルおよびデータの交換機能から構成される. 具体的には, 本システムは相関ルールを抽出するソフトウェア開発を支援するシステムである ARMiner に, Java 言語を用いて機能を拡張することで実現した.各種のデータベースに対応でき るよう, ARMiner 独自形式のファイルだけでなく, CSV (Comma-Separated-Value) 形式のファ イルからもデータを読み込めるようになっている. これらのデータの流れに関する全体図を図 1 に示す. ARMiner データベース 相関ルールの抽出 相関ルール (2値化) CSV形式 データベース サポート・ コンフィデンスなど 複雑な条件 最適区間相関ルー ルの抽出 最小属性を持つ 多次元木 12 最適区間 ユーザ 図 1 本システムのデータの流れに関する全体図 相関ルール 抽出機能 S1 クライアント C1 システム性 能評価機能 S2 S3 C2 C3 SC サーバ 最適区間相関ルール 抽出機能 ユーザ 図 2 本システムの機能に関する全体図 本システムは次の 4 つの主要機能から構成される. これらの機能に関する全体図を図 2 に示す. 1. 相関ルールの効率的な抽出機能 (S1, C1), 2. 最適区間相関ルールの抽出機能 (S2, C2), 3. システム性能評価機能 (S3, C3), 4. サーバとクライアントとの連携機能 (SC), 3.2. 3.2.1. 機能およびその構成要素 相関ルールの効率的な抽出機能 本機能は, 2.1.節の相関ルールのアルゴリズムを実装したものである. 本機能を用いて, CSV 形 式の顧客情報データベースから相関ルールを抽出する様子を図 3∼図 5 に示す. 本機能は, サーバ上の機能である 「相関ルール抽出機能」 と, クライアント上の機能である 「相関ルールの抽出のためのユーザインターフェース機能」 から構成される. 「相関ルール抽出機能」 は, データベースをレコード毎に処理する方式と, 処理効率の良いデー タベースの属性を考慮した処理方式の両方をサポートする. なお, 途中結果の確認のため, 頻出 集合も出力する. 本機能は次のクラスから構成され, クラス間の関係は図 6.、図7のようになっ 13 ている. • Aposteriori: 論 文 [1, 2] に お け る 相 関 ル ー ル 抽 出 の 効 率 的 な ア ル ゴ リ ズ ム を 実 装 し た ク ラ ス . ARMiner の仕様に従い, LargeItemsetsFinder インターフェースを実装している. • AlgorithmManager: ARMiner のもので, 入力された条件下で相関ルールを抽出する機能の中心となるクラ ス. クライアントから指定されたサーバに登録済みのアルゴリズムの動的なロードもこ のクラスのもとで行われる. • DatabaseReader: 相関ルールを求める元となるデータベースを読み込むためのインターフェース. • CSVDBReader: CSV 形式のデータベースを読み込むクラス. CSV の形式については 3.3.節に詳細を述べ る. 図 3 相関ルール抽出の条件設定画面 14 図 4 CSV 形式のデータを二値化する画面 図 5 抽出された相関ルール 15 DBConfig ① sendUpdate(out) ② new, getColumnNamesWithAttribute() ServerChild CSVDBReader ④ new, getColumnNames() ③ new, mineCSV(…) AlgorithmManager ①:Client ②:Client ③:Client ④:Client からの からの からの からの GETDBCONFIG メッセージによって呼び出し、DBConfig のコピーをClient に返す GETCOLSWITHATTR メッセージによって呼び出す MINECVS メッセージによって呼び出し、相関ルールを抽出して Client に返す GETCOLS メッセージによって呼び出す 図 6 「相関ルールの効果的な抽出」 におけるクラス関係図 MainFrame ① new, show() MiningDialog ② getDBConfig() ③ new, show() ⑤ new, show() MineSetBoolDialog ④ getColumnAttributes(DBName) ItemSelectDialog Client ⑥ mine(action, miningInput) getColumns(db) ⑦ new, show() MiningResult ①:メニューから Find Association Rules を選ぶと呼び出し ②:new されたとき、利用できるアルゴリズム・データベース一覧を取得 ③:Mine ボタンが押されると呼び出し ④:new されたとき、各項目の名前・ 属性を取得 ⑤:数値属性の項目が選択される度に呼び出し ⑥:Execute ボタンが押されると呼び出し、実行結果を受け取る ⑦:実行結果が正しく受け取れたら呼び出し 図 7 「相関ルールの効果的な抽出のためのユーザインターフェース」 におけるクラス関係図 16 3.2.2. 最適区間相関ルールの抽出機能 本機能は, 2.2.節の最適区間相関ルールの抽出アルゴリズムを実装したものである. 本機能を用 いて, 最適区間相関ルールを抽出する様子を図 8∼図 9 に示す. 本機能は, サーバ上の機能である 「最適区間相関ルールの抽出機能」 と, クライアント上の機 能である 「最適区間相関ルールの抽出のためのユーザインターフェース」 から構成される. 「最適区間相関ルールの抽出機能」 で用いるアルゴリズムは, 従来の単一的な条件 (例えば, サ ポート 50%以上, コンフィデンス 60%以上, ゲイン 100%以上) に比べてより複雑な条件 (例え ば, サポート 50%以上, コンフィデンス 30%∼70%) に対応できる. 本機能は次のクラスから構 成され, クラス間の関係は図 10 のようになっている. • CSVDBReader: CSV 形式のデータベースを読み込むクラス. • OptimizedRangesMiner: 最適区間相関ルール抽出アルゴリズムが実装すべきインターフェース. • SimpleOptimizedRangesMiner: 論文[3]による最適区間相関ルール抽出の効率的なアルゴリズムの実装のメインクラス. • Bucket: 抽出する区間の最小単位幅でレコードを分類したデータ構造をあらわすクラス. • KdmTree: 最小属性値を持つ多次元探索木を表現したクラス. 論文[4]の実装である. 17 図 8 抽出された相関ルール 図 9 抽出された相関ルール 18 DBConfig ① sendUpdate(out) ② new, getColumnNamesWithAttribute() ServerChild CSVDBReader ③ new, getRecord() ④ new, getOptimizedRanges(records,rules,profile) SimpleOptimizedRangesMiner 図 10 「相関ルールの効果的な抽出」 におけるクラス関係図 「最適区間相関ルールの抽出のためのユーザインターフェース」 では, ユーザからルールの抽 出条件を受け取り, その条件の正当性をチェックする. もし, 不正な条件が入力された場合には エラーメッセージを出し, 再入力をユーザに促す機能を提供する. 本機能は次のクラスから構成 され, クラス間の関係は図 11 のようになっている. • MORConfDialog: 最適区間相関ルール抽出のクエリ作成のための初期設定 UI. 対象とするデータベース 名, ルールや条件の数の設定を要求する. • MORDialog: 最適区間相関ルール抽出のための UI. MORConfDialog で設定された情報に従って, ル ール抽出の為の具体的な条件の設定を要求する. • MORSetBoolDialog: MORDialog のルールにおける数値属性項目を二値化するための閾値を設定する UI. • MORResult: 19 最適区間相関ルール抽出の結果を表示する UI であるダイアログ. MainFrame ① new, show() MORConfDialog ② getDBConfig() ③ new, show() ⑤ new, show() MORSetBoolDialog ④ getColumnAttributes(DBName) MORDialog Client ⑥ mor(action,arguments) ⑦ new, show() MORResult ①: メニューから Find Optimized Ranges を選ぶと呼び出し ②: new されたとき、利用できるアルゴリズム・ データベース一覧を取得 ③: Set ボタンが押されると呼び出し ④: new されたとき、各項目の名前・ 属性を取得 ⑤: ルール中で数値属性の項目が選択される度に呼び出し ⑥: Mine ボタンが押されると呼び出し、実行結果を受け取る ⑦: 実行結果が正しく受け取れたら呼び出し 図 11 「最適区間相関ルールの効果的な抽出のためのユーザインターフェース」における クラス関係図 20 4. 評価・考察 本システムに実装した評価機能を利用して, 我々の提案した相関ルールの抽出アルゴリズム[1, 2] の性能評価を行った. 稼働環境 4.1. • ハードウェア サーバ用の計算機1台と, TCP/IP による通信が可能な任意台のクライアント用の計算機 から構成される. サーバ, クライアントとも, Java Runtime Environment, Standard Edition (以下, JRE と略記する) version 1.3 以上が動作可能であれば, どのハードウェアで も実行することができる. ただし, 大量のデータを処理する能力を考慮すると, サーバ用の 計算機は 500 MHz 以上の CPU と 256 M バイト以上のメモリを搭載していることが望まし い. • ソフトウェア 本ソフトウェアを実行するには, JRE (version 1.3 以上) が必要である. JRE は Java 言語 を用いて開発されたプログラムを実行するのに必要なランタイムセットである.これは Web 上1から無料で入手することができる. • ネットワーク サーバとクライアント間で TCP/IP による通信が可能であることが要求される. 4.2. CSV 形式データベース仕様 本システムでは, ARMiner 形式と CSV 形式の 2 種類のファイルをデータベースとして扱うこ とができる. CSV 形式では, 二値型だけでなく, 数値型や列挙型なども扱うことができる. 本シ ステムで扱うことができる CSV 形式は次の様式になっている. CSV 形式のデータを表形式で表 21 したもの (表 1) とテキストで表したもの (図 12) の例を挙げる. • 1 行目には各列の列名と型などの情報を書く. 数値型, 二値型, 列挙型の各データ型は次 のように記述する. 斜体になっているところには, その内容を表す文字列を入力する. • § 数値型 (Numerical): “列名:N” § 二値型 (Boolean): § 列挙型 (Enumerate): “列名:E(要素 1|要素 2|要素 3|…)” “列名:B(True|False)” 2 行目以降には, レコードを格納する. 表 1 CSV 形式のデータベースの例 (表形式) バス 乗車:B(1│0) 家賃:N 70000 79000 79000 90000 90000 徒歩時間:N 0 0 0 0 0 敷金礼金:N 1 1 1 6 6 4 4 4 5 5 占有面積:N 16.42 19.68 19 19.44 18.23 家賃:N,バス乗車:B(1|0),徒歩時間:N,敷金礼金:N,占有面積:N 70000,0,1,4,16.42 79000,0,1,4,19.68 79000,0,1,4,19,6 90000,0,6,5,19.44 90000,0,6,5,18.23 図 12 表 1 のデータベースの CSV ファイル (テキスト) 4.3. システムの評価 本システムの評価には ARMiner に付属しているデータベースを用い, サポートの値を 0.1∼ 22 0.9 と変化させて実験した. 実験の結果を図 13 に示す. この結果より, 本システムで実装したアルゴリズム (Aposteriori) の方が標準的な Apriori ア ルゴリズムよりも高速に計算可能であることが確認された. また, 本システムに実装した性能評価機能に基づいて, 我々の最適区間相関ルールの抽出アル ゴリズム[3]の性能評価を行った. この評価には住宅情報のデータベース (700 レコード) を用い, 項目 「家賃」 に対して Bucket のサイズを 100 刻みに, Tuple のサイズを 1∼5 にして行った. 評 価実験の結果を図 14 に示す. この結果より, Bucket または Tuple を大きくすると計算時間が大きくなるが, 実用的な範囲で は, 十分に効率的に動作していると判断することができる. 図 13 相関ルールの抽出機能の性能評価における実験結果 23 図 14 最適区間相関ルールの抽出機能の性能評価における実験結果 24 5. 終わりに 5.1. まとめ 本研究開発では, (1) 既存の相関ルールアルゴリズムと中規模なデータベースに対して高速な 我々のアルゴリズムの統合, (2) 既存のアルゴリズムよりも複雑な条件 (サポート, コンフィデン ス, ゲインによる任意の組み合わせ, 任意の範囲によって記述される) で効率よく最適区間相関 ルールを抽出できるアルゴリズムの実現を行った. また, これらのサービスを提供するサーバと, サービスと利用するクライアントからなるシス テムを構築し, 実際にネットワーク上で利用できる環境を実装した. 相関ルールの抽出については, 既存の Apriori アルゴリズムと性能評価実験を行い, 我々が提 案したアルゴリズムの方が高速に相関ルールを抽出可能であることが確認できた. また, 最適区 間相関ルールのアルゴリズムについては, 従来のアルゴリズムよりも複雑な条件のもとでも, 実 用的な時間で最適区間相関ルールを抽出できることが確認できた. これにより, 膨大に蓄積され 続けている情報を有効に活用し, より有意義な科学的発見を支援することが期待できる. 5.2. 今後の課題 本システムの有効性の評価として, 中規模な POS データベース (約 2000 レコード) を対象と して実験を行ったが, もっと大規模なデータベースに対しても本システムで使用しているアルゴ リズムの有効性を検証することが必要である. 25 6. 参考文献 [1] Z. Hu, W. N. Chin, M. Takeichi: “Calculating a New Data Mining Algorithm for Market Basket Analysis,” Second International Workshop on Practical Aspects of Declarative Languages (PADL ’00), Boston, Massachusetts, January 17-18, 2000. [2] Z. Hu, W. N. Chin, M. Takeichi: “Calculating a New Data Mining Algorithm for Market Basket Analysis”, to appear in Journal of Functional and Logic Programming, MIT Press. [3] H. Zhao, Y. Yokoyama, Z. Hu, M. Takeichi: “Mining Optimized Ranges: A Functional Approach,” 1st International Workshop on Programming and Programming Languages (IWPPL 2000), Singapore, December 17-19, 2000. [4] H. Zhao, Z. Hu, M. Takeichi: “Multidimensional Searching Trees with Minimum Attribute,” Journal of JSSST Computer Software. 26
© Copyright 2024 Paperzz