Example #1
0
        /// <summary>
        /// Loads a finetune collection into memory for useage.
        /// </summary>
        /// <param name="collectionName">Name of the custom collection to load</param>
        /// <returns>An object describing the custom collection</returns>
        public async Task <FinetuneCollection> Load(string collectionName)
        {
            // If the collection is already ready, don't re-load.
            FinetuneCollection collectionInfo = await this.Info(collectionName);

            if (collectionInfo.LoadStatus == "ready")
            {
                return(collectionInfo);
            }

            // Kick off load job
            string jobID = await StartModelLoad(collectionName);

            while (true)
            {
                await Task.Delay(pollDelay);

                AsyncJobStatus jobStatus = await GetStatus(jobID);

                if (jobStatus == AsyncJobStatus.Success)
                {
                    break;
                }
                else if (jobStatus == AsyncJobStatus.Failure || jobStatus == AsyncJobStatus.Revoked)
                {
                    throw new IndicoAPIException("Load Failed");
                }
            }

            return(await GetResults <FinetuneCollection>(jobID));
        }
        static async Task Main(string[] args)
        {
            const string APIKey        = "XXXXXX";
            const string APIHost       = @"https://api-demo.indico.io";
            const string FinetuneModel = "1234_5678_9123456789";

            if (args.Length == 0)
            {
                Console.WriteLine("Please supply a path to a pdf file or directory.");
                Environment.Exit(1);
            }

            List <string> validFiles = BuildFileList(args);
            Dictionary <string, string> fileTexts = new Dictionary <string, string>();

            if (validFiles.Count == 0)
            {
                return;
            }

            Indico sdk = new Indico(APIKey, APIHost);

            // Extract the contents of each file and write to a txt file.

            // Build a list of extraction tasks
            IEnumerable <Task <Tuple <string, string> > > extractTasksQuery =
                from filePath in validFiles select ExtractDocument(filePath, sdk);

            // Kick off all the tasks in the list
            List <Task <Tuple <string, string> > > extractTasks = extractTasksQuery.ToList();

            while (extractTasks.Count > 0)
            {
                Task <Tuple <string, string> > firstFinishedTask = await Task.WhenAny(extractTasks);

                Tuple <string, string> extractResult = await firstFinishedTask;
                extractTasks.Remove(firstFinishedTask);
                // Skip any failed documents
                if (extractResult.Item2 != null)
                {
                    fileTexts.Add(extractResult.Item1, extractResult.Item2);
                }
            }

            // Load Finetune model
            try
            {
                Console.WriteLine("Loading Model...");
                FinetuneCollection collection = await sdk.finetune.Load(FinetuneModel);

                Console.WriteLine("Model Loaded: {0}", JsonConvert.SerializeObject(collection, Formatting.Indented));
            }
            catch (IndicoAPIException iae)
            {
                Console.WriteLine("Error loading model for predictions. {0}", iae.Message);
                return;
            }

            try
            {
                // Get Finetune Extraction Predictions
                List <List <FinetuneExtraction> > allExtractions =
                    await sdk.finetune.PredictAnnotation(FinetuneModel, fileTexts.Values.ToArray());

                int           extractionCount    = 0;
                string[]      extractedFilenames = fileTexts.Keys.ToArray();
                StringBuilder sb = new StringBuilder();
                for (var i = 0; i < allExtractions.Count; i++)
                {
                    string fileName = Path.GetFileName(extractedFilenames[i]);
                    foreach (FinetuneExtraction extraction in allExtractions.ElementAt(i))
                    {
                        string label = extraction.Label;
                        sb.Append(fileName + ",");
                        sb.Append(FormatCSVCell(extraction.Text) + ",");
                        sb.Append(label + ",");
                        sb.Append(extraction.Confidence[label]);
                        sb.AppendLine();
                        extractionCount++;
                    }
                }

                // Write Results to file
                string outputPath = Path.Combine(Directory.GetCurrentDirectory(), "output.csv");
                File.WriteAllText(outputPath, sb.ToString());
                Console.WriteLine("Finetune Extractions complete. {0} extractions found. Report is available here: {1}", extractionCount, outputPath);
            }
            catch (IndicoAPIException iae)
            {
                Console.WriteLine("Error getting predictions for documents. {0}", iae.Message);
                return;
            }
            catch (IOException ioe)
            {
                Console.WriteLine("Error writing predicitons report. {0}", ioe.Message);
            }
        }