Quick and easy
Our platform provides Restful API supporting the most popular formats; JSON and XML. We use cloud computing with auto scale configuration to ensure robust infrastructure you can rely on. In order to start processing documents, you need to get api key from us. You will find the key in your administration panel once you register.
Register, get the api key and play with api directly on the web
Swagger: http://api.text2data.com/swagger/ui/Please download below code samples to start integrating your systems with our API (.NET)
Nuget package installation
PM> Install-Package Text2data.com.SentimentAnalysis.Api -Version 3.6.1
Code samples [api v3]
//C# code sample when using our SDK var inputText = "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more."; var privateKey = "---------------------"; //add your private key here (you can find it in the admin panel once you sign-up) var secret = ""; //this should be set-up in admin panel as well // Create request object var doc = new Document() { DocumentText = inputText, IsTwitterContent = false, UserCategoryModelName = "", //name of your trained model, leave empty for default PrivateKey = privateKey, Secret = secret, RequestIdentifier = "" //optional, used for reporting context }; var docResult = API.GetDocumentAnalysisResult(doc); //execute request if (docResult.Status == (int)DocumentResultStatus.OK) //check status { // display document level score Console.WriteLine(string.Format("This document is: {0}{1} {2}", docResult.DocSentimentPolarity, docResult.DocSentimentResultString, docResult.DocSentimentValue.ToString("0.00"))); Console.WriteLine(string.Format("Magnitude: {0}", docResult.Magnitude.ToString("0.00"))); Console.WriteLine(string.Format("Subjectivity: {0}", docResult.Subjectivity)); // display themes if any found if (docResult.Themes != null && docResult.Themes.Any()) { Console.WriteLine(Environment.NewLine + "Themes:"); foreach (var theme in docResult.Themes) { Console.WriteLine(string.Format("{0} ({1}) {2}{3} {4}", theme.Text, theme.KeywordType, theme.SentimentPolarity, theme.SentimentResult, theme.SentimentValue.ToString("0.00"))); } } // display entity scores if any found if (docResult.Entities != null && docResult.Entities.Any()) { Console.WriteLine(Environment.NewLine + "Entities:"); foreach (var entity in docResult.Entities) { Console.WriteLine(string.Format("{0} ({1}) {2}{3} {4}", entity.Text, entity.KeywordType, entity.SentimentPolarity, entity.SentimentResult, entity.SentimentValue.ToString("0.00"))); } } // display keyword scores if any found if (docResult.Keywords != null && docResult.Keywords.Any()) { Console.WriteLine(Environment.NewLine + "Keywords:"); foreach (var keyword in docResult.Keywords) { Console.WriteLine(string.Format("{0} ({1}) {2}{3} {4}", keyword.Text, keyword.KeywordType, keyword.SentimentPolarity, keyword.SentimentResult, keyword.SentimentValue.ToString("0.00"))); } } //display more information below if required //... } else { Console.WriteLine(docResult.ErrorMessage); } Console.ReadLine();
//VB.NET code sample when using our SDK Dim inputText As String = "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more." Dim privateKey As String = "-------------------------" 'add your private key here (you can find it in the admin panel once you sign-up) Dim secret As String = "" 'this should be set-up in admin panel as well Dim doc = New Document() With {.DocumentText = inputText, .IsTwitterContent = False, .UserCategoryModelName = "", .PrivateKey = privateKey, .Secret = secret, .RequestIdentifier = ""} Dim docResult = API.GetDocumentAnalysisResult(doc) 'execute request If docResult.Status = CInt(DocumentResultStatus.OK) Then 'check status 'display document level score Console.WriteLine(String.Format("This document is: {0}{1} {2}", docResult.DocSentimentPolarity, docResult.DocSentimentResultString, docResult.DocSentimentValue.ToString("0.000"))) Console.WriteLine(String.Format("Magnitude: {0}", docResult.Magnitude.ToString("0.000"))) Console.WriteLine(String.Format("Subjectivity: {0}", docResult.Subjectivity)) If docResult.Themes IsNot Nothing AndAlso docResult.Themes.Any() Then Console.WriteLine(Environment.NewLine + "Themes:") For Each theme As SentencePart In docResult.Themes Console.WriteLine(String.Format("{0} ({1}) {2}{3} {4}", theme.Text, theme.KeywordType, theme.SentimentPolarity, theme.SentimentResult, theme.SentimentValue.ToString("0.0000"))) Next End If If docResult.Entities IsNot Nothing AndAlso docResult.Entities.Any() Then Console.WriteLine(Environment.NewLine + "Entities:") For Each entity As SentencePart In docResult.Entities Console.WriteLine(String.Format("{0} ({1}) {2}{3} {4}", entity.Text, entity.KeywordType, entity.SentimentPolarity, entity.SentimentResult, entity.SentimentValue.ToString("0.0000"))) Next End If If docResult.Keywords IsNot Nothing AndAlso docResult.Keywords.Any() Then Console.WriteLine(Environment.NewLine + "Keywords:") For Each keyword As SentencePart In docResult.Keywords Console.WriteLine(String.Format("{0} ({1}) {2}{3} {4}", keyword.Text, keyword.KeywordType, keyword.SentimentPolarity, keyword.SentimentResult, keyword.SentimentValue.ToString("0.0000"))) Next End If 'display more information below if required Else Console.WriteLine(docResult.ErrorMessage) End If Console.ReadLine()
var requestDto = new { DocumentText = "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more.", IsTwitterContent = false, UserCategoryModelName = "", PrivateKey = "----------",//add your private key here (you can find it in the admin panel once you sign-up) Secret = "", //this should be set-up in admin panel as well RequestIdentifier = "" //optional, used for reporting context }; dynamic responseData; //////make request var request = (HttpWebRequest)WebRequest.Create("http://api.text2data.com/v3/analyze"); request.Method = "POST"; request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.ContentType = "application/json"; using (var requestWriter = new StreamWriter(request.GetRequestStream())) { requestWriter.Write(new JavaScriptSerializer().Serialize(requestDto)); } var response = (HttpWebResponse)request.GetResponse(); using (var resStream = response.GetResponseStream()) { using (var reader = new StreamReader(resStream)) { responseData = new JavaScriptSerializer().DeserializeObject(reader.ReadToEnd()); } } ///display received data if (responseData != null && responseData["Status"] == 1) { Console.WriteLine(string.Format("This document is: {0}{1} {2}", responseData["DocSentimentPolarity"], responseData["DocSentimentResultString"], responseData["DocSentimentValue"].ToString("0.00"))); Console.WriteLine(string.Format("Magnitude: {0}", responseData["Magnitude"].ToString("0.00"))); Console.WriteLine(string.Format("Subjectivity: {0}", responseData["Subjectivity"])); Console.WriteLine(Environment.NewLine + "Themes:"); foreach (var theme in responseData["Themes"]) { Console.WriteLine(string.Format("{0} ({1}) {2}{3} {4}", theme["Text"], theme["KeywordType"], theme["SentimentPolarity"], theme["SentimentResult"], theme["SentimentValue"].ToString("0.00"))); } Console.WriteLine(Environment.NewLine + "Keywords:"); foreach (var keyword in responseData["Keywords"]) { Console.WriteLine(string.Format("{0} ({1}) {2}{3} {4}", keyword["Text"], keyword["KeywordType"], keyword["SentimentPolarity"], keyword["SentimentResult"], keyword["SentimentValue"].ToString("0.00"))); } } else { Console.WriteLine(responseData["ErrorMessage"]); } Console.ReadLine();
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.json.JSONObject; public class mainClass { public static void main(String[] args) throws IOException { String documentText = "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more."; String isTwitter = "false"; String userCategoryModelName = ""; String privateKey = "-----------";//add your private key here (you can find it in the admin panel once you sign-up) String secret = "";//this should be set-up in admin panel as well /////// String payload = "{" + "\"DocumentText\":\"" + documentText + "\", " + "\"IsTwitterContent\":\"" + isTwitter + "\", " + "\"UserCategoryModelName\":\"" + userCategoryModelName + "\", " + "\"PrivateKey\":\"" + privateKey + "\", " + "\"Secret\":\"" + secret + "\", " + "\"RequestIdentifier\":\"" + "" + "\" " + "}"; //make request StringEntity entity = new StringEntity(payload, ContentType.create("application/json")); HttpClient httpClient = HttpClientBuilder.create().build(); HttpPost post = new HttpPost("http://api.text2data.com/v3/analyze"); post.setEntity(entity); HttpResponse response = httpClient.execute(post); //execute request BufferedReader readBuffer = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuilder result = new StringBuilder(); String line = ""; while ((line = readBuffer.readLine()) != null) { result.append(line); } JSONObject jsonObj = new JSONObject(result.toString()); int status = (int)jsonObj.get("Status"); //display results if(status == 1) { System.out.println(String.format("This document is: %1s%2s %3.2f", jsonObj.getString("DocSentimentPolarity"), jsonObj.getString("DocSentimentResultString"), jsonObj.get("DocSentimentValue"))); System.out.println(String.format("Magnitude: %1.2f", jsonObj.getString("Magnitude"))); System.out.println(String.format("Subjectivity: %1s", jsonObj.getString("Subjectivity"))); System.out.println("Themes:"); for (Object item : jsonObj.getJSONArray("Themes")) { JSONObject arrObj = (JSONObject)item; System.out.println(String.format("%1s (%2s) %3s%4s %5.2f", arrObj.getString("Text"), arrObj.getString("KeywordType"), arrObj.getString("SentimentPolarity"), arrObj.getString("SentimentResult"), arrObj.get("SentimentValue"))); } System.out.println("Entities:"); for (Object item : jsonObj.getJSONArray("Entities")) { JSONObject arrObj = (JSONObject)item; System.out.println(String.format("%1s (%2s) %3s%4s %5.2f", arrObj.getString("Text"), arrObj.getString("KeywordType"), arrObj.getString("SentimentPolarity"), arrObj.getString("SentimentResult"), arrObj.get("SentimentValue"))); } System.out.println("Keywords:"); for (Object item : jsonObj.getJSONArray("Keywords")) { JSONObject arrObj = (JSONObject)item; System.out.println(String.format("%1s (%2s) %3s%4s %5.2f", arrObj.getString("Text"), arrObj.getString("KeywordType"), arrObj.getString("SentimentPolarity"), arrObj.getString("SentimentResult"), arrObj.get("SentimentValue"))); } //display more information below if required //... } else { System.out.println(jsonObj.get("ErrorMessage")); } } }
import requests import json url = 'http://api.text2data.com/v3/analyze' payload = { 'DocumentText': 'Excellent location, opposite a very large mall with wide variety of shops, restaurants and more.', 'IsTwitterContent': 'false', 'PrivateKey': '------------', #add your private key here (you can find it in the admin panel once you sign-up) 'Secret':'', #this should be set-up in admin panel as well 'RequestIdentifier': '' #optional, used for reporting context } r = requests.post(url, data=payload) data=r.json() if data['Status'] == 1: print('This document is: %s%s %+.2f' % (data['DocSentimentPolarity'], data['DocSentimentResultString'],data['DocSentimentValue'])) print('Magnitude: %.2f' %(data['Magnitude'])) print('Subjectivity: %s' %(data['Subjectivity'])) print('Themes') for item in data['Themes']: print('%s (%s) %s%s %+.2f' %(item['Text'], item['KeywordType'], item['SentimentPolarity'], item['SentimentResult'], item['SentimentValue'])) print('Entities') for item in data['Entities']: print('%s (%s) %s%s %+.2f' %(item['Text'], item['KeywordType'], item['SentimentPolarity'], item['SentimentResult'], item['SentimentValue'])) print('Keywords') for item in data['Keywords']: print('%s (%s) %s%s %+.2f' %(item['Text'], item['KeywordType'], item['SentimentPolarity'], item['SentimentResult'], item['SentimentValue'])) #display more information below if required #... else: print(data['ErrorMessage'])
library(httr) url <- "http://api.text2data.com/v3/analyze" requestBody <- list( DocumentText = "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more.", IsTwitterContent = "false", UserCategoryModelName = "", PrivateKey = "------------",#add your private key here (you can find it in the admin panel once you sign-up) Secret= "", #this should be set-up in admin panel as well RequestIdentifier = "" #optional, used for reporting context ) #make POST request res <- httr::POST(url = url,body = requestBody, encode = "json") #read response json <- httr::content(res, as = "text") respData <- jsonlite::fromJSON(json) #display results if(respData$Status == 1) { print( sprintf("This document is: %s %s%.2f", respData$DocSentimentResultString, respData$DocSentimentPolarity, respData$DocSentimentValue) ) print( sprintf("Magnitude is: %.2f", respData$Magnitude) ) print( sprintf("Subjectivity is: %s", respData$Subjectivity) ) } else{ print(respData$ErrorMessage) }
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ \ "DocumentText": "Excellent location, opposite a very large mall with wide variety of shops, restaurants and more.", \ "IsTwitterContent": false, \ "PrivateKey": "your api key here", \ "Secret": "your secret here", \ "UserCategoryModelName": "", \ "DocumentLanguage": "en", \ "SerializeFormat": 1, \ "RequestIdentifier": "" \ }' 'http://api.text2data.com/v3/analyze'
API url (shared): http://api.text2data.com/v3/analyze API url (custom endpoint): http(s)://your_company.text2data.com/v3/analyze
//enums DocumentResultStatus: OK = 1, AuthenticationFailure = 2, CreditExceeded = 3, //top up required ServiceBusy = 4, ValidationError = 5, GenericError = 6 SerializeFormats: Json = 1, Xml = 2
Document categorization service
Document categorization service allows you analyzing big documents quicker as it only returns auto categories and user categories data. Post and return object structure is the same as for "analyze" method.
You can use it e.g. to filter down the data prior performing full analysis.
Categorization service url (shared): http://api.text2data.com/v3/categorize Categorization service url (custom endpoint): http(s)://your_company.text2data.com/v3/categorize
To invoke the service, just make the post request with your parameters. If you want to use your non-default classification model, set UserCategoryModelName param (leave it blank otherwise). Detected categories will be returned in "AutoCategories" and "UserCategories" json node collection.
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ \ "DocumentText": "document content", \ "PrivateKey": "---", \ "Secret": "---", \ "UserCategoryModelName": "", \ "RequestIdentifier": "your identifier" \ }' 'http://api.text2data.com/v3/Categorize'
Document extraction service
Document extraction service allows you extracting entities from big documents quicker as it only returns entities found, without analyzing sentiment. Post and return object structure is the same as for "analyze" method.
You might easily train your own extraction model using extraction model builder under text2data user panel.
Extraction service url (shared): http://api.text2data.com/v3/extract Extraction service url (custom endpoint): http(s)://your_company.text2data.com/v3/extract
To invoke the service, just make the post request with your parameters. If you want to use your non-default extraction model, set UserCategoryModelName param (leave it blank otherwise). Extracted entities will be returned in "Entities" json node collection.
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ \ "DocumentText": "document content", \ "PrivateKey": "---", \ "Secret": "---", \ "UserCategoryModelName": "", \ "RequestIdentifier": "your identifier" \ }' 'http://api.text2data.com/v3/Extract'
Following samples show request and response objects in JSON.
Post object
{ "DocumentText": "string", //text to be analysed "IsTwitterContent": false, //Twitter mode setting "PrivateKey": "string", // private key, can be found in admin panel "Secret": "string", //api password, can be set in admin panel "UserCategoryModelName": "string", //custom category model (optional) "DocumentLanguage": "string", //"en" by default (english only is supported) "SerializeFormat": 1, //json(1) or xml(2) "RequestIdentifier": "" //optional, used for reporting context }
Response object
{ "DocSentimentResultString": "string", "DocSentimentValue": 0, "DocSentimentPolarity": "string", "Magnitude": 0, "Entities": [ { "Text": "string", "SentenceText": "string", "Mentions": 0, "Magnitude": 0, "SentencePartType": "string", "KeywordType": "string", "SentimentResult": "string", "SentimentValue": 0, "SentimentPolarity": "string" } ], "Themes": [ { "Text": "string", "SentenceText": "string", "Mentions": 0, "Magnitude": 0, "SentencePartType": "string", "KeywordType": "string", "SentimentResult": "string", "SentimentValue": 0, "SentimentPolarity": "string" } ], "Keywords": [ { "Text": "string", "SentenceText": "string", "Mentions": 0, "Magnitude": 0, "SentencePartType": "string", "KeywordType": "string", "SentimentResult": "string", "SentimentValue": 0, "SentimentPolarity": "string" } ], "Citations": [ { "Text": "string", "SentenceText": "string", "Mentions": 0, "Magnitude": 0, "SentencePartType": "string", "KeywordType": "string", "SentimentResult": "string", "SentimentValue": 0, "SentimentPolarity": "string" } ], "SlangWords": [ { "SlangWordText": "string", "SlangWordTranslation": "string" } ], "SwearWords": [ { "SlangWordText": "string", "SlangWordTranslation": "string" } ], "CoreSentences": [ { "SentenceNumber": 0, "Text": "string", "SentimentResultString": "string", "SentimentValue": 0, "SentimentPolarity": "string", "Relevance": 0, "Magnitude": 0 } ], "PartsOfSpeech": [ { "Text": "string", "Subject": "string", "Action": "string", "Object": "string", "ObjectSentimentResultString": "string", "ObjectSentimentValue": 0, "ObjectSentimentPolarity": "string" } ], "AutoCategories": [ { "CategoryName": "string", "Score": 0 } ], "UserCategories": [ { "CategoryName": "string", "Score": 0 } ], "Subjectivity": "string", "DetectedLanguage": "string", "ErrorMessage": "string", "Status": 0, "TransactionTotalCreditsLeft": 0, "TransactionUseByDate": "2019-04-22T11:32:21.332Z", "TransactionCurrentDay": 0, "TransactionDailyLimit": 0 }
If you don't have skills to integrate with our platform, we can do it for you. Please contact us for no obligation quote.
Custom API Endpoint
If you need unlimited access/ number of requests per day, we can provide you with completely isolated API engine on the VM with the size and location of your choice.
The diagram below shows how this fits in into your company's IT infrastructure landscape:
If you choose to have your separate endpoint, you will have your custom API url like http(s)://[yourCompanyName].text2data.com
You will then be able to call your endpoint programmatically, using our provided SDK or our Excel Add-In/Google Sheets Add-on by setting-up your custom name in the settings as presented below: