10月、 Okdeskクラウドサービスチームは、Penza hackathonに参加しました。このフレームワークでは、Okdesk用の「ボックス化」Telegramボットを開発しました。 このボットにより、サービス会社の顧客は、お気に入りのメッセンジャーを離れることなく、サービスにアプリケーションを送信し、アプリケーションに対応し、アプリケーションの実装に評価を与えることができます。
Habraでそれについての記事を書くつもりでしたが、やがて止まりました。 確かに、次の電報ボットが次のハッカソンで開発されたことを今日読むことに興味があるのは誰ですか? そのため、これらのアプリケーションを分類するための機械学習に関する記事の続きを書きました。 サポート。 この記事では、アルゴリズムを学習した後、作業サービスを作成する方法について説明します。作業サービスの入力はクライアントアプリケーションのテキストに送信され、出力はアプリケーションが属するカテゴリになります。
前の部分の要約
このテキストを読み始める前に、 最初の部分を読むことを強くお勧めします(または、少なくとも記事の最初の部分をブックマークする)。 以下は要約です。
したがって、サービス会社は顧客にサービスを提供します。 クライアントは顧客サポートにアプリケーションを送信します。たとえば、「インターネットが機能しない」または「1Cの投稿が機能しない」などです。 サービス会社では、さまざまな人々がさまざまな方向に関与しています。インターネットの問題はシステム管理者グループの責任であり、1Cの問題はサポートグループ1Cに「落ち」ます。 グループへのアプリケーションの配布はディスパッチャに任せることができますが、これらは追加費用(給与)と決定時間の損失です(アプリケーションの配布に対するディスパッチャの反応はアプリケーションの解決時間に追加されます)。 アプリケーションを配布するタスクを「スマートアルゴリズム」にシフトすることは論理的です。これは、アプリケーションテキストに従って、どの方向に関連するかを判断できます。
この問題を解決するために、カテゴリ(14カテゴリ)が付加された1200のアプリケーションテキストのトレーニングサンプルが採用されました。 トレーニングサンプル(単語の分類に重要な単語のセット)から語彙がコンパイルされ、すべてのアプリケーションが辞書に「投影」されました(つまり、各アプリケーションテキストに辞書スペースのベクトルが割り当てられました)。このトレーニングセット分類アルゴリズム。 アプリケーションを分類するために、辞書空間でベクトルを入力するために使用されるアルゴリズム、および出力で、アルゴリズムはアプリケーションのカテゴリを予測しました。
最適なアルゴリズムは、トレーニングサンプルで74.5%の分類精度を示しました(14のカテゴリに非常に適しています)が、感謝する読者は、使用したアルゴリズムがデータで92%の精度を示したことを個人的なメッセージで書きました(これは既に完全に「生産」オプションです)。
このすべての作業はラップトップで行われましたが、実際に使用するには、ラップトップで得られた結果を何らかの方法でWebサービスに変換する必要があります。
語彙のアンロードと訓練されたアルゴリズム
新しいアプリケーションの分類は2段階で実行されることを思い出してください。
- 新しいアプリケーションの場合、辞書スペースでのアプリケーションの座標が決定されます。
- 結果のベクトルは、アプリケーションのカテゴリを返す訓練されたアルゴリズムに送信されます。
したがって、分類メカニズムをラップトップからWebサービスに転送するには、結果の辞書とトレーニング済みアルゴリズムを「アップロード」する必要があります。
さらに本文では、記事の最初の部分の変数を使用します。
辞書のアンロード
辞書のアンロードは簡単です。 最初の部分では、辞書のすべての単語を書き留めました(順序が重要です!)リスト変数wordsに 。 次に、words変数からテキストファイルに単語を書き込む必要があります。 新しい行から各単語を書きます。
# codecs, utf8 import codecs # words.txt, with codecs.open('words.txt', 'w', encoding = 'utf8') as wordfile: wordfile.writelines(i + '\n' for i in words)
トレーニング済みのアルゴリズムダンプのダンプ
アルゴリズムの学習は、多くのマシン時間を必要とする操作です。 アルゴリズムが起動されるたびに実行することはお勧めできません。 したがって、何らかの方法でトレーニング済みアルゴリズムを保存して他のマシンで実行できる場合は、この機会を利用する必要があります。
Pythonには、アルゴリズムを保存するための2つのオプションがあります。
組み込みのpickleモジュール:
import pickle saved = pickle.dumps(classifier) classifier2 = pickle.loads(saved)
ダンプを変数に保存し、変数をファイルに保存できます。
Joblibライブラリ:
from sklearn.externals import joblib joblib.dump(classifier, 'filename.pkl') classifier2 = joblib.load('classifier.pkl')
モデルを変数にダンプすることはできませんが、すぐにダンプを.pklファイルに書き込みます。
このタスクでは、アルゴリズムダンプをファイルに保存する必要があります。
from sklearn.externals import joblib joblib.dump(optimazer_tree.best_estimator_, 'model_tree.pkl')
これで、2番目のファイルがあります。model_tree.pklファイル内のトレーニング済みアルゴリズムのダンプ
新しいアプリケーションの分類スクリプト
新しいアプリケーションを分類するスクリプトは次のことができるはずです。
- words.txtファイルから辞書をダウンロードします。
- classifier.pklファイルからトレーニング済みアルゴリズムをダウンロードします。
- 分類のためにテキストが渡された辞書スペースに投影します。
- テキスト分類に渡されたカテゴリの予測を返します。
始めましょう。 まず、必要なライブラリをインポートします。 スクリプトが記事の最初の部分で、またはこの記事で( コーデックを使用して )少し上で動作するために必要なほとんどのライブラリを満たしました。 さらに、 sysライブラリが表示されます-コマンドラインパラメーターを操作するために必要です(そこからスクリプトにテキストを渡します)
import numpy as np import re import sklearn import codecs Import sys
次に、辞書と訓練されたアルゴリズムをロードします。
# words.txt with codecs.open('words.txt','r', encoding = 'utf8') as wordsfile: wds = wordsfile.readlines() # words = [] for i in wds: words.append(i[:-1]) # model_tree.pkl estimator = sklearn.externals.joblib.load('model_kNN.pkl')
辞書スペースに新しいテキストを投影する前に、テキストを単語に分割する必要があります(テキストを小文字に変換した後)。 対応する関数を宣言します。
# def lower(str): return str.lower() # , def splitstring(str): words = [] # [], for i in re.split('[;,.,\n,\s,:,-,+,-,(,),=,-,/,«,»,-,@,-,-,\d,!,?,"]',str): words.append(i) return words
最後に、入力として新しいテキストを受け取る関数を宣言し、出力でそのカテゴリの予測を提供します。
# , , def class_func(new_issue): # , new_issue_words = splitstring(lower(new_issue)) # len(words) new_issue_vec = np.zeros((1,len(words))) # [j]- , j- new_issue for j in new_issue_words: if j in words: new_issue_vec[0][words.index(j)]+=1 # return estimator.predict(new_issue_vec)
コマンドラインから新しいアプリケーションのテキストを転送する予定であることを思い出してください。 スクリプトでコマンドライン引数を取得するには、 sysライブラリを使用します。 Sys.argvはコマンドライン引数のリストを返しますが、ゼロ要素はスクリプトの名前です(ただし、スクリプトの名前は辞書にないため、これは重要ではありません。投影すると消えます)。 したがって、新しいアプリケーションのテキストをスクリプトに転送するには、スクリプトで渡されたコマンドラインパラメーターを「接着」する必要があります(新しいアプリケーションのテキストの各単語は1つの引数として送信されるため)。
new_issue = u'' for i in sys.argv: # new_issue += ' ' + i.decode('cp1251') class_func(new_issue)
重要! コンソールで使用されるエンコーディングによっては、 new_issue + = '' + i.decode( 'cp1251')行で、 デコード のパラメーターが異なる場合があります。
そのため、辞書を含むファイルとトレーニング済みアルゴリズムのダンプを含むファイルに、3番目のファイルを追加しました。これは、新しいアプリケーションのカテゴリを予測するすべての作業を実行するスクリプトです。
次に、3つのファイルすべてをサーバー上の1つのフォルダーに配置し、必要な環境をセットアップする必要があります(ライブラリー付きのPython)。 スクリプトは、コマンドラインから便利な方法で実行できます(たとえば、ネットワーク経由で新しいアプリケーションのテキストを受け取り、スクリプトに転送し、応答を受け取って返信するお気に入りの言語で簡単なサービスを作成します)。
終わり! MLの問題を解決してください。 まあ、私たちはOkdeskの開発を続けます -私たちの会社によると)最も便利なサービス会社の顧客サービスのためのヘルプデスクシステムで、メンテナンスに関連する問題を解決するために「スマートアルゴリズム」を使用する可能性を探ります。