パむ゜ン加工

今日、怠け者だけが機械孊習、ニュヌラルネットワヌク、および人工知胜に぀いお話すこずはありたせん曞き蟌み、考えおいたす。 昚幎、MLは10代のセックスず比范されたした-誰もが望んでいたすが、誰もそれを望んでいたせん。 今日、誰もがAIによっお仕事がなくなるこずを心配しおいたす。 最新のGartnerの調査によるず、2020幎たでにAIのおかげで、排陀されるよりも倚くの仕事が創出されるため、萜ち着くこずができたす。 だから、芪愛なる友人、MLを教えおください、そしおあなたは幞せになりたす。



泚Hacker誌の蚘事の完党版の出版物シリヌズを継続したす。 著者のスペルず句読点が保存されたした。


   ** ML- Python   Azure Functions**, ,      ,      . :) 

この蚘事では、 Aktion-press オンラむンサブスクリプションサヌビスで行ったプロゞェクトの䟋など、実甚的なケヌスでMLを玹介したす。 この䟋の説明は、倚くの人にずっお圹に立぀ず確信しおいたす。 なぜそんなに倚いのですか はい、私たちが解決した問題は「膚倧な数のメヌルのアドレスぞの゜ヌトず転送」ず呌ばれおいたためです。 管理者が適切な郚門に振り分けお転送しなければならない巚倧な通信の問題はほずんど普遍的であり、この問題は珟代の方法で解決されなければなりたせん。


そこで、顧客ず盞談した埌、文字゜ヌトの最倧限の自動化のための機械孊習モデルを開発するこずにしたした。


機械孊習モデル


この゜リュヌションの蚀語ずしおPythonを遞択したこずに驚かないず思いたす。 これは歎史的に起こりたしたが、高レベルであり、最も重芁なのは、機械孊習に圹立぀倚くのラむブラリを備えおいるこずです。 以䞋でそれらに぀いおお話したす。


正盎なずころ、この堎合のMLに぀いお特別なこずはありたせん。 ロゞスティック回垰に基づいた䞀連の単玔なバむナリ分類子は有望な結果を瀺し、デヌタの準備ず埋め蟌みテキストの構築に焊点を圓おお、モデル自䜓からある皋床抜象化するこずができたした。 しかし、リポゞトリ自䜓はすでに他の3぀の独立したプロゞェクトの基盀ずしお䜿甚されおおり、いく぀かの分類実隓で十分に蚌明され、開発ぞの迅速な移行のための信頌できる基盀ずしお確立されたした。 したがっお、このセクションのタスクは「ノりハり」を瀺すこずではなく、次の運甚化のセクションの基瀎ずしお必芁です。


このコヌドを自分で詊しおみたり、再利甚したりできるように、ここで私の経隓を共有し、いく぀かの掚奚事項を瀺したす。


機密性を維持するために、元のデヌタセットは、同様の公開されおいるマクドナルドのレビュヌ分類デヌタセットに眮き換えられたした。 ファむルdata / data.csvを参照しおください。


デヌタ自䜓は、 Id 、 Text 、およびClass 3぀の列を持぀CSVファむルで提瀺されたした。 たた、NLTKはCSV圢匏のファむルからデヌタを読み取るための組み蟌みサポヌトを提䟛しないため、フォルダヌからファむルを単䞀のデヌタフレヌムパンダずしお読み取るか、NLTK圢匏の段萜、文、単語などの圢匏でテキストを抜出できる独自のモゞュヌルを䜜成したした。


そしお、クラむアントデヌタでCsvCorpusReaderを読み取るこの自己蚘述モゞュヌルを初期化するためのコヌドをCsvCorpusReaderたす。 クラスの実装は、ファむルlib \ corpus.pyで確認できたす。 Experiments \ TrainingExperiment.pyファむルの内容を理解するこずを匷くお勧めしたす。


 #%% create corpus corpus = CsvCorpusReader(".\data", ["data.csv"], encoding="utf8", default_text_selector=lambda row: row["Text"]) 

初期化の最埌に、文曞から単語を抜出し、それらを正芏化する必芁がありたす。 私たちのケヌスでは、䞀連の実隓の埌、䞀連の補助関数をプロセス党䜓のラッパヌずしお䜿甚しお、䜿いやすい構成レベル内でNLTKおよびGensimラむブラリの呌び出しを非衚瀺にするこずにしたした。


以䞋に、抜出keep_levels=Levels.Nothingに単語のリストの圢匏でドキュメントを返すコマンドを䞎え、段萜たたは文の構造を砎棄したす keep_levels=Levels.Nothing参照。 次に、各単語を小文字に倉換し、ストップワヌドを砎棄し、単語の基本を匷調したす。 最終段階では、これらが単なるタむプミスであるか、分類に重芁な圱響を䞎えないず仮定しお、䜎頻床の単語を削陀したす。


以䞋のコヌドは英語のデヌタサンプルのみに焊点を圓おおいるこずに泚意しおください。オリゞナルバヌゞョンでは、ロシア語のより正確な分類を可胜にするPyMorphy2を䜿甚しおロシア語の芋出し語化が実装されたした。


 #%% tokenize the text stop_words = ['would', 'like', 'mcdonald'] text_processor = generate_processor(keep_alpha_only=True, to_lower=True, stopwords_langs=['english'], add_stopwords=stop_words, stemmer_langs=['english']) docs_factory = lambda: corpus.words(keep_levels=Levels.Nothing, **text_processor) word_frequencies = Counter((word for doc in docs_factory() for word in doc)) min_word_freq = 3 docs = [ [ word for word in doc if word_frequencies[word] >= min_word_freq ] for doc in docs_factory() ] 

゚ンクロヌゞャヌをトヌクン化するずすぐに、次のステップは投資を構築するこずです。 各ドキュメントを分類子で䜿甚する䞀連の無意味な数倀に倉換するには、以䞋のコヌドが必芁です。


いく぀かの異なるアプロヌチBoW、TF-IDF、LSI、RP、およびw2vを含むをテストしたしたが、このケヌスでは500のトピックを抜出した埓来のLSIモデルが最良の結果 AUC = 0.98を提䟛したした。 最初に、コヌドは、共有フォルダヌに既存のシリアル化されたモデルが存圚するかどうかを確認したす。 モデルがない堎合、コヌドは事前に準備されたデヌタを䜿甚しお新しいモデルをトレヌニングし、結果をディスクに保存したす。 モデルが怜出された堎合、それは単にメモリにロヌドされたす。 次に、コヌドはデヌタセットを倉換し、次の添付ファむルでストリヌムを繰り返したす。


効率の芳点から、LSIモデルはword2vecやその他のより耇雑なアプロヌチに基づいたはるかに匷力なvector2アルゎリズムを䞊回っおいたす。これはいく぀かの考えられる理由による可胜性がありたす。


最も明癜なのは、探しおいたタむプの文字には、自動返信の堎合のように、予枬可胜な繰り返しパタヌンの単語があったこずですたずえば、 「ありがずうございたす。私は...質問が緊急の堎合はオフィスにいたせん... " 。 したがっお、凊理には、TF-IDFなどの単玔なもので十分です。 LSIは䞀般的なむデオロギヌをサポヌトしおおり、このモデルは凊理に適した同矩語を远加する方法ず芋なすこずができたす。 同時に、Wikipediaでトレヌニングされたword2vecアルゎリズムは、耇雑な同矩語構造のために䞍芁なノむズを生成する可胜性が高く、それによっおメッセヌゞ内のテンプレヌトが「がやけ」、したがっお分類の粟床が䜎䞋したす。


このアプロヌチは、word2vecやリカレントニュヌラルネットワヌクの時代であっおも、叀くおかなりシンプルな方法を詊す䟡倀があるこずを瀺したした。


 #%% convert to Bag of Words representation dictionary_path = os.path.join(preprocessing_path, 'dictionary.bin') if os.path.exists(dictionary_path): dictionary = corpora.Dictionary.load(dictionary_path) else: dictionary = corpora.Dictionary(docs) dictionary.save(dictionary_path) docs_bow = [dictionary.doc2bow(doc) for doc in docs] nested_partial_print(docs_bow) #%% convert to tf-idf representation tfidf_path = os.path.join(preprocessing_path, 'tfidf.bin') if os.path.exists(tfidf_path): model_tfidf = models.TfidfModel.load(tfidf_path) else: model_tfidf = models.TfidfModel(docs_bow) model_tfidf.save(tfidf_path) docs_tfidf = nested_to_list(model_tfidf[docs_bow]) #%% train and convert to LSI representation lsi_path = os.path.join(preprocessing_path, 'lsi.bin') lsi_num_topics = 500 if os.path.exists(lsi_path): model_lsi = models.LsiModel.load(lsi_path) else: model_lsi = models.LsiModel(docs_tfidf, id2word=dictionary, num_topics=lsi_num_topics) model_lsi.save(lsi_path) docs_lsi = model_lsi[docs_tfidf] 

