2017-11-19 9 views
1

私はrasa nluを使ってデータを訓練しています。 http://nlu.rasa.ai/python.htmlのドキュメントごとに、次のコードは、ファイルのデモ-rasa.jsonにjsonオブジェクトをPythonからrasa nluで直接トレーニングする方法

from rasa_nlu.converters import load_data 
from rasa_nlu.config import RasaNLUConfig 
from rasa_nlu.model import Trainer 

training_data = load_data('data/examples/rasa/demo-rasa.json') 
trainer = Trainer(RasaNLUConfig("sample_configs/config_spacy.json")) 
trainer.train(training_data) 
model_directory = trainer.persist('./projects/default/') 

が存在するデータを訓練するために使用する必要がありますしかし、その代わりに、どのように我々は、訓練のためのJSONオブジェクトからデータを読みます。

+0

私はこれがこの質問の続きだと思います。 https://stackoverflow.com/questions/47313046/how-to-create-training-data-for-rasa-nlu-through-program-nodejs/47313236 –

答えて

1

あなたがload_dataの実装を見れば、それは2つのステップを実行します。

  1. は、ファイル形式
  2. が最も簡単な解決策は次のようになり、適切な積載方法

を使用してファイルをロードすると思いますjsonオブジェクトをファイルまたはStringIOオブジェクトに書き込む。

また、必要な特定の読み込み機能(たとえば、load_rasa_data)を選択して読み込みファイルを分離することもできます。この例では、関数全体を取り、data = _read_json_from_file(filename)という行を削除するだけです。

私は幾分驚いていますが、現在ロードされているjsonオブジェクトを読み取る方法はありません。この機能をこれに適応させることに決めた場合は、プルリクエストを書くことを検討することができます。

+0

応答に感謝します。結論として、jsonオブジェクトを直接渡すことはできませんか?ファイルを作成することは、私がそれをしたくないことです。おそらく私はStringIOを使用するオプションを検討します –

+0

ソースコードを見てみましょう:はい、簡単な方法はありません。開発者に知らせるためにGitHubで問題を開き、代替ソリューションを提供するかもしれません。 –

1

JSONオブジェクトをファイルから読み込むのではなく、リクエストボディから取得するフラスコアプリケーションを作成しました。

このコードは、エンティティとsklearn-crfsuiteのためにspaCyを使用して既存のLUIS jsonをインテント認識のために変換します。

from flask import Flask, jsonify, request 
from flask_cors import CORS 
import json, os, msvcrt, psutil, subprocess, datetime 

app = Flask(__name__) 

CORS(app) 