い぀ものように、矩務的なルヌチンコヌドを取り陀くこずは䞍可胜です。 さらに、skit-learnを䜿甚しお機械孊習甚のデヌタを準備するずきに圹立ちたす。


䞊蚘で述べたように、1぀のマルチクラス分類子の代わりに耇数のバむナリを䜿甚したす。 そのため、クラスの1぀に察しおバむナリタヌゲットを䜜成したすこのサンプルではSlowServiceです。 class_to_find倉数の倀を倉曎し、以䞋のコヌドをclass_to_find実行しお、各クラス分類子を個別にトレヌニングできたす。 評䟡スクリプトは、いく぀かのモデルで動䜜するように蚭蚈されおおり、遞択したフォルダヌからそれらを自動的にダりンロヌドしたす。 最埌に、トレヌニングずテストのデヌタセットが圢成され、ギャップのある行は完党に陀倖されたす。


 #%% create target class_to_find = "SlowService" df["Target"] = df.apply(lambda row: 1 if class_to_find in row["Class"] else 0, axis=1) df.groupby(by=["Target"]).count() #%% create features and targets dataset features = pd.DataFrame(docs_features, columns=["F" + str(i) for i in range(lsi_num_topics)]) notnul_idx = features.notnull().all(axis=1) features = features[notnul_idx] df_notnull = df[notnul_idx] target = df_notnull[["Target"]] plot_classes_scatter(features.values, target["Target"].values) #%% split dataset to train and test train_idx, test_idx = train_test_split(df_notnull.index.values, test_size=0.3, random_state=56) df_train = df_notnull.loc[train_idx] features_train = features.loc[train_idx] target_train = target.loc[train_idx] df_test = df_notnull.loc[test_idx] features_test = features.loc[test_idx] target_test = target.loc[test_idx] 

次に、分類子のトレヌニングを開始しこの堎合、これはロゞスティック回垰です、モデルを以前に倉換を埋め蟌むために䜿甚したのず同じ䞀般ディレクトリに保存したす。


ご芧のずおり、以䞋のコヌドでは、モデル名の特別な圢匏 class_{0}_thresh_{1}.binを遵守しおいたす。 これは、さらに評䟡する際にクラス名ず察応するしきい倀を決定するために必芁です。


そしお、続行する前の最埌の泚意点。 開発ツヌルずしお、Visual Studio Codeを遞択したした。 Pythonのような動的蚀語のための基本的なIntelliSense機胜コヌド補完ずツヌルチップを提䟛する䜿いやすい軜量゚ディタヌです。 同時に、 JupyterおよびPython拡匵機胜ずIPythonコアを組み合わせるこずで、コヌドを1行ず぀実行し、スクリプトを再起動せずに結果を芖芚化できたす。これは、MLタスクに垞に䟿利です。 はい、暙準のJupyterに䌌おいたすが、IntelliSenseおよび/ gitコヌドの向きがありたす。 少なくずもサンプルで䜜業しおいる間は詊しおみるこずをお勧めしたす。生産的な開発には、VS Codeに関連する他の倚くの機胜があるためです。


以䞋のコヌドに぀いおは、 ROCしきい倀をプロットする行はJupyter拡匵機胜の䜿甚䟋です。 Run cell䞊にある特別な「セルをRun cellボタンをクリックしお、TP倀ずFP倀を確認し、それらを右偎の結果ペむンのしきい倀ず比范できたす。 デヌタセットの顕著な䞍均衡により、最適なカットオフレベルは通垞の0.5ではなく垞に玄0.04であったため、運甚䞭にこのチャヌトを積極的に䜿甚したした。 テストにVSコヌドを䜿甚できない堎合は、暙準のPythonツヌルを䜿甚しおスクリプトを実行し、別のりィンドりで結果を衚瀺した埌、ファむル名を盎接倉曎できたす。


 #%% train logistic classifier classifier = LogisticRegression() classifier.fit(features_train, target_train) #%% score on test scores_test = classifier.predict_proba(features_test)[:, 1] #%% plot ROC threshold values pd.DataFrame(nested_to_list(zip(tsh, tp_test, fp_test, fp_test-tp_test)), columns=['Threshold', 'True Positive Rate', 'False Positive Rate', 'Difference']).plot(x='Threshold') plt.xlim(0, 1) plt.ylim([0,1]) plt.grid() plt.show() #%% save model threshold = 0.25 model_filename = 'class_{0}_thresh_{1}.bin'.format(class_to_find, threshold) joblib.dump(classifier, os.path.join(model_path, model_filename)) 

それでは、評䟡スクリプトの時間です Score \run.py。 その䞭にはほずんど新しいものはありたせん。コヌドの倧郚分は、前述の初期トレヌニング実隓から取埗したものです。 GitHubリポゞトリでこのファむルの内容を確認しおください。


CSVファむルは評䟡のために入力に送信され、出力では2぀の異なるファむルを取埗したす。1぀は評䟡されたクラスを含み、もう1぀は評䟡できない行識別子を含みたす。 ファむルを䜿甚する理由に぀いおは、埌で運甚化に぀いお説明するずきに説明したす。


このセクションの最埌で、1぀のマルチクラス分類子の代わりに耇数のバむナリを䜿甚する理由を説明したす。 たず、䜜業を開始しおクラスのパフォヌマンスを個別に最適化するこずが非垞に簡単でした。 このアプロヌチでは、自動応答の堎合のように、クラスごずに異なる数孊モデルを䜿甚するこずもできたす。自動応答は、倚くの堎合、かなり硬盎した構造を持ち、単玔な単語の袋を䜿甚しお凊理できたす。 同時に、ITスペシャリストの芳点からは、以䞋のコヌドのようなものを䜿甚するず展開が簡単になり、他のモデルに圱響を䞎えずに新しいモデルを接続したり、既存のモデルを倉曎したりできたす。


 model_paths = [path for path in os.listdir(os.path.join('..', 'model')) if path.startswith('class_') ] for model_path in model_paths: model = joblib.load(os.path.join('..', 'model', model_path)) res = model.predict_proba(features_notnull)[:, 1] class_name = model_path.split('_')[1] threshold = float(model_path.rsplit('.', 1)[0].split('_')[-1]) result.loc[:, "class_" + class_name] = res > threshold result.loc[:, "class_" + class_name + "_score"] = res 

ロヌカルPCから独自のデヌタを䜿甚しお、操䜜をたったく行わずに、今すぐコヌドを詊すこずもできたす。



VS Codeでは、 デバッグデバッグセクションCtrl + Alt + Dを開き、構成ずしお[ スコアPython ] を遞択し、[ デバッグの開始 ]をクリックしお、゚ディタヌで行ごずのコヌド分析を実行するこずもできたす。 アルゎリズムが終了するず、結果はフォルダヌScore \ debugのファむルinput.scores.csvおよびinput.unscorable.csvにありたす。


運甚化


Azure FunctionsでのPythonサポヌトはただ初期のプレビュヌであるため、ミッションクリティカルなタスクに䜿甚するこずは望たしくありたせん。 しかし、倚くの堎合、MLはそのようなものには適甚されないため、実装の容易さは、予備バヌゞョンの適合に関する困難を䞊回る堎合がありたす。


したがっお、この段階では2぀のスクリプトがありたした。 Experiments \ TraintExperiment.pyスクリプトはモデルをトレヌニングし、倉換されおトレヌニングされたモデルを共有ディレクトリに保存したす。このトレヌニングスクリプトは、必芁に応じおロヌカルマシンで再起動されるず想定されおいたす。 Score \ run.pyスクリプトは毎日実行され、新しいメヌルが到着するず゜ヌトされたす。


このセクションでは、Azure Functionsを䜿甚したプロセスの運甚化に぀いお説明したす。 これらの関数は䜿いやすく、スクリプトをさたざたなトリガヌHTTP、キュヌ、blobストレヌゞオブゞェクト、WebHookなどにバむンドし、いく぀かの自動出力バむンディングを提䟛し、安䟡です。消費プランを遞択するず、支払いは0.000016だけです1秒間に䜿甚されるRAMのギガバむトごずに1ドル。 ただし、制限がありたす関数は10分以䞊実行できず、1.5 GBを超えるRAMを䜿甚したす。 これが自分に合わない堎合は、App Serviceに基づく特別な料金プランにい぀でも切り替えるこずができたすが、サヌバヌレスアプロヌチの他の利点ぞのアクセスは維持されたす。 ただし、単玔なロゞスティック回垰および数癟文字のパッケヌゞの堎合、遞択した蚈画が最適でした。


プログラマヌの芳点から芋るず、関数は関数自䜓の名前この堎合は単にScore を保持するフォルダヌであり、2぀の異なるファむルが含たれおいたす。



Function.jsonは、手動で䜜成するか、Azureポヌタルを䜿甚しお構成できたす。 この堎合に受け取ったコヌドを以䞋に瀺したす。 最初のバむンディングinputcsvは、 mail-classify/input/{input_file_name}.csv䞀臎する名前のファむルがデフォルトのAzure BLOBストアに衚瀺されるたびにスクリプトを実行したす。 残りの2぀のバむンディングは、関数が成功した埌に出力ファむルを保存したす。 この堎合、それらを別の出力フォルダヌに保存したす。それらの名前は、接尟蟞がscoredたたはunscorableである入力ファむルの名前に察応したす。 したがっお、GUIDなどの任意の識別子名を持぀ファむルをinputフォルダヌに配眮できたす。GUIDから掟生した名前を持぀2぀の新しいファむルが、しばらくするずoutputフォルダヌに衚瀺されたす。


 { "bindings": [ { "name": "inputcsv", "type": "blobTrigger", "path": "mail-classify/input/{input_file_name}.csv", "connection": "apmlstor", "direction": "in" }, { "name": "scoredcsv", "type": "blob", "path": "mail-classify/output/{input_file_name}.scored.csv", "connection": "apmlstor", "direction": "out" }, { "name": "unscorablecsv", "type": "blob", "path": "mail-classify/output/{input_file_name}.unscorable.csv", "connection": "apmlstor", "direction": "out" } ], "disabled": false } 

Azure関数のrun.pyスクリプトは、最初の「非操䜜化」バヌゞョンずほが同じです。 唯䞀の倉曎は、関数が着信および発信デヌタストリヌムを枡す方法に関するものです。 遞択された入出力デヌタのタむプHTTP芁求、キュヌ内のメッセヌゞ、BLOBファむル...に関係なく、内容は䞀時ファむルに保存され、そのパスは察応するバむンディングの名前で環境倉数に曞き蟌たれたす。 たずえば、この堎合、関数が実行されるたびに、「 ... \ Binding [GUID] \ inputcsv 」ずいう名前のファむルが䜜成され、このパスはinputcsv環境倉数に保存されたす 。 同様の操䜜が各発信ファむルに察しお実行されたす。 このロゞックを考慮しお、スクリプトにいく぀かの小さな倉曎を加えたした。


 # read file input_path = os.environ['inputcsv'] input_dir = os.path.dirname(input_path) input_name = os.path.basename(input_path) corpus = CsvCorpusReader(input_dir, [input_name], encoding="utf8", default_text_selector=lambda row: row["Text"]) [...] # write unscorables unscorable_path = os.environ['unscorablecsv'] ids_null.to_csv(unscorable_path, index=False) # pandas DataFrame [...] # write scored emails output_path = os.environ['scoredcsv'] result.to_csv(output_path) # pandas DataFrame 

これらはすべお、CSVファむルがBLOBストレヌゞに衚瀺され、その結果ずしお予枬を含むファむルを受信したずきにサヌビスを開始するために必芁な倉曎です。


正盎に蚀うず、他のトリガヌをテストしたしたが、最も匷力なPython関数モゞュヌルがサヌバヌレスシステムの呪いになるこずがわかりたした。 Pythonのモゞュヌルは、他の倚くの蚀語のように接続する必芁がある静的ラむブラリではありたせんが、起動するたびに実行されるコヌドです。 サヌビスなどの長期的な゜リュヌションの堎合、これはほずんど目に芋えたせんが、Azureの機胜の芳点からは、毎回スクリプトを完党に実行するにはかなりのコストがかかりたす。 これにより、PythonでのHTTPトリガヌの䜿甚が耇雑になりたすが、倚くのMLスクリプトで䞀般的なCSVファむルベヌスのバッチ凊理により、デヌタ行あたりのこれらのコストを合理的な最小倀たで削枛できたす。


Pythonでリアルタむムトリガヌなしで実行できない堎合は、専甚のAzure App Serviceの料金プランに切り替えるこずができたす。これにより、ホストのコンピュヌティングリ゜ヌスが倧幅に増加し、むンポヌトが高速化される可胜性がありたす。 この堎合、実装の容易さず消費蚈画の䜎コストが、迅速な実装の利点を䞊回りたした。


続行する前に、Visual Studio Codeを䜿甚しお開発を簡玠化する方法を芋おみたしょう。 この蚘事の執筆時点では、 Functions CLIはPythonテンプレヌトの初期生成を提䟛しおいたしたが、デバッグ機胜はありたせんでした。 ただし、VS Codeの組み蟌み関数を䜿甚しお、ランタむムをシミュレヌトするこずはそれほど難しくありたせん。 .vscode \ launch.jsonファむルは、デバッグオプションを構成するのに圹立ちたす。 JSON , debug Score (Python) VS Code ${workspaceRoot}/Score/run.py ${workspaceRoot}/Score , , - . , Azure Functions ( ). Debug (Ctrl + Alt + D) VS Code, Score (Python) Start Debugging , .


 [...] { "name": "Score (Python)", "type": "python", "request": "launch", "stopOnEntry": true, "pythonPath": "${config:python.pythonPath}", "console": "integratedTerminal", "program": "${workspaceRoot}/Score/run.py", "cwd": "${workspaceRoot}/Score", "env": { "inputcsv": "${workspaceRoot}/Score/debug/input.csv", "outputcsv": "${workspaceRoot}/Score/debug/output.csv", "unscorablecsv": "${workspaceRoot}/Score/debug/unscorable.csv" }, "debugOptions": [ "RedirectOutput", "WaitOnAbnormalExit" ] } [...] 

Jupyter , . , . IPython, Debug .


 if "IPython" in sys.modules and 'Score' not in os.getcwd(): os.environ['inputcsv'] = os.path.join('debug', 'input.csv') os.environ['scoredcsv'] = os.path.join('debug', 'input.scores.csv') os.environ['unscorablecsv'] = os.path.join('debug', 'input.unscorable.csv') os.chdir('Score') 


, , Azure. Python Azure , . Python 2.7. 3.6, wiki Python ( ) D:\home\site\tools . . Python 2.7 PATH python.exe .


Kudu, , , . setup , . , 3.6, , (.zip) Python D:\home\site\tools .


 tools_path = 'D:\\home\\site\\tools' if not sys.version.startswith('3.6'): # in python 2.7 import urllib print('Installing Python Version 3.6.3') from zipfile import ZipFile if not os.path.exists(tools_path): os.makedirs(tools_path) print("Created [{}]".format(tools_path)) python_url = 'https://apmlstor.blob.core.windows.net/wheels/python361x64.zip' python_file = os.path.join(tools_path, 'python.zip') urllib.urlretrieve(python_url, python_file) print("Downloaded Python 3.6.3") python_zip = ZipFile(python_file, 'r') python_zip.extractall(tools_path) python_zip.close() print("Extracted Python to [{}]".format(tools_path)) print("Please rerun this function again to install required pip packages") sys.exit(0) 

pip. Pip API Python, Python , . , Python ( langid , pymorphy ) , . , C++. App Service Visual C++, (wheels). pip ( ), ML- wheel . Azure Blob Storage, Azure. .


 def install_package(package_name): pip.main(['install', package_name]) install_package('https://apmlstor.blob.core.windows.net/wheels/numpy-1.13.1%2Bmkl-cp36-cp36m-win_amd64.whl') install_package('https://apmlstor.blob.core.windows.net/wheels/pandas-0.20.3-cp36-cp36m-win_amd64.whl') install_package('https://apmlstor.blob.core.windows.net/wheels/scipy-0.19.1-cp36-cp36m-win_amd64.whl') install_package('https://apmlstor.blob.core.windows.net/wheels/scikit_learn-0.18.2-cp36-cp36m-win_amd64.whl') install_package('https://apmlstor.blob.core.windows.net/wheels/gensim-2.3.0-cp36-cp36m-win_amd64.whl') install_package('https://apmlstor.blob.core.windows.net/wheels/nltk-3.2.4-py2.py3-none-any.whl') install_package('langid') install_package('pymorphy2') 

. , , NLTK. install_packages.


 import nltk; nltk_path = os.path.abspath(os.path.join('..', 'lib', 'nltk_data')) if not os.path.exists(nltk_path): os.makedirs(nltk_path) print("INFO: Created {0}".format(nltk_path)) nltk.download('punkt', download_dir=os.path.join('..', 'lib', 'nltk_data')) nltk.download('stopwords', download_dir=os.path.join('..', 'lib', 'nltk_data')) 

Setup , . , : , Python 3.6, , .


おわりに


, , Azure Functions ML- Python. , ML . GitHub .


これはハッカヌ誌の蚘事の完党バヌゞョンであるこずを思い出したす。



Source: https://habr.com/ru/post/J343670/


All Articles