with app.app_context(): 
    with app.test_request_context(): 

     #region REST based RASA API 
     serverExecutablePID = 0  
     hasAPIStarted = False 
     configFileDirectory = "C:\\Code\\RasaAPI\\RASAResources\\config" 
     chitChatModel = "ChitChat" 
     assetsDirectory = "C:\\Code\\RasaAPI\\RASAResources" 

     def createSchema(SchemaPath, dataToBeWritten): 
      try: 
        #write LUIS or RASA JSON Schema in json file locking the file to avoid race condition using Python's Windows msvcrt binaries 
        with open(SchemaPath, "w") as SchemaCreationHandle: 
         msvcrt.locking(SchemaCreationHandle.fileno(), msvcrt.LK_LOCK, os.path.getsize(SchemaPath)) 
         json.dump(dataToBeWritten, SchemaCreationHandle, indent = 4, sort_keys=False) 
         SchemaCreationHandle.close() 

        #Check if written file actually exists on disk or not 
        doesFileExist = os.path.exists(SchemaPath)      
        return doesFileExist 

      except Exception as ex: 
       return str(ex.args) 


     def appendTimeStampToModel(ModelName): 
      return ModelName + '_{:%Y%m%d-%H%M%S}.json'.format(datetime.datetime.now()) 

     def appendTimeStampToConfigSpacy(ModelName): 
      return ModelName + '_config_spacy_{:%Y%m%d-%H%M%S}.json'.format(datetime.datetime.now()) 

     def createConfigSpacy(ModelName, DataPath, ConfigSpacyPath, TrainedModelsPath, LogDataPath): 
      try: 
        with open(ConfigSpacyPath, "w") as configSpacyFileHandle: 
         msvcrt.locking(configSpacyFileHandle.fileno(), msvcrt.LK_LOCK, os.path.getsize(ConfigSpacyPath)) 
         configDataToBeWritten = dict({ 
         "project": ModelName, 
         "data": DataPath, 
         "path": TrainedModelsPath, 
         "response_log": LogDataPath, 
         "log_level": "INFO", 
         "max_training_processes": 1, 
         "pipeline": "spacy_sklearn", 
         "language": "en", 
         "emulate": "luis", 
         "cors_origins": ["*"], 
         "aws_endpoint_url": None, 
         "token": None, 
         "num_threads": 2, 
         "port": 5000 
         }) 
         json.dump(configDataToBeWritten, configSpacyFileHandle, indent = 4, sort_keys=False) 

        return os.path.getsize(ConfigSpacyPath) > 0 

      except Exception as ex: 
       return str(ex.args) 

     def TrainRASA(configFilePath): 
      try: 
       trainingString = 'start /wait python -m rasa_nlu.train -c ' + '\"' + os.path.normpath(configFilePath) + '\"' 
       returnCode = subprocess.call(trainingString, shell = True) 
       return returnCode 

      except Exception as ex: 
       return str(ex.args) 

     def StartRASAServer(configFileDirectory, ModelName): 
      #region Server starting logic 
      try: 
       global hasAPIStarted 
       global serverExecutablePID 
       #1) for finding which is the most recent config_spacy 
       root, dirs, files = next(os.walk(os.path.normpath(configFileDirectory))) 

       configFiles = [configFile for configFile in files if ModelName in configFile] 
       configFiles.sort(key = str.lower, reverse = True) 
       mostRecentConfigSpacy = os.path.join(configFileDirectory, configFiles[0]) 

       serverStartingString = 'start /wait python -m rasa_nlu.server -c ' + '\"' + os.path.normpath(mostRecentConfigSpacy) + '\"' 

       serverProcess = subprocess.Popen(serverStartingString, shell = True) 
       serverExecutablePID = serverProcess.pid 

       pingReturnCode = 1 
       while(pingReturnCode): 
        pingReturnCode = os.system("netstat -na | findstr /i 5000") 
       if(pingReturnCode == 0): 
        hasAPIStarted = True 

       return pingReturnCode 

      except Exception as ex: 
       return jsonify({"message": "Failed because: " + str(ex.args) , "success": False}) 
      #endregion 

     def KillProcessWindow(hasAPIStarted, serverExecutablePID): 
      if(hasAPIStarted == True and serverExecutablePID != 0): 
       me = psutil.Process(serverExecutablePID) 
       for child in me.children(): 
        child.kill() 


     @app.route('/api/TrainRASA', methods = ['POST']) 
     def TrainRASAServer(): 
      try: 
       #get request body of POST request 
       postedJSONData = json.loads(request.data, strict = False) 

       if postedJSONData["data"] is not None: 
        print("Valid data") 
        #region JSON file building logic 
        modelName = postedJSONData["modelName"] 
        modelNameWithExtension = appendTimeStampToModel(modelName) 
        schemaPath = os.path.join(assetsDirectory, "data", modelNameWithExtension) 
        print(createSchema(schemaPath, postedJSONData["data"])) 
        #endregion 

        #region config file creation logic 
        configFilePath = os.path.join(assetsDirectory, "config", appendTimeStampToConfigSpacy(modelName)) 
        logsDirectory = os.path.join(assetsDirectory, "logs") 
        trainedModelDirectory = os.path.join(assetsDirectory, "models") 
        configFileCreated = createConfigSpacy(modelName, schemaPath, configFilePath, trainedModelDirectory, logsDirectory) 
        #endregion 

        if(configFileCreated == True): 
         #region Training RASA NLU with schema 
         TrainingReturnCode = TrainRASA(configFilePath) 
         #endregion 

         if(TrainingReturnCode == 0): 
          return jsonify({"message": "Successfully trained RASA NLU with modelname: " + modelName, "success": True}) 
          # KillProcessWindow(hasAPIStarted, serverExecutablePID) 
          # serverStartingReturnCode = StartRASAServer(configFileDirectory, modelName) 
          # #endregion 

          # if serverStartingReturnCode == 0:      
          #  return jsonify({"message": "Successfully started RASA server on port 5000", "success": True}) 

          # elif serverStartingReturnCode is None: 
          #  return jsonify({"message": "Could not start RASA server, request timed out", "success": False}) 

         else: 
          return jsonify({"message": "Soemthing wrong happened while training RASA NLU!", "success": False}) 

        else: 
         return jsonify({"message": "Could not create config file for RASA NLU", "success": False}) 

       #throw exception if request body is empty 
       return jsonify({"message": "Please enter some JSON, JSON seems to be empty", "success": False}) 

      except Exception as ex: 
       return jsonify({"Reason": "Failed because" + str(ex.args), "success": False}) 

     @app.route('/api/StopRASAServer', methods = ['GET']) 
     def StopRASAServer(): 
      try: 
       global serverExecutablePID 

       if(serverExecutablePID != 0 or serverExecutablePID != None): 
        me = psutil.Process(serverExecutablePID) 
        for child in me.children(): 
         child.kill() 
        return jsonify({"message": "Server stopped....", "success": True}) 
      except Exception as ex: 
       return jsonify({"message": "Something went wrong while shutting down the server because: " + str(ex.args), "success": True}) 

     if __name__ == "__main__": 
      StartRASAServer(configFileDirectory, chitChatModel) 
      app.run(debug=False, threaded = True, host='0.0.0.0', port = 5050) 
関連する問題