finalized commit for project

parent 79102fcb
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<targetSelectedWithDropDown>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="C:\Users\MY PC\.android\avd\Pixel_XL_API_22.avd" />
</Key>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2021-10-13T08:54:25.046235500Z" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.aircop"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.android.volley:volley:1.2.0'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.example.aircop;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.aircop", appContext.getPackageName());
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.aircop">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/aircop"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AirCop">
<activity android:name=".ChemicalSummary"></activity>
<activity android:name=".MainActivitySpeak" />
<activity android:name=".MainActivityChat" />
<activity android:name=".MainActivity2" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
package com.example.aircop;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class ChemicalSummary extends AppCompatActivity {
private TextView data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chemical_summary);
Bundle bundle = getIntent().getExtras();
String response = bundle.getString("response");
data = (TextView) findViewById(R.id.data);
data.setText(response);
}
}
\ No newline at end of file
package com.example.aircop;
public class Constant {
private Constant() {}
public static final String URL = "https://40cf-2402-4000-11ce-54f4-8146-1239-444b-42e7.ngrok.io/";
// public static final String URL = "https://2b8b-2402-4000-2381-b6fe-18d5-f9c4-6a64-17e8.ngrok.io/";
}
package com.example.aircop;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.startButton);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
}
});
}
}
\ No newline at end of file
package com.example.aircop;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.ArrayList;
import java.util.List;
import static com.example.aircop.Constant.URL;
public class MainActivity2 extends AppCompatActivity {
private Button chatButton;
private Button speakButton;
private Button colomboBtn;
private Button galleBtn;
private Button nuwaraBtn;
private Button kandyBtn;
private Button malabeBtn;
private Button jaffnaBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
chatButton = (Button) findViewById(R.id.chatButton);
speakButton = (Button) findViewById(R.id.speakButton);
colomboBtn = (Button) findViewById(R.id.colomboBtn);
galleBtn = (Button) findViewById(R.id.galleBtn);
nuwaraBtn = (Button) findViewById(R.id.nuwaraBtn);
kandyBtn = (Button) findViewById(R.id.kandyBtn);
malabeBtn = (Button) findViewById(R.id.malabeBtn);
jaffnaBtn = (Button) findViewById(R.id.jaffnaBtn);
chatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity2.this, MainActivityChat.class);
startActivity(intent);
}
});
speakButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity2.this, MainActivitySpeak.class);
startActivity(intent);
}
});
colomboBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=Colombo";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
});
galleBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=Galle";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
});
nuwaraBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=Nuwaraeliya";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
});
kandyBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=Kandy";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
});
malabeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=Malabe";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
}
});
jaffnaBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = URL;
url = url + "chemical?location=jafna";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
System.out.println("Request: Colombo");
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", response);
startActivity(intent);
},
error -> {
System.out.println("Error: " + error);
Intent intent = new Intent(MainActivity2.this, ChemicalSummary.class);
intent.putExtra("response", error.getMessage());
startActivity(intent);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
}
});
}
}
\ No newline at end of file
package com.example.aircop;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.ArrayList;
import java.util.Locale;
import static com.example.aircop.Constant.URL;
public class MainActivityChat extends AppCompatActivity {
Button sendButton;
TextToSpeech textToSpeech;
private ArrayList<String> sentimentArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_chat);
textToSpeech = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
if(i == TextToSpeech.SUCCESS){
int lang = textToSpeech.setLanguage(Locale.ENGLISH);
}
}
});
ArrayList<String> bot = new ArrayList<>();
bot.add("Say hello!!!");
ArrayList<String> user = new ArrayList<>();
user.add("");
ListView list;
MyListAdapter adapter = new MyListAdapter(this, bot, user);
list = (ListView) findViewById(R.id.list);
list.setAdapter(adapter);
sendButton = (Button) findViewById(R.id.sendButton);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) findViewById(R.id.message);
String message = editText.getText().toString();
editText.setText("");
editText.setHint("Type a message");
String url = URL;
url = url + "chat?message=" + message + "&user=user";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivityChat.this);
System.out.println("Request: " + message);
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
user.add(message);
user.add("");
bot.add("");
String[] splitResponse = response.split("/");
System.out.println("Adding sentiment: " + splitResponse[1]);
sentimentArrayList.add(splitResponse[1]);
if(splitResponse[0].equalsIgnoreCase("Bye")){
String sentimentalMessage = getSentimentalMessage();
bot.add(sentimentalMessage + " See you, take care." + "Recommendation of location: " + splitResponse[2]
+ " and chemical: " + splitResponse[3]);
}
else
bot.add(splitResponse[0]);
ListView list1 = (ListView) findViewById(R.id.list);
MyListAdapter adapter = new MyListAdapter(MainActivityChat.this, bot, user);
list1 = (ListView) findViewById(R.id.list);
list1.setAdapter(adapter);
},
error -> {
System.out.println("Error: " + error);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
});
}
public String getSentimentalMessage(){
int neutral = 0;
int positive = 0;
int negative = 0;
for(String sentiment : sentimentArrayList){
System.out.println("sentiment: " + sentiment);
if(sentiment.equalsIgnoreCase("Neutral"))
negative++;
else if(sentiment.equalsIgnoreCase("Positive"))
positive++;
else
neutral++;
}
System.out.println("neutral: " + neutral);
System.out.println("positive: " + positive);
System.out.println("negative: " + negative);
if((neutral >= positive) && (neutral >= negative))
return "I feel this as a normal day, It is pleasant to meet you.";
else if((positive >= neutral) && (positive >= negative))
return "It is a very great day today.";
else
return "Always be happy, Everything will be alright soon.";
}
}
\ No newline at end of file
package com.example.aircop;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.ArrayList;
import java.util.Locale;
import static com.example.aircop.Constant.URL;
//Shan's part
public class MainActivitySpeak extends AppCompatActivity {
protected static final int RESULT_SPEECH = 1;
Button speakButton;
ArrayList<String> bot = new ArrayList<>();
ArrayList<String> user = new ArrayList<>();
ListView list;
TextToSpeech textToSpeech;
private ArrayList<String> sentimentArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_speak);
textToSpeech = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
if(i == TextToSpeech.SUCCESS){
int lang = textToSpeech.setLanguage(Locale.ENGLISH);
}
}
});
bot.add("Say hello!!!");
user.add("");
MyListAdapter adapter = new MyListAdapter(this, bot, user);
list = (ListView) findViewById(R.id.list);
list.setAdapter(adapter);
speakButton = (Button) findViewById(R.id.speakButton);
speakButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");
try{
startActivityForResult(intent, RESULT_SPEECH);
// text is not valid
}
catch (Exception e){
Toast.makeText(getApplicationContext(), "Your device doesn't support Speech to Text", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case RESULT_SPEECH:
if(resultCode == RESULT_OK && data != null){
ArrayList<String> text = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String message = text.get(0);
String url = URL;
url = url + "chat?message=" + message + "&user=user";
RequestQueue requestQueue = Volley.newRequestQueue(MainActivitySpeak.this);
System.out.println("Request: " + message);
StringRequest myReq = new StringRequest(Request.Method.GET,
url,
response -> {
System.out.println("Response: " + response);
user.add(message);
user.add("");
bot.add("");
String[] splitResponse = response.split("/");
System.out.println("Adding sentiment: " + splitResponse[1]);
sentimentArrayList.add(splitResponse[1]);
if(splitResponse[0].equalsIgnoreCase("Bye")){
String sentimentalMessage = getSentimentalMessage();
bot.add(sentimentalMessage + " See you, take care." + "Recommendation of location: " + splitResponse[2]
+ " and chemical: " + splitResponse[3]);
response = sentimentalMessage + " See you, take care." + "Recommendation of location: " + splitResponse[2]
+ " and chemical: " + splitResponse[3];
}
else{
bot.add(splitResponse[0]);
response = splitResponse[0];
}
ListView list1 = (ListView) findViewById(R.id.list);
MyListAdapter adapter = new MyListAdapter(MainActivitySpeak.this, bot, user);
list1 = (ListView) findViewById(R.id.list);
list1.setAdapter(adapter);
int speech=0;
speech = textToSpeech.speak(response, TextToSpeech.QUEUE_FLUSH, null);
},
error -> {
System.out.println("Error: " + error);
});
myReq.setRetryPolicy(new RetryPolicy() {
@Override
public int getCurrentTimeout() {
return 50000;
}
@Override
public int getCurrentRetryCount() {
return 50000;
}
@Override
public void retry(VolleyError error) throws VolleyError {
}
});
requestQueue.add(myReq);
}
}
}
public String getSentimentalMessage(){
int neutral = 0;
int positive = 0;
int negative = 0;
for(String sentiment : sentimentArrayList){
System.out.println("sentiment: " + sentiment);
if(sentiment.equalsIgnoreCase("Neutral"))
negative++;
else if(sentiment.equalsIgnoreCase("Positive"))
positive++;
else
neutral++;
}
System.out.println("neutral: " + neutral);
System.out.println("positive: " + positive);
System.out.println("negative: " + negative);
if((neutral >= positive) && (neutral >= negative))
return "I feel this as a normal day, It is pleasant to meet you.";
else if((positive >= neutral) && (positive >= negative))
return "It is a very great day today.";
else
return "Always be happy, Everything will be alright soon.";
}
}
\ No newline at end of file
package com.example.aircop;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyListAdapter extends ArrayAdapter<String> {
private final Activity context;
private final ArrayList<String> botChatList;
private final ArrayList<String> userChatList;
public MyListAdapter(Activity context, ArrayList<String> botChatList, ArrayList<String> userChatList) {
super(context, R.layout.mylist, botChatList);
// TODO Auto-generated constructor stub
this.context=context;
this.botChatList=botChatList;
this.userChatList=userChatList;
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.mylist, null,true);
TextView botText = (TextView) rowView.findViewById(R.id.bot);
TextView userText = (TextView) rowView.findViewById(R.id.user);
if(botChatList.get(position).equals("") || botChatList.get(position) == null){
botText.setVisibility(View.GONE);
}
else{
userText.setVisibility(View.GONE);
}
botText.setText(botChatList.get(position));
userText.setText(userChatList.get(position));
return rowView;
};
}
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="#03A9F4" />
<solid android:color="#BDDBE8" />
<corners
android:radius="3dp"
android:topRightRadius="10dp"
android:topLeftRadius="10dp"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
/>
</shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="#3F51B5" />
<solid android:color="#BBC0DA" />
<corners
android:radius="3dp"
android:topRightRadius="10dp"
android:topLeftRadius="10dp"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ChemicalSummary">
<TextView
android:id="@+id/chemicalText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chemical Summary"
android:textColor="#2196F3"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.045" />
<TextView
android:id="@+id/data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:text="Data"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/chemicalText" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textColor="#2196F3"
android:textSize="50sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.045" />
<ImageView
android:id="@+id/imageView"
android:layout_width="247dp"
android:layout_height="221dp"
android:layout_marginBottom="180dp"
app:layout_constraintBottom_toTopOf="@+id/btnStart"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/aircop" />
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginBottom="16dp"
android:text="Start"
app:backgroundTint="#2196F3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textColor="#2196F3"
android:textSize="50sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.045" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="338dp"
android:layout_height="288dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.46"
app:srcCompat="@drawable/srilanka" />
<Button
android:id="@+id/chatButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="Chat"
app:backgroundTint="#2196F3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.91"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/speakButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="Speak"
app:backgroundTint="#2196F3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.086"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/colomboBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="300dp"
android:text="Colombo"
app:backgroundTint="#2196F3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/kandyBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginTop="348dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="Kandy"
app:backgroundTint="#2196F3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/galleBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="204dp"
android:text="Galle"
app:backgroundTint="#2196F3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/malabeBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginTop="252dp"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="Malabe"
app:backgroundTint="#2196F3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/nuwaraBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="396dp"
android:text="Nuwareliya"
app:backgroundTint="#2196F3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/jaffnaBtn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginTop="444dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="Jaffna"
app:backgroundTint="#2196F3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/message"
android:layout_alignParentTop="true"
android:layout_marginTop="0dp"
android:layout_marginBottom="5dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"></ListView>
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="15dp"
android:text="Send"
app:backgroundTint="#2196F3" />
<EditText
android:id="@+id/message"
android:layout_width="277dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:layout_marginBottom="14dp"
android:ems="10"
android:inputType="textPersonName"
android:hint="Type a message" />
</RelativeLayout>
\ No newline at end of file
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Shan's part-->
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/speakButton"
android:layout_marginBottom="5dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"></ListView>
<Button
android:id="@+id/speakButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:layout_marginBottom="15dp"
android:text="Click To Speak"
app:backgroundTint="#2196F3" />
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/bot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:background="@drawable/bg_rounded_bot"
android:padding="10dp"
android:text="Bot"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/black" />
<TextView
android:id="@+id/user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginRight="15dp"
android:background="@drawable/bg_rounded_user"
android:padding="10dp"
android:text="User"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/black" />
</RelativeLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AirCop" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">AirCop</string>
</resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AirCop" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">#2196F3</item>
<item name="colorPrimaryVariant">@color/teal_200</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
\ No newline at end of file
package com.example.aircop;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
\ No newline at end of file
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
\ No newline at end of file
#Thu Sep 09 08:04:03 IST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
########################################### QUESTIONS AND SQL LOGICS START ###########################################
SAPNAKA'S QUESTIONS
What is the composition of chemicals in Colombo?
• Validate if there is record
• Shows data about today
SELECT `chemical`, `value` FROM `elements` WHERE `date` = '2021-08-31' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
What is the composition of chemicals in Colombo on 2021-08-31?
• Validate if there is record
• Validate date and show appropriate data
SELECT `chemical`, `value` FROM `elements` WHERE `date` = '2021-08-31' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
What is the composition level of CO2 in Colombo?
• Validate if there is record
• Shows data about today
SELECT `chemical`, `value` FROM `elements` WHERE `date` = '2021-08-30' AND `othername` LIKE '%carbon dioxide%' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
What is the composition of CO2 in Colombo on 2021-08-30?
• Validate if there is record
• Validate date and show appropriate data
SELECT `chemical`, `value` FROM `elements` WHERE `date` = '2021-08-30' AND `othername` LIKE '%carbon dioxide%' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
What is the summary of chemicals in Colombo?
• Validate if there is record
• Shows data about today
SELECT `location`, `summary` FROM `conditions` WHERE `date` = '2021-08-31' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
What is the summary of chemicals in Colombo on 2021-08-31?
• Validate if there is record
• Validate date and show appropriate data
SELECT `location`, `summary` FROM `conditions` WHERE `date` = '2021-08-31' AND `location` = 'colombo'
NLU DONE - SQL completed
################
################
################
Tell me the chemical summary of the whole map.
• Validate if there is record
• Shows data about today
SELECT `date`, `result` FROM `summary` WHERE `date` = '2021-08-31'
NLU DONE - SQL completed
################
################
################
Tell me the chemical summary of the whole map on 2021-08-31.
• Validate if there is record
• Validate date and show appropriate data
SELECT `date`, `result` FROM `summary` WHERE `date` = '2021-08-31'
NLU DONE - SQL completed
################
################
################
What is the effect of chemicals in Colombo?
• Validate if there is record
• Shows data about today
SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '2021-08-31'
NLU DONE - SQL completed
################
################
################
What is the effect of chemicals in Colombo on 2021-08-31?
• Validate if there is record
• Validate date and show appropriate data
SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '2021-08-31'
NLU DONE - SQL completed
################
################
################
What is the effect of CO2 in Colombo?
• Validate if there is record
• Shows data about today
SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '2021-08-31' AND `othername` LIKE '%carbon dioxide%'
NLU DONE - SQL completed
################
################
################
What is the effect of CO2 in Colombo on 2021-08-31?
• Validate if there is record
• Validate date and show appropriate data
SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '2021-08-31' AND `othername` LIKE '%carbon dioxide%'
NLU DONE - SQL completed
########################################### QUESTIONS AND SQL LOGICS END ###########################################
\ No newline at end of file
Can you tell me about this application?
SELECT `value` FROM support WHERE `key` = 'about'
DONE
How to use this application?
SELECT `value` FROM support WHERE `key` = 'use'
DONE
What are the main locations supported?
SELECT `value` FROM support WHERE `key` = 'location'
DONE
What are the main functions of this system?
SELECT `value` FROM support WHERE `key` = 'function'
DONE
\ No newline at end of file
# common start
# This files contains your custom actions which can be used to run
# custom Python code.
#
# See this guide on how to implement these action:
# https://rasa.com/docs/rasa/custom-actions
# This is a simple example for a custom action which utters "Hello World!"
import random
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
import datetime
from rasa_sdk.events import SlotSet
import mysql.connector
from datetime import datetime
#
#
# class ActionHelloWorld(Action):
#
# def name(self) -> Text:
# return "action_hello_world"
#
# def run(self, dispatcher: CollectingDispatcher,
# tracker: Tracker,
# domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
#
# dispatcher.utter_message(text="Hello World!")
#
# return []
# common end
# Sapnaka part start
#######################################################################################################################################
# begin database search
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="air_polution"
)
#######################################################################################################################################
# Functions
class ChemicalQueryHandler1(Action):
def name(self) -> Text:
return "chemical_query_handler_1"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# Variable Init
prediction = tracker.latest_message
entity_type = prediction['entities']
requirement = ""
location = ""
sql = ""
message = ""
chatStatus = True
date = str(datetime.today().strftime('%Y-%m-%d'))
mycursor = mydb.cursor()
# Extract input from user message
for x in entity_type:
if(x["entity"] == "requirement" and x["extractor"] == "CRFEntityExtractor"):
requirement = str(x["value"])
for x in entity_type:
if(x["entity"] == "location" and x["extractor"] == "CRFEntityExtractor"):
location = str(x["value"])
# Build the sql statement based on the user input
if(requirement == "composition"):
sql = "SELECT `chemical`, `value` FROM `elements` WHERE `date` = '" + date + "' AND `location` = '" + location + "'"
elif(requirement == "summary" and location == "whole map"):
sql = "SELECT `date`, `result` FROM `summary` WHERE `date` = '" + date + "'"
elif(requirement == "summary"):
sql = "SELECT `location`, `summary` FROM `conditions` WHERE `date` = '" + date + "' AND `location` = '" + location + "'"
elif(requirement == "effect"):
sql = "SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '" + date + "'"
else:
message = "Something went wrong, please try again."
chatStatus = False
# Print the sql statement
print("SQL: " + sql)
# Check the status of the above logic to continue
if(chatStatus == True):
# Execute sql statement
mycursor.execute(sql)
myresult = mycursor.fetchall()
# Check if result has data
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Section composition
if(requirement == "composition"):
message = "The composition(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + "."
i = i + 1
message = message + text
# Section summary of whole map
elif(requirement == "summary" and location == "whole map"):
message = "The summary of chemicals in the whole map are " + str(myresult[0][1])
# Section summary of location
elif(requirement == "summary"):
message = "The summary of chemicals in " + str(myresult[0][0]) + " are " + str(myresult[0][1])
# Section effect
elif(requirement == "effect"):
message = "The effect(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s effect is " + str(myresultObj[1]) + "."
i = i + 1
message = message + text
else:
message = "No data available."
else:
print("result is empty")
message = "No data available."
# Attach the message to send user
dispatcher.utter_message(text=message)
return []
#######################################################################################################################################
# Functions
class ChemicalQueryHandler2(Action):
def name(self) -> Text:
return "chemical_query_handler_2"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# Variable Init
prediction = tracker.latest_message
entity_type = prediction['entities']
requirement = ""
location = ""
date = ""
sql = ""
message = ""
chatStatus = True
mycursor = mydb.cursor()
# Extract input from user message
for x in entity_type:
if(x["entity"] == "requirement" and x["extractor"] == "CRFEntityExtractor"):
requirement = str(x["value"])
for x in entity_type:
if(x["entity"] == "location" and x["extractor"] == "CRFEntityExtractor"):
location = str(x["value"])
for x in entity_type:
if(x["entity"] == "date" and x["extractor"] == "CRFEntityExtractor"):
date = str(x["value"])
# Build the sql statement based on the user input
if(requirement == "composition"):
sql = "SELECT `chemical`, `value` FROM `elements` WHERE `date` = '" + date + "' AND `location` = '" + location + "'"
elif(requirement == "summary" and location == "whole map"):
sql = "SELECT `date`, `result` FROM `summary` WHERE `date` = '" + date + "'"
elif(requirement == "summary"):
sql = "SELECT `location`, `summary` FROM `conditions` WHERE `date` = '" + date + "' AND `location` = '" + location + "'"
elif(requirement == "effect"):
sql = "SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '" + date + "'"
else:
message = "Something went wrong, please try again."
chatStatus = False
# Print the sql statement
print("SQL: " + sql)
# Check the status of the above logic to continue
if(chatStatus == True):
# Execute sql statement
mycursor.execute(sql)
myresult = mycursor.fetchall()
# Check if result has data
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Section composition
if(requirement == "composition"):
message = "The composition(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
# Section summary of whole map
elif(requirement == "summary" and location == "whole map"):
message = "The summary of chemicals in the whole map are " + str(myresult[0][1]) + ". On " + date
# Section summary of location
elif(requirement == "summary"):
message = "The summary of chemicals in " + str(myresult[0][0]) + " are " + str(myresult[0][1]) + ". On " + date
# Section effect
elif(requirement == "effect"):
message = "The effect(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
else:
message = "No data available."
else:
print("result is empty")
message = "No data available."
# Attach the message to send user
dispatcher.utter_message(text=message)
return []
#######################################################################################################################################
# Functions
class ChemicalQueryHandler3(Action):
def name(self) -> Text:
return "chemical_query_handler_3"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# Variable Init
prediction = tracker.latest_message
entity_type = prediction['entities']
requirement = ""
location = ""
words = ""
sql = ""
message = ""
chatStatus = True
mycursor = mydb.cursor()
date = str(datetime.today().strftime('%Y-%m-%d'))
# Extract input from user message
for x in entity_type:
if(x["entity"] == "requirement" and x["extractor"] == "CRFEntityExtractor"):
requirement = str(x["value"])
for x in entity_type:
if(x["entity"] == "location" and x["extractor"] == "CRFEntityExtractor"):
location = str(x["value"])
for x in entity_type:
if(x["entity"] == "words" and x["extractor"] == "CRFEntityExtractor"):
words = str(x["value"])
# Build the sql statement based on the user input
if(requirement == "composition"):
sql = "SELECT `chemical`, `value` FROM `elements` WHERE `date` = '" + date + "' AND `othername` LIKE '%" + words + "%' AND `location` = '" + location + "'"
elif(requirement == "effect"):
sql = "SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '" + date + "' AND `othername` LIKE '%" + words + "%' AND `location` = '" + location + "'"
else:
message = "Something went wrong, please try again."
chatStatus = False
# Print the sql statement
print("SQL1: " + sql)
# Check the status of the above logic to continue
if(chatStatus == True):
# Execute sql statement
mycursor.execute(sql)
myresult = mycursor.fetchall()
# Check if result has data
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Section composition
if(requirement == "composition"):
message = "The composition(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
# Section effect
elif(requirement == "effect"):
message = "The effect(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
else:
message = "No data available."
else:
print("result is empty")
message = "No data available."
# Attach the message to send user
dispatcher.utter_message(text=message)
return []
#######################################################################################################################################
# Functions
class ChemicalQueryHandler4(Action):
def name(self) -> Text:
return "chemical_query_handler_4"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# Variable Init
prediction = tracker.latest_message
entity_type = prediction['entities']
requirement = ""
location = ""
words = ""
sql = ""
message = ""
date = ""
chatStatus = True
mycursor = mydb.cursor()
# Extract input from user message
for x in entity_type:
if(x["entity"] == "requirement" and x["extractor"] == "CRFEntityExtractor"):
requirement = str(x["value"])
for x in entity_type:
if(x["entity"] == "location" and x["extractor"] == "CRFEntityExtractor"):
location = str(x["value"])
for x in entity_type:
if(x["entity"] == "words" and x["extractor"] == "CRFEntityExtractor"):
words = str(x["value"])
for x in entity_type:
if(x["entity"] == "date" and x["extractor"] == "CRFEntityExtractor"):
date = str(x["value"])
# Build the sql statement based on the user input
if(requirement == "composition"):
sql = "SELECT `chemical`, `value` FROM `elements` WHERE `date` = '" + date + "' AND `othername` LIKE '%" + words + "%' AND `location` = '" + location + "'"
elif(requirement == "effect"):
sql = "SELECT `chemical`, `effect` FROM `elements` WHERE `date` = '" + date + "' AND `othername` LIKE '%" + words + "%' AND `location` = '" + location + "'"
else:
message = "Something went wrong, please try again."
chatStatus = False
# Print the sql statement
print("SQL: " + sql)
# Check the status of the above logic to continue
if(chatStatus == True):
# Execute sql statement
mycursor.execute(sql)
myresult = mycursor.fetchall()
# Check if result has data
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Section composition
if(requirement == "composition"):
message = "The composition(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
# Section effect
elif(requirement == "effect"):
message = "The effect(s) of chemicals are as follows: "
text = ""
i = 1
for myresultObj in myresult:
if(i == 1):
text = myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ", "
else:
text = text + myresultObj[0] + "'s effect is " + str(myresultObj[1]) + ". On " + date
i = i + 1
message = message + text
else:
message = "No data available."
else:
print("result is empty")
message = "No data available."
# Attach the message to send user
dispatcher.utter_message(text=message)
return []
#######################################################################################################################################
# Sapnaka part end
# Shan part start
#######################################################################################################################################
# Functions
class SupportFunction1(Action):
def name(self) -> Text:
return "support_function_1"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# Variable Init
prediction = tracker.latest_message
entity_type = prediction['entities']
helpData = ""
sql = ""
message = ""
chatStatus = True
mycursor = mydb.cursor()
# Extract input from user message
for x in entity_type:
if(x["entity"] == "help" and x["extractor"] == "CRFEntityExtractor"):
helpData = str(x["value"])
# Build the sql statement based on the user input
if(helpData == "about"):
sql = "SELECT `value` FROM support WHERE `key` = 'about'"
elif(helpData == "use"):
sql = "SELECT `value` FROM support WHERE `key` = 'use'"
elif(helpData == "locations"):
sql = "SELECT `value` FROM support WHERE `key` = 'location'"
elif(helpData == "functions"):
sql = "SELECT `value` FROM support WHERE `key` = 'function'"
else:
message = "Something went wrong, please try again."
chatStatus = False
# Print the sql statement
print("SQL: " + sql)
# Check the status of the above logic to continue
if(chatStatus == True):
# Execute sql statement
mycursor.execute(sql)
myresult = mycursor.fetchall()
# Check if result has data
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Check category
if(helpData == "about" or helpData == "use" or helpData == "locations" or helpData == "functions"):
message = str(myresult[0][0])
else:
message = "No data available."
else:
print("result is empty")
message = "No data available."
# Attach the message to send user
dispatcher.utter_message(text=message)
return []
#######################################################################################################################################
# Shan part end
\ No newline at end of file
# common start
# Configuration for Rasa NLU.
# https://rasa.com/docs/rasa/nlu/components/
language: en
pipeline:
# # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model.
# # If you'd like to customize it, uncomment and adjust the pipeline.
# # See https://rasa.com/docs/rasa/tuning-your-model for more information.
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: CRFEntityExtractor
# - name: LexicalSyntacticFeaturizer
# analyzer: char_wb
# min_ngram: 1
# max_ngram: 4
- name: EntitySynonymMapper
- name: CountVectorsFeaturizer
- name: DIETClassifier
epochs: 100
constrain_similarities: true
# - name: ResponseSelector
# epochs: 100
# constrain_similarities: true
# - name: FallbackClassifier
# threshold: 0.3
# ambiguity_threshold: 0.1
# Configuration for Rasa Core.
# https://rasa.com/docs/rasa/core/policies/
policies:
# # No configuration for policies was provided. The following default policies were used to train your model.
# # If you'd like to customize them, uncomment and adjust the policies.
# # See https://rasa.com/docs/rasa/policies for more information.
# - name: MemoizationPolicy
# - name: RulePolicy
# - name: UnexpecTEDIntentPolicy
# max_history: 5
# epochs: 100
# - name: TEDPolicy
# max_history: 5
# epochs: 100
# constrain_similarities: true
# common end
\ No newline at end of file
# common start
# This file contains the credentials for the voice & chat platforms
# which your bot is using.
# https://rasa.com/docs/rasa/messaging-and-voice-channels
rest:
# # you don't need to provide anything here - this channel doesn't
# # require any credentials
#facebook:
# verify: "<verify>"
# secret: "<your secret>"
# page-access-token: "<your page access token>"
#slack:
# slack_token: "<your slack token>"
# slack_channel: "<the slack channel>"
# slack_signing_secret: "<your slack signing secret>"
#socketio:
# user_message_evt: <event name for user message>
# bot_message_evt: <event name for bot messages>
# session_persistence: <true/false>
#mattermost:
# url: "https://<mattermost instance>/api/v4"
# token: "<bot token>"
# webhook_url: "<callback URL>"
# This entry is needed if you are using Rasa X. The entry represents credentials
# for the Rasa X "channel", i.e. Talk to your bot and Share with guest testers.
rasa:
url: "http://localhost:5002/api"
# common end
\ No newline at end of file
# common start
version: "2.0"
nlu:
- intent: greet
examples: |
- hey
- hello
- hi
- hello there
- good morning
- good evening
- moin
- hey there
- let's go
- hey dude
- goodmorning
- goodevening
- good afternoon
- intent: goodbye
examples: |
- good afternoon
- cu
- good by
- cee you later
- good night
- bye
- goodbye
- have a nice day
- see you around
- bye bye
- see you later
- intent: affirm
examples: |
- yes
- y
- indeed
- of course
- that sounds good
- correct
- intent: deny
examples: |
- no
- n
- never
- I don't think so
- don't like that
- no way
- not really
- intent: mood_great
examples: |
- perfect
- great
- amazing
- feeling like a king
- wonderful
- I am feeling very good
- I am great
- I am amazing
- I am going to save the world
- super stoked
- extremely good
- so so perfect
- so good
- so perfect
- intent: mood_unhappy
examples: |
- my day was horrible
- I am sad
- I don't feel very well
- I am disappointed
- super sad
- I'm so sad
- sad
- very sad
- unhappy
- not good
- not very good
- extremly sad
- so saad
- so sad
- intent: bot_challenge
examples: |
- are you a bot?
- are you a human?
- am I talking to a bot?
- am I talking to a human?
# common end
# Sapnaka and Shan part start
- intent: inform
examples: |
- what is the [composition](requirement) of chemicals in [Colombo](location)?
- what's the [composition](requirement) of chemicals in [Kandy](location)?
- tell me the [composition](requirement) of chemicals in [Galle](location)
- [composition](requirement) of chemicals in [Malabe](location)
- lemme know the [composition](requirement) of chemicals in [Colombo](location)
- let me know the [composition](requirement) of chemicals in [Jafna](location)
- can you tell me the [composition](requirement) of chemicals in [Malabe](location)
- can you lemme know the [composition](requirement) of chemicals in [Galle](location)
- can you let me know the [composition](requirement) of chemicals in [Nuwaraeliya](location)
- I need to know about the [composition](requirement) of chemicals in [Kandy](location)
- what is the [effect](requirement) of chemicals in [Colombo](location)?
- what's the [effect](requirement) of chemicals in [Kandy](location)?
- tell me the [effect](requirement) of chemicals in [Galle](location)
- [effect](requirement) of chemicals in [Malabe](location)
- lemme know the [effect](requirement) of chemicals in [Colombo](location)
- let me know the [effect](requirement) of chemicals in [Jafna](location)
- can you tell me the [effect](requirement) of chemicals in [Malabe](location)
- can you lemme know the [effect](requirement) of chemicals in [Galle](location)
- can you let me know the [effect](requirement) of chemicals in [Nuwaraeliya](location)
- I need to know about the [effect](requirement) of chemicals in [Kandy](location)
- what is the [composition](requirement) of chemicals in [Colombo](location) on [2021-08-05](date)?
- what's the [composition](requirement) of chemicals in [Kandy](location) on [2021-09-23](date)?
- tell me the [composition](requirement) of chemicals in [Galle](location) on [2021-10-21](date)
- [composition](requirement) of chemicals in [Malabe](location) on [2021-08-21](date)
- lemme know the [composition](requirement) of chemicals in [Colombo](location) on [2021-11-27](date)
- let me know the [composition](requirement) of chemicals in [Jafna](location) on [2021-05-20](date)
- can you tell me the [composition](requirement) of chemicals in [Malabe](location) on [2021-06-16](date)
- can you lemme know the [composition](requirement) of chemicals in [Galle](location) on [2021-03-11](date)
- can you let me know the [composition](requirement) of chemicals in [Nuwaraeliya](location) on [2021-01-14](date)
- I need to know about the [composition](requirement) of chemicals in [Kandy](location) on [2021-02-25](date)
- what is the [effect](requirement) of chemicals in [Colombo](location) on [2021-08-05](date)?
- what's the [effect](requirement) of chemicals in [Kandy](location) on [2021-09-23](date)?
- tell me the [effect](requirement) of chemicals in [Galle](location) on [2021-10-21](date)
- [effect](requirement) of chemicals in [Malabe](location) on [2021-08-21](date)
- lemme know the [effect](requirement) of chemicals in [Colombo](location) on [2021-11-27](date)
- let me know the [effect](requirement) of chemicals in [Jafna](location) on [2021-05-20](date)
- can you tell me the [effect](requirement) of chemicals in [Malabe](location) on [2021-06-16](date)
- can you lemme know the [effect](requirement) of chemicals in [Galle](location) on [2021-03-11](date)
- can you let me know the [effect](requirement) of chemicals in [Nuwaraeliya](location) on [2021-01-14](date)
- I need to know about the [effect](requirement) of chemicals in [Kandy](location) on [2021-02-25](date)
- what is the [composition](requirement) level of [co2](words) in [Colombo](location)?
- what's the [composition](requirement) of [no2](words) in [Kandy](location)?
- tell me the [composition](requirement) of [nitrogen](words) in [Galle](location)
- [composition](requirement) of [no2](words) in [Malabe](location)
- lemme know the [composition](requirement) of [carbon dioxide](words) in [Colombo](location)
- let me know the [composition](requirement) of [h2](words) in [Jafna](location)
- can you tell me the [composition](requirement) of [o2](words) in [Malabe](location)
- can you lemme know the [composition](requirement) of [nitrogen dioxide](words) in [Galle](location)
- can you let me know the [composition](requirement) of [sulfur dioxide](words) in [Nuwaraeliya](location)
- I need to know about the [composition](requirement) of [oxygen](words) in [Kandy](location)
- what is the [effect](requirement) level of [co2](words) in [Colombo](location)?
- what's the [effect](requirement) of [no2](words) in [Kandy](location)?
- tell me the [effect](requirement) of [nitrogen](words) in [Galle](location)
- [effect](requirement) of [no2](words) in [Malabe](location)
- lemme know the [effect](requirement) of [carbon dioxide](words) in [Colombo](location)
- let me know the [effect](requirement) of [h2](words) in [Jafna](location)
- can you tell me the [effect](requirement) of [o2](words) in [Malabe](location)
- can you lemme know the [effect](requirement) of [nitrogen dioxide](words) in [Galle](location)
- can you let me know the [effect](requirement) of [sulfur dioxide](words) in [Nuwaraeliya](location)
- I need to know about the [effect](requirement) of [oxygen](words) in [Kandy](location)
- what is the [composition](requirement) of [co2](words) in [Colombo](location) on [2021-08-05](date)?
- what's the [composition](requirement) of [no2](words) in [Kandy](location) on [2021-09-23](date)?
- tell me the [composition](requirement) of [nitrogen](words) in [Galle](location) on [2021-10-21](date)
- [composition](requirement) of [no2](words) in [Malabe](location) on [2021-08-21](date)
- lemme know the [composition](requirement) of [carbon dioxide](words) in [Colombo](location) on [2021-11-27](date)
- let me know the [composition](requirement) of [h2](words) in [Jafna](location) on [2021-05-20](date)
- can you tell me the [composition](requirement) of [o2](words) in [Malabe](location) on [2021-06-16](date)
- can you lemme know the [composition](requirement) of [nitrogen dioxide](words) in [Galle](location) on [2021-03-11](date)
- can you let me know the [composition](requirement) of [sulfur dioxide](words) in [Nuwaraeliya](location) on [2021-01-14](date)
- I need to know about the [composition](requirement) of [oxygen](words) in [Kandy](location) on [2021-02-25](date)
- what is the [effect](requirement) of [co2](words) in [Colombo](location) on [2021-08-05](date)?
- what's the [effect](requirement) of [no2](words) in [Kandy](location) on [2021-09-23](date)?
- tell me the [effect](requirement) of [nitrogen](words) in [Galle](location) on [2021-10-21](date)
- [effect](requirement) of [no2](words) in [Malabe](location) on [2021-08-21](date)
- lemme know the [effect](requirement) of [carbon dioxide](words) in [Colombo](location) on [2021-11-27](date)
- let me know the [effect](requirement) of [h2](words) in [Jafna](location) on [2021-05-20](date)
- can you tell me the [effect](requirement) of [o2](words) in [Malabe](location) on [2021-06-16](date)
- can you lemme know the [effect](requirement) of [nitrogen dioxide](words) in [Galle](location) on [2021-03-11](date)
- can you let me know the [effect](requirement) of [sulfur dioxide](words) in [Nuwaraeliya](location) on [2021-01-14](date)
- I need to know about the [effect](requirement) of [oxygen](words) in [Kandy](location) on [2021-02-25](date)
- what is the [summary](requirement) of chemicals in [Colombo](location)?
- what is the [summary](requirement) of chemicals in [whole map](location)?
- what's the [summary](requirement) of chemicals in [Kandy](location)?
- what's the [summary](requirement) of chemicals in [whole map](location)?
- tell me the [summary](requirement) of chemicals in [Galle](location)
- tell me the [summary](requirement) of chemicals in [whole map](location)
- [summary](requirement) of chemicals in [Malabe](location)
- [summary](requirement) of chemicals in [whole map](location)
- lemme know the [summary](requirement) of chemicals in [Colombo](location)
- lemme know the [summary](requirement) of chemicals in [whole map](location)
- let me know the [summary](requirement) of chemicals in [Jafna](location)
- let me know the [summary](requirement) of chemicals in [whole map](location)
- can you tell me the [summary](requirement) of chemicals in [Malabe](location)
- can you tell me the [summary](requirement) of chemicals in [whole map](location)
- can you lemme know the [summary](requirement) of chemicals in [Galle](location)
- can you lemme know the [summary](requirement) of chemicals in [whole map](location)
- can you let me know the [summary](requirement) of chemicals in [Nuwaraeliya](location)
- can you let me know the [summary](requirement) of chemicals in [whole map](location)
- I need to know about the [summary](requirement) of chemicals in [Kandy](location)
- I need to know about the [summary](requirement) of chemicals in [whole map](location)
- what is the [summary](requirement) of chemicals in [Colombo](location) on [2021-08-05](date)?
- what is the [summary](requirement) of chemicals in [whole map](location) on [2021-08-05](date)?
- what's the [summary](requirement) of chemicals in [Kandy](location) on [2021-09-23](date)?
- what's the [summary](requirement) of chemicals in [whole map](location) on [2021-09-23](date)?
- tell me the [summary](requirement) of chemicals in [Galle](location) on [2021-10-21](date)
- tell me the [summary](requirement) of chemicals in [whole map](location) on [2021-10-21](date)
- [summary](requirement) of chemicals in [Malabe](location) on [2021-08-21](date)
- [summary](requirement) of chemicals in [whole map](location) on [2021-08-21](date)
- lemme know the [summary](requirement) of chemicals in [Colombo](location) on [2021-11-27](date)
- lemme know the [summary](requirement) of chemicals in [whole map](location) on [2021-11-27](date)
- let me know the [summary](requirement) of chemicals in [Jafna](location) on [2021-05-20](date)
- let me know the [summary](requirement) of chemicals in [whole map](location) on [2021-05-20](date)
- can you tell me the [summary](requirement) of chemicals in [Malabe](location) on [2021-06-16](date)
- can you tell me the [summary](requirement) of chemicals in [whole map](location) on [2021-06-16](date)
- can you lemme know the [summary](requirement) of chemicals in [Galle](location) on [2021-03-11](date)
- can you lemme know the [summary](requirement) of chemicals in [whole map](location) on [2021-03-11](date)
- can you let me know the [summary](requirement) of chemicals in [Nuwaraeliya](location) on [2021-01-14](date)
- can you let me know the [summary](requirement) of chemicals in [whole map](location) on [2021-01-14](date)
- I need to know about the [summary](requirement) of chemicals in [Kandy](location) on [2021-02-25](date)
- I need to know about the [summary](requirement) of chemicals in [whole map](location) on [2021-02-25](date)
- can you tell me [about](help) this application?
- can you let me know [about](help) this application?
- can you lemme know [about](help) this application?
- tell me [about](help) this application
- [about](help) this application
- I need to know [about](help) this application
- I want to know [about](help) this application
- lemme know [about](help) this application
- let me know [about](help) this application
- will you let me know [about](help) this application?
- how to [use](help) this application?
- what is the [use](help) of this application?
- can you tell me the [use](help) of this application?
- can you let me know the [use](help) of this application?
- can you lemme know the [use](help) of this application?
- I need to know the [use](help) this application
- I want to know the [use](help) this application
- lemme know the [use](help) of this application
- let me know the [use](help) of this application
- will you let me know the [use](help) of this application?
- can you tell me the [locations](help) supported?
- can you let me know the [locations](help) supported?
- can you lemme know about the [locations](help) supported?
- tell me the [locations](help) supported
- the [locations](help) supported
- I need to know the [locations](help) supported
- I want to know the [locations](help) supported
- lemme know the [locations](help) supported
- let me know the [locations](help) supported
- will you let me know the [locations](help) supported?
- can you tell me the [functions](help) of this system?
- can you let me know the [functions](help) of this system?
- can you lemme know about [functions](help) of this system?
- tell me the [functions](help) of this system
- [functions](help) of this system
- I need to know the [functions](help) of this system
- I want to know the [functions](help) of this system
- lemme know the [functions](help) of this system
- let me know the [functions](help) of this system
- will you let me know the [functions](help) of this system?
# Regex sample training
- regex: words
examples: |
- \b((?!=|\,|\.).)+(.)\b
- regex: date
examples: |
- ^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$
# Synonyms sample training
- synonym: composition
examples: |
- Composition
- compositions
- Compositions
- synonym: effect
examples: |
- Effect
- effects
- Effects
- synonym: summary
examples: |
- Summary
- synonym: Colombo
examples: |
- colombo
- synonym: Kandy
examples: |
- kandy
- synonym: Galle
examples: |
- galle
- synonym: Malabe
examples: |
- malabe
- synonym: Nuwaraeliya
examples: |
- nuwaraeliya
- synonym: Jafna
examples: |
- jafna
- synonym: whole map
examples: |
- Whole Map
- Whole map
# Sapnaka and Shan end
\ No newline at end of file
# common start
version: "2.0"
rules:
- rule: Say goodbye anytime the user says goodbye
steps:
- intent: goodbye
- action: utter_goodbye
- rule: Say 'I am a bot' anytime the user challenges
steps:
- intent: bot_challenge
- action: utter_iamabot
# common end
\ No newline at end of file
# common start
version: "2.0"
stories:
- story: happy path
steps:
- intent: greet
- action: utter_greet
- intent: mood_great
- action: utter_happy
- story: sad path 1
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: affirm
- action: utter_happy
- story: sad path 2
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: deny
- action: utter_goodbye
# common end
# Sapnaka part start
- story: ask about chemical path 1
steps:
- intent: greet
- action: utter_greet
- intent: inform
entities:
- requirement: "composition"
- location: "Colombo"
- action: chemical_query_handler_1
- intent: mood_great
- action: utter_happy
- story: ask about chemical path 2
steps:
- intent: greet
- action: utter_greet
- intent: inform
entities:
- requirement: "composition"
- location: "Colombo"
- date: "2021-08-05"
- action: chemical_query_handler_2
- intent: mood_great
- action: utter_happy
- story: ask about chemical path 3
steps:
- intent: greet
- action: utter_greet
- intent: inform
entities:
- requirement: "composition"
- location: "Colombo"
- words: "co2"
- action: chemical_query_handler_3
- intent: mood_great
- action: utter_happy
- story: ask about chemical path 4
steps:
- intent: greet
- action: utter_greet
- intent: inform
entities:
- requirement: "composition"
- location: "Colombo"
- words: "co2"
- date: "2021-08-05"
- action: chemical_query_handler_4
- intent: mood_great
- action: utter_happy
# Sapnaka part end
# Shan part start
- story: support function path 1
steps:
- intent: greet
- action: utter_greet
- intent: inform
entities:
- help: "use"
- action: support_function_1
- intent: mood_great
- action: utter_happy
# Shan part end
\ No newline at end of file
# common start
version: "2.0"
intents:
- greet
- goodbye
- affirm
- deny
- mood_great
- mood_unhappy
- bot_challenge
- inform #Sapnaka, Shan
entities:
- requirement #Sapnaka
- location #Sapnaka
- words #Sapnaka
- date #Sapnaka
- help #Shan
actions:
- chemical_query_handler_1 #Sapnaka
- chemical_query_handler_2 #Sapnaka
- chemical_query_handler_3 #Sapnaka
- chemical_query_handler_4 #Sapnaka
- support_function_1 #Shan
responses:
utter_greet:
- text: "Hi I am the AIR-COP chatbot, how can I help you?"
utter_cheer_up:
- text: "Here is something to cheer you up:"
image: "https://i.imgur.com/nGF1K8f.jpg"
utter_did_that_help:
- text: "Did that help you?"
utter_happy:
- text: "Great, carry on!"
utter_goodbye:
- text: "Bye"
utter_iamabot:
- text: "I am a bot, powered by Rasa."
session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
# common end
\ No newline at end of file
# common start
# This file contains the different endpoints your bot can use.
# Server where the models are pulled from.
# https://rasa.com/docs/rasa/model-storage#fetching-models-from-a-server
#models:
# url: http://my-server.com/models/default_core@latest
# wait_time_between_pulls: 10 # [optional](default: 100)
# Server which runs your custom actions.
# https://rasa.com/docs/rasa/custom-actions
action_endpoint:
url: "http://localhost:5055/webhook"
# Tracker store which is used to store the conversations.
# By default the conversations are stored in memory.
# https://rasa.com/docs/rasa/tracker-stores
#tracker_store:
# type: redis
# url: <host of the redis instance, e.g. localhost>
# port: <port of your redis instance, usually 6379>
# db: <number of your database within redis, e.g. 0>
# password: <password used for authentication>
# use_ssl: <whether or not the communication is encrypted, default false>
#tracker_store:
# type: mongod
# url: <url to your mongo instance, e.g. mongodb://localhost:27017>
# db: <name of the db within your mongo instance, e.g. rasa>
# username: <username used for authentication>
# password: <password used for authentication>
# Event broker which all conversation events should be streamed to.
# https://rasa.com/docs/rasa/event-brokers
#event_broker:
# url: localhost
# username: username
# password: password
# queue: queue
# common end
\ No newline at end of file
# common start
#### This file contains tests to evaluate that your bot behaves as expected.
#### If you want to learn more, please see the docs: https://rasa.com/docs/rasa/testing-your-assistant
stories:
- story: happy path 1
steps:
- user: |
hello there!
intent: greet
- action: utter_greet
- user: |
amazing
intent: mood_great
- action: utter_happy
- story: happy path 2
steps:
- user: |
hello there!
intent: greet
- action: utter_greet
- user: |
amazing
intent: mood_great
- action: utter_happy
- user: |
bye-bye!
intent: goodbye
- action: utter_goodbye
- story: sad path 1
steps:
- user: |
hello
intent: greet
- action: utter_greet
- user: |
not good
intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- user: |
yes
intent: affirm
- action: utter_happy
- story: sad path 2
steps:
- user: |
hello
intent: greet
- action: utter_greet
- user: |
not good
intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- user: |
not really
intent: deny
- action: utter_goodbye
- story: sad path 3
steps:
- user: |
hi
intent: greet
- action: utter_greet
- user: |
very terrible
intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- user: |
no
intent: deny
- action: utter_goodbye
- story: say goodbye
steps:
- user: |
bye-bye!
intent: goodbye
- action: utter_goodbye
- story: bot challenge
steps:
- user: |
are you a bot?
intent: bot_challenge
- action: utter_iamabot
# common end
\ No newline at end of file
/*
SQLyog Community v13.1.6 (64 bit)
MySQL - 8.0.21 : Database - air_polution
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`air_polution` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `air_polution`;
/*Table structure for table `conditions` */
DROP TABLE IF EXISTS `conditions`;
CREATE TABLE `conditions` (
`id` int NOT NULL AUTO_INCREMENT,
`location` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`summary` varchar(5000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `conditions` */
insert into `conditions`(`id`,`location`,`date`,`summary`) values
(1,'Colombo','2021-09-09','Levels of the chemicals are normal'),
(2,'Malabe','2021-09-09','Levels of the chemicals are normal');
/*Table structure for table `elements` */
DROP TABLE IF EXISTS `elements`;
CREATE TABLE `elements` (
`id` int NOT NULL AUTO_INCREMENT,
`chemical` varchar(25) DEFAULT NULL,
`value` float DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`othername` varchar(255) DEFAULT NULL,
`effect` varchar(5000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `elements` */
insert into `elements`(`id`,`chemical`,`value`,`location`,`date`,`othername`,`effect`) values
(1,'NO2',25,'Colombo','2021-09-09','no2, nitrogen dioxide','it is normal'),
(2,'CO2',10,'Colombo','2021-09-09','co2, carbon Dioxide','it is normal'),
(4,'NO2',25,'Colombo','2021-09-05','co2, carbon Dioxide','it is normal'),
(5,'CO2',10,'Colombo','2021-09-05','co2, carbon Dioxide','it is normal');
/*Table structure for table `summary` */
DROP TABLE IF EXISTS `summary`;
CREATE TABLE `summary` (
`id` int NOT NULL AUTO_INCREMENT,
`result` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `summary` */
insert into `summary`(`id`,`result`,`date`) values
(1,'It is very dangerous due to very high smoke','2021-09-09');
/*Table structure for table `support` */
DROP TABLE IF EXISTS `support`;
CREATE TABLE `support` (
`id` int NOT NULL AUTO_INCREMENT,
`key` varchar(50) DEFAULT NULL,
`value` varchar(5000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `support` */
insert into `support`(`id`,`key`,`value`) values
(1,'about','This is the about description.'),
(2,'use','This is the use description.'),
(3,'location','Locations supported are Colombo, Jaffna'),
(4,'function','This is the function description.');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
# https://stackoverflow.com/questions/4867197/failed-loading-english-pickle-with-nltk-data-load
import flask
from flask import request
import requests
import string
from collections import Counter
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
import mysql.connector
from datetime import datetime
import pandas as pd
from csv import reader
import numpy as np
import math
import json
import time
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split
from sklearn.neighbors import NearestNeighbors
import scipy.sparse
from scipy.sparse import csr_matrix
import warnings; warnings.simplefilter('ignore')
#######################################################################################################################################
# begin database search
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="air_polution"
)
#######################################################################################################################################
app = flask.Flask(__name__)
app.config["DEBUG"] = True
@app.route('/', methods=['GET'])
def home():
return "HI"
@app.route('/chat')
def chat():
try:
message = str(request.args.get('message'))
user = str(request.args.get('user'))
req = {'sender':'test_user', "message": message}
res = requests.post('http://localhost:5005/webhooks/rest/webhook', json=req)
dictFromServer = res.json()
txt = dictFromServer[0]['text']
recommendation_response_text = ""
if(txt == "Bye"):
recommendation_text = recommendation_function([user])
print(recommendation_text)
x = recommendation_text.split()
print("x: " + str(x[6]))
recommendation_response_text = str(x[6])
# recommendation_text = recommendation_function([user])
# print("recommendation_text: " + str(recommendation_text))
# recommendation_response = recommendation_text.split()
# print("recommendation_response: " + str(x[6]))
# recommendation_response_text = str(x[6])
data = txt
lower_case_data = data.lower()
cleaned_text_data = lower_case_data.translate(str.maketrans('', '', string.punctuation))
# Using word_tokenize because it's faster than split()
tokenized_words_data = word_tokenize(cleaned_text_data, "english")
# Removing Stop Words
final_words_data = []
for word_data in tokenized_words_data:
if word_data not in stopwords.words('english'):
final_words_data.append(word_data)
# Lemmatization - From plural to single + Base form of a word (example better-> good)
lemma_words_data = []
for word_data in final_words_data:
word_data = WordNetLemmatizer().lemmatize(word_data)
lemma_words_data.append(word_data)
emotion_list_data = []
with open('emotions.txt', 'r') as file:
for line_data in file:
clear_line_data = line_data.replace("\n", '').replace(",", '').replace("'", '').strip()
word_data, emotion_data = clear_line_data.split(':')
if word_data in lemma_words_data:
emotion_list_data.append(emotion_data)
print(emotion_list_data)
w_data = Counter(emotion_list_data)
print(w_data)
score = SentimentIntensityAnalyzer().polarity_scores(cleaned_text_data)
# return txt
if score['neg'] > score['pos']:
print("Negative Sentiment")
if(txt == "Bye"):
return(str(txt) + "/Negative" + "/" + recommendation_response_text)
else:
return(str(txt) + "/Negative")
elif score['neg'] < score['pos']:
print("Positive Sentiment")
if(txt == "Bye"):
return(str(txt) + "/Positive" + "/" + recommendation_response_text)
else:
return(str(txt) + "/Positive")
else:
print("Neutral Sentiment")
if(txt == "Bye"):
return(str(txt) + "/Neutral" + "/" + recommendation_response_text)
else:
return(str(txt) + "/Neutral")
except:
return "Sorry, can you repeat it?/Neutral"
@app.route('/sentiment')
def sentiment():
try:
data = str(request.args.get('data'))
lower_case_data = data.lower()
cleaned_text_data = lower_case_data.translate(str.maketrans('', '', string.punctuation))
# Using word_tokenize because it's faster than split()
tokenized_words_data = word_tokenize(cleaned_text_data, "english")
# Removing Stop Words
final_words_data = []
for word_data in tokenized_words_data:
if word_data not in stopwords.words('english'):
final_words_data.append(word_data)
# Lemmatization - From plural to single + Base form of a word (example better-> good)
lemma_words_data = []
for word_data in final_words_data:
word_data = WordNetLemmatizer().lemmatize(word_data)
lemma_words_data.append(word_data)
emotion_list_data = []
with open('emotions.txt', 'r') as file:
for line_data in file:
clear_line_data = line_data.replace("\n", '').replace(",", '').replace("'", '').strip()
word_data, emotion_data = clear_line_data.split(':')
if word_data in lemma_words_data:
emotion_list_data.append(emotion_data)
print(emotion_list_data)
w_data = Counter(emotion_list_data)
print(w_data)
score = SentimentIntensityAnalyzer().polarity_scores(cleaned_text_data)
if score['neg'] > score['pos']:
print("Negative Sentiment")
return("Negative")
elif score['neg'] < score['pos']:
print("Positive Sentiment")
return("Positive")
else:
print("Neutral Sentiment")
return("Neutral")
except Exception as e:
print(str(e))
print("Fail")
return("Fail")
@app.route('/chemical')
def chemical():
try:
location = str(request.args.get('location'))
date = str(datetime.today().strftime('%Y-%m-%d'))
sql = "SELECT `chemical`, `value`, `effect` FROM elements WHERE `location` = '"+location+"' AND DATE = '"+date+"'"
mycursor = mydb.cursor()
mycursor.execute(sql)
myresult = mycursor.fetchall()
date = str(datetime.today().strftime('%Y-%m-%d'))
if myresult:
print("result is not empty")
print("myresult:" + str(myresult))
# Section composition
text = "|| "
for myresultObj in myresult:
text = text + myresultObj[0] + "'s level equals to " + str(myresultObj[1]) + " and " + str(myresultObj[2]) + " || "
return(text)
except:
print("Fail")
return("Fail")
@app.route('/createExcel')
def createExcel():
startDate = str(request.args.get('startDate'))
endDate = str(request.args.get('endDate'))
sql1 = "SELECT count(*) FROM `elements` WHERE DATE BETWEEN '"+startDate+"' AND '"+endDate+"'"
mycursor = mydb.cursor()
mycursor.execute(sql1)
myresult1 = mycursor.fetchall()
sql = "SELECT `chemical`, `value`, `location`, `date` FROM `elements` WHERE DATE BETWEEN '"+startDate+"' AND '"+endDate+"'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
data=[None] * myresult1[0][0]
print("myresult1: " + str(myresult1))
print("myresult: " + str(myresult))
i = 0
for myresultObj in myresult:
print("index: " + str(i))
text = str(myresultObj[0]) + "," +str(myresultObj[1]) + "," + str(myresultObj[2]) + "," + str(myresultObj[3])
print("text: " + text)
data[i] = text
i = i + 1
df=pd.DataFrame(list(reader(data)))
print(df)
df.to_csv("df.csv")
return("Excel created!!!")
def recommendation_function(user_array):
#Import the data set
df = pd.read_csv('dataset_sapnaka.csv')
print(df.head())
# Dropping the columns
df = df.drop(['id', 'date'], axis = 1)
print("\n")
print(df.head())
# Check the number of rows and columns
rows, columns = df.shape
print("\n")
print("No of rows: ", rows)
print("No of columns: ", columns)
#Check Data types
print("\n")
print(df.dtypes)
# Check for missing values present
print("\n")
print('Number of missing values across columns-\n', df.isnull().sum())
# Combine location and chemical to get a key feature
df["location_chemical"] = df["location"] + "/" + df["chemical"]
print("\n")
print(df.head())
# Summary statistics of 'rating' variable
print("\n")
print(df[['score']].describe().transpose())
# find minimum and maximum ratings
def find_min_max_rating():
print("\n")
print('The minimum rating is: %d' %(df['score'].min()))
print('The maximum rating is: %d' %(df['score'].max()))
find_min_max_rating()
# Number of unique location_chemical in the data
print("\n")
print('Number of unique location_chemical in Raw data = ', df['location_chemical'].nunique())
# Top 3 users based on rating
most_rated = df.groupby('user_id').size().sort_values(ascending=False)[:3]
print("\n")
print(most_rated)
counts = df['user_id'].value_counts()
df_final = df[df['user_id'].isin(counts[counts >= 12].index)]
print("\n")
print(df_final.head())
print("\n")
print('Number of users who have rated 12 or more items =', len(df_final))
print('Number of unique USERS in final data = ', df_final['user_id'].nunique())
print('Number of unique ITEMS in final data = ', df_final['location_chemical'].nunique())
print("\n")
final_ratings_matrix = pd.pivot_table(df_final,index=['user_id'], columns = 'location_chemical', values = "score")
final_ratings_matrix.fillna(0,inplace=True)
print('Shape of final_ratings_matrix: ', final_ratings_matrix.shape)
given_num_of_ratings = np.count_nonzero(final_ratings_matrix)
print('given_num_of_ratings = ', given_num_of_ratings)
possible_num_of_ratings = final_ratings_matrix.shape[0] * final_ratings_matrix.shape[1]
print('possible_num_of_ratings = ', possible_num_of_ratings)
density = (given_num_of_ratings/possible_num_of_ratings)
density *= 100
print ('density: {:4.2f}%'.format(density))
print("\n")
print(final_ratings_matrix.tail())
# Matrix with one row per 'location_chemical' and one column per 'user_id' for location_chemical-based CF
final_ratings_matrix_T = final_ratings_matrix.transpose()
print("\n")
print(final_ratings_matrix_T.head())
#Split the training and test data in the ratio 70:30
train_data, test_data = train_test_split(df_final, test_size = 0.3, random_state=0)
print("\n")
# changed
print(train_data.head(1))
def shape():
print("\n")
print("Test data shape: ", test_data.shape)
print("Train data shape: ", train_data.shape)
shape()
#Count of user_id for each unique product as recommendation score
print("\n")
train_data_grouped = train_data.groupby('location_chemical').agg({'user_id': 'count'}).reset_index()
train_data_grouped.rename(columns = {'user_id': 'score'},inplace=True)
print(train_data_grouped.head())
#Sort the products on recommendation score
train_data_sort = train_data_grouped.sort_values(['score', 'location_chemical'], ascending = [0,1])
#Generate a recommendation rank based upon score
train_data_sort['Rank'] = train_data_sort['score'].rank(ascending=0, method='first')
#Get the top 1 recommendations
# changed
popularity_recommendations = train_data_sort.head(1)
print("\n")
print(popularity_recommendations)
# #################################################################################
# #################################################################################
# #################################################################################
# Model
# #################################################################################
# #################################################################################
# #################################################################################
print("\n")
def recommend(user_id):
user_recommendations = popularity_recommendations
#Add user_id column for which the recommendations are being generated
user_recommendations['user_id'] = user_id
#Bring user_id column to the front
cols = user_recommendations.columns.tolist()
cols = cols[-1:] + cols[:-1]
user_recommendations = user_recommendations[cols]
return user_recommendations
find_recom = user_array # This list is user choice.
data = ""
for i in find_recom:
print("Here is the recommendation for the userId: %s\n" %(i))
print(recommend(i))
print("\n")
data = data + str(recommend(i))
return(data)
app.run(port=3030)
id,location,chemical,date,score,user_id
1,Colombo,NO2,11/9/2021 13:17,5,Sapnaka
2,Colombo,CO2,11/10/2021 13:18,1,Vihara
3,Colombo,SO2,11/11/2021 13:19,2,Shan
4,Jafna,NO2,11/12/2021 13:20,2,Randy
5,Jafna,CO2,11/13/2021 13:21,5,Mohan
6,Jafna,SO2,11/14/2021 13:22,3,Vihara
7,Galle,NO2,11/15/2021 13:23,1,Sapnaka
8,Galle,CO2,11/16/2021 13:24,4,Shan
9,Galle,SO2,11/17/2021 13:25,5,Vihara
10,Malabe,NO2,11/18/2021 13:26,2,Mohan
11,Malabe,CO2,11/19/2021 13:27,4,Sapnaka
12,Malabe,SO2,11/20/2021 13:28,2,Shan
13,Kandy,NO2,11/21/2021 13:29,1,Sapnaka
14,Kandy,CO2,11/22/2021 13:30,5,Mohan
15,Kandy,SO2,11/23/2021 13:31,4,Randy
16,Nuwareliya,NO2,11/24/2021 13:32,1,Shan
17,Nuwareliya,CO2,11/25/2021 13:33,4,Randy
18,Nuwareliya,SO2,11/26/2021 13:34,3,Vihara
19,Nuwareliya,NO2,11/9/2021 13:17,5,Lakmal
20,Colombo,CO2,11/10/2021 13:18,1,Sachin
21,Colombo,SO2,11/11/2021 13:19,2,Vishal
22,Jafna,NO2,11/12/2021 13:20,2,Lakmal
23,Jafna,SO2,11/13/2021 13:21,5,Lakmal
24,Jafna,NO2,11/14/2021 13:22,3,Lakmal
25,Jafna,CO2,11/15/2021 13:23,1,Lakmal
26,Malabe,SO2,11/16/2021 13:24,4,Lakmal
27,Malabe,NO2,11/17/2021 13:25,5,Sachin
28,Malabe,CO2,11/18/2021 13:26,2,Sachin
29,Colombo,SO2,11/19/2021 13:27,4,Sachin
30,Colombo,NO2,11/20/2021 13:28,2,Sachin
31,Colombo,CO2,11/21/2021 13:29,1,Sachin
32,Kandy,SO2,11/22/2021 13:30,5,Vishal
33,Kandy,NO2,11/23/2021 13:31,4,Vishal
34,Kandy,CO2,11/24/2021 13:32,1,Vishal
35,Galle,SO2,11/25/2021 13:33,4,Vishal
36,Malabe,NO2,11/26/2021 13:34,3,Vishal
37,Malabe,CO2,11/9/2021 13:17,5,Kamal
38,Malabe,SO2,11/10/2021 13:18,1,Kamal
39,Colombo,NO2,11/11/2021 13:19,2,Kamal
40,Colombo,SO2,11/12/2021 13:20,2,Kamal
41,Nuwareliya,NO2,11/13/2021 13:21,5,Kamal
42,Nuwareliya,CO2,11/14/2021 13:22,3,Veni
43,Nuwareliya,SO2,11/15/2021 13:23,1,Veni
44,Kandy,NO2,11/16/2021 13:24,4,Veni
45,Kandy,SO2,11/17/2021 13:25,5,Veni
46,Jafna,NO2,11/18/2021 13:26,2,Veni
47,Jafna,CO2,11/19/2021 13:27,4,John
48,Jafna,SO2,11/20/2021 13:28,2,John
49,Malabe,NO2,11/21/2021 13:29,1,John
50,Malabe,CO2,11/22/2021 13:30,5,John
51,Malabe,SO2,11/23/2021 13:31,4,John
52,Colombo,NO2,11/24/2021 13:32,1,Hanar
53,Colombo,NO2,11/25/2021 13:33,4,Hanar
54,Colombo,CO2,11/26/2021 13:34,3,Hanar
55,Kandy,SO2,11/9/2021 13:17,5,Hanar
56,Kandy,NO2,11/10/2021 13:18,1,Hanar
57,Kandy,CO2,11/11/2021 13:19,2,Renu
58,Malabe,SO2,11/12/2021 13:20,2,Renu
59,Malabe,NO2,11/13/2021 13:21,5,Renu
60,Malabe,CO2,11/14/2021 13:22,3,Renu
61,Jafna,SO2,11/15/2021 13:23,1,Kusum
62,Jafna,NO2,11/16/2021 13:24,4,Kusum
63,Jafna,CO2,11/17/2021 13:25,5,Kusum
64,Nuwareliya,SO2,11/18/2021 13:26,2,Kusum
65,Nuwareliya,SO2,11/19/2021 13:27,4,Kusum
66,Nuwareliya,NO2,11/20/2021 13:28,2,Pasan
67,Galle,CO2,11/21/2021 13:29,1,Pasan
68,Galle,SO2,11/22/2021 13:30,5,Pasan
69,Colombo,NO2,11/23/2021 13:31,4,Pasan
70,Colombo,SO2,11/24/2021 13:32,1,Pasan
71,Nuwareliya,NO2,11/25/2021 13:33,4,Malaka
72,Nuwareliya,CO2,11/26/2021 13:34,3,Malaka
73,Nuwareliya,SO2,11/9/2021 13:17,5,Malaka
74,Malabe,NO2,11/10/2021 13:18,1,Malaka
75,Malabe,CO2,11/11/2021 13:19,2,Malaka
76,Malabe,SO2,11/12/2021 13:20,2,Luwini
77,Jafna,NO2,11/13/2021 13:21,5,Luwini
78,Jafna,NO2,11/14/2021 13:22,3,Luwini
79,Jafna,CO2,11/15/2021 13:23,1,Luwini
80,Nuwareliya,SO2,11/16/2021 13:24,4,Luwini
81,Nuwareliya,NO2,11/17/2021 13:25,5,Luwini
82,Nuwareliya,CO2,11/18/2021 13:26,2,Gajen
83,Colombo,SO2,11/19/2021 13:27,4,Gajen
84,Colombo,NO2,11/20/2021 13:28,2,Gajen
85,Colombo,CO2,11/21/2021 13:29,1,Gajen
86,Galle,SO2,11/22/2021 13:30,5,Gajen
87,Galle,NO2,11/23/2021 13:31,4,Gajen
88,Galle,CO2,11/24/2021 13:32,1,Keerthana
89,Jafna,SO2,11/25/2021 13:33,4,Keerthana
90,Jafna,NO2,11/26/2021 13:34,3,Keerthana
91,Jafna,SO2,11/9/2021 13:17,5,Keerthana
92,Kandy,NO2,11/10/2021 13:18,1,Keerthana
93,Kandy,CO2,11/11/2021 13:19,2,Warshini
94,Kandy,SO2,11/12/2021 13:20,2,Warshini
95,Colombo,NO2,11/13/2021 13:21,5,Warshini
96,Colombo,CO2,11/14/2021 13:22,3,Warshini
97,Nuwareliya,SO2,11/15/2021 13:23,1,Warshini
98,Nuwareliya,NO2,11/16/2021 13:24,4,Malasha
99,Nuwareliya,SO2,11/17/2021 13:25,5,Malasha
100,Galle,NO2,11/18/2021 13:26,2,Malasha
101,Galle,CO2,11/19/2021 13:27,4,Malasha
102,Nuwareliya,SO2,11/20/2021 13:28,2,Malasha
103,Nuwareliya,NO2,11/21/2021 13:29,1,Sarath
104,Nuwareliya,SO2,11/22/2021 13:30,5,Sarath
105,Colombo,NO2,11/23/2021 13:31,4,Sarath
106,Colombo,CO2,11/24/2021 13:32,1,Sarath
107,Colombo,SO2,11/25/2021 13:33,4,Sarath
108,Colombo,NO2,11/26/2021 13:34,3,Sarath
109,Nuwareliya,CO2,11/9/2021 13:17,5,Kishan
110,Nuwareliya,SO2,11/10/2021 13:18,1,Kishan
111,Nuwareliya,NO2,11/11/2021 13:19,2,Kishan
112,Galle,CO2,11/12/2021 13:20,2,Kishan
113,Galle,NO2,11/13/2021 13:21,5,Kishan
114,Galle,CO2,11/14/2021 13:22,3,Kishan
115,Jafna,SO2,11/15/2021 13:23,1,Himasha
116,Jafna,NO2,11/16/2021 13:24,4,Himasha
117,Jafna,CO2,11/17/2021 13:25,5,Himasha
118,Jafna,SO2,11/18/2021 13:26,2,Himasha
119,Colombo,NO2,11/19/2021 13:27,4,Himasha
120,Colombo,CO2,11/20/2021 13:28,2,Himasha
121,Colombo,SO2,11/21/2021 13:29,1,Viraj
122,Nuwareliya,NO2,11/22/2021 13:30,5,Viraj
123,Nuwareliya,CO2,11/23/2021 13:31,4,Viraj
124,Nuwareliya,SO2,11/24/2021 13:32,1,Viraj
125,Nuwareliya,NO2,11/25/2021 13:33,4,Viraj
126,Galle,CO2,11/26/2021 13:34,3,Viraj
127,Galle,NO2,11/9/2021 13:17,5,Susila
128,Nuwareliya,CO2,11/10/2021 13:18,1,Susila
129,Nuwareliya,SO2,11/11/2021 13:19,2,Susila
130,Nuwareliya,NO2,11/12/2021 13:20,2,Susila
131,Nuwareliya,CO2,11/13/2021 13:21,5,Susila
132,Malabe,SO2,11/14/2021 13:22,3,Susila
133,Malabe,NO2,11/15/2021 13:23,1,Dilrukshi
134,Malabe,CO2,11/16/2021 13:24,4,Dilrukshi
135,Colombo,SO2,11/17/2021 13:25,5,Dilrukshi
136,Colombo,CO2,11/18/2021 13:26,2,Dilrukshi
137,Kandy,SO2,11/19/2021 13:27,4,Dilrukshi
138,Kandy,NO2,11/20/2021 13:28,2,Dilrukshi
139,Kandy,CO2,11/21/2021 13:29,1,Segar
140,Nuwareliya,SO2,11/22/2021 13:30,5,Segar
141,Nuwareliya,NO2,11/23/2021 13:31,4,Segar
142,Nuwareliya,CO2,11/24/2021 13:32,1,Segar
143,Nuwareliya,SO2,11/25/2021 13:33,4,Segar
144,Galle,NO2,11/26/2021 13:34,3,Segar
145,Galle,CO2,11/9/2021 13:17,5,Jothi
146,Galle,SO2,11/10/2021 13:18,1,Jothi
147,Galle,SO3,11/11/2021 13:19,2,Jothi
148,Galle,SO4,11/12/2021 13:20,2,Jothi
149,Colombo,NO2,11/13/2021 13:21,5,Jothi
150,Colombo,CO2,11/14/2021 13:22,3,Jothi
151,Colombo,SO2,11/15/2021 13:23,1,Pidshi
152,Nuwareliya,NO2,11/16/2021 13:24,4,Pidshi
153,Nuwareliya,CO2,11/17/2021 13:25,5,Pidshi
154,Nuwareliya,SO2,11/18/2021 13:26,2,Pidshi
155,Nuwareliya,NO2,11/19/2021 13:27,4,Pidshi
156,Malabe,CO2,11/20/2021 13:28,2,Pidshi
157,Malabe,SO2,11/21/2021 13:29,1,Anuthara
158,Malabe,NO2,11/22/2021 13:30,5,Anuthara
159,Galle,CO2,11/23/2021 13:31,4,Anuthara
160,Galle,SO2,11/24/2021 13:32,1,Anuthara
161,Galle,NO2,11/25/2021 13:33,4,Anuthara
162,Nuwareliya,CO2,11/26/2021 13:34,3,Anuthara
163,Nuwareliya,SO2,11/9/2021 13:17,5,Chamika
164,Nuwareliya,SO2,11/10/2021 13:18,1,Chamika
165,Jafna,NO2,11/11/2021 13:19,2,Chamika
166,Jafna,CO2,11/12/2021 13:20,2,Chamika
167,Jafna,SO2,11/13/2021 13:21,5,Chamika
168,Kandy,NO2,11/14/2021 13:22,3,Chamika
169,Kandy,CO2,11/15/2021 13:23,1,Lakmal
170,Kandy,SO2,11/16/2021 13:24,4,Lakmal
171,Colombo,NO2,11/17/2021 13:25,5,Lakmal
172,Colombo,CO2,11/18/2021 13:26,2,Lakmal
173,Colombo,SO2,11/19/2021 13:27,4,Lakmal
174,Nuwareliya,NO2,11/20/2021 13:28,2,Sachin
175,Nuwareliya,NO2,11/21/2021 13:29,1,Sachin
176,Nuwareliya,CO2,11/22/2021 13:30,5,Sachin
177,Galle,SO2,11/23/2021 13:31,4,Sachin
178,Galle,NO2,11/24/2021 13:32,1,Sachin
179,Galle,CO2,11/25/2021 13:33,4,Vishal
180,Galle,SO2,11/26/2021 13:34,3,Vishal
181,Galle,NO2,11/9/2021 13:17,5,Vishal
182,Nuwareliya,CO2,11/10/2021 13:18,1,Vishal
183,Nuwareliya,SO2,11/11/2021 13:19,2,Vishal
184,Nuwareliya,NO2,11/12/2021 13:20,2,Kamal
185,Colombo,CO2,11/13/2021 13:21,5,Kamal
186,Colombo,SO2,11/14/2021 13:22,3,Kamal
187,Colombo,NO2,11/15/2021 13:23,1,Kamal
188,Nuwareliya,CO2,11/16/2021 13:24,4,Kamal
189,Nuwareliya,SO2,11/17/2021 13:25,5,Veni
190,Nuwareliya,NO2,11/18/2021 13:26,2,Veni
191,Malabe,CO2,11/19/2021 13:27,4,Veni
192,Malabe,SO2,11/20/2021 13:28,2,Veni
193,Malabe,NO2,11/21/2021 13:29,1,Veni
194,Malabe,SO2,11/22/2021 13:30,5,John
195,Malabe,NO2,11/23/2021 13:31,4,John
196,Jafna,CO2,11/24/2021 13:32,1,John
197,Jafna,SO2,11/25/2021 13:33,4,John
198,Jafna,NO2,11/26/2021 13:34,3,John
199,Jafna,CO2,11/9/2021 13:17,5,Hanar
200,Jafna,SO2,11/10/2021 13:18,1,Hanar
201,Malabe,NO2,11/11/2021 13:19,2,Hanar
202,Malabe,CO2,11/12/2021 13:20,2,Hanar
203,Malabe,SO2,11/13/2021 13:21,5,Hanar
204,Nuwareliya,NO2,11/14/2021 13:22,3,Renu
205,Nuwareliya,CO2,11/15/2021 13:23,1,Renu
206,Nuwareliya,SO2,11/16/2021 13:24,4,Renu
207,Malabe,NO2,11/17/2021 13:25,5,Renu
208,Malabe,CO2,11/18/2021 13:26,2,Kusum
209,Malabe,SO2,11/19/2021 13:27,4,Kusum
210,Nuwareliya,NO2,11/20/2021 13:28,2,Kusum
211,Nuwareliya,CO2,11/21/2021 13:29,1,Kusum
212,Nuwareliya,SO2,11/22/2021 13:30,5,Kusum
213,Nuwareliya,NO2,11/23/2021 13:31,4,Pasan
214,Nuwareliya,CO2,11/24/2021 13:32,1,Pasan
215,Colombo,SO2,11/25/2021 13:33,4,Pasan
216,Colombo,NO2,11/26/2021 13:34,3,Pasan
217,Colombo,CO2,11/9/2021 13:17,5,Pasan
218,Colombo,SO2,11/10/2021 13:18,1,Malaka
219,Nuwareliya,NO2,11/11/2021 13:19,2,Malaka
220,Nuwareliya,CO2,11/12/2021 13:20,2,Malaka
221,Nuwareliya,SO2,11/13/2021 13:21,5,Malaka
222,Nuwareliya,NO2,11/14/2021 13:22,3,Malaka
223,Nuwareliya,CO2,11/15/2021 13:23,1,Luwini
224,Jafna,SO2,11/16/2021 13:24,4,Luwini
225,Jafna,NO2,11/17/2021 13:25,5,Luwini
226,Jafna,CO2,11/18/2021 13:26,2,Luwini
227,Jafna,SO2,11/19/2021 13:27,4,Luwini
228,Malabe,NO2,11/20/2021 13:28,2,Luwini
229,Malabe,CO2,11/21/2021 13:29,1,Gajen
230,Malabe,SO2,11/22/2021 13:30,5,Gajen
231,Galle,CO2,11/23/2021 13:31,4,Gajen
232,Galle,NO2,11/24/2021 13:32,1,Gajen
233,Galle,CO2,11/25/2021 13:33,4,Gajen
234,Nuwareliya,SO2,11/26/2021 13:34,3,Gajen
235,Nuwareliya,NO2,11/9/2021 13:17,5,Keerthana
236,Nuwareliya,CO2,11/10/2021 13:18,1,Keerthana
237,Kandy,SO2,11/11/2021 13:19,2,Keerthana
238,Kandy,NO2,11/12/2021 13:20,2,Keerthana
239,Kandy,CO2,11/13/2021 13:21,5,Keerthana
240,Galle,SO2,11/14/2021 13:22,3,Warshini
241,Galle,NO2,11/15/2021 13:23,1,Warshini
242,Galle,CO2,11/16/2021 13:24,4,Warshini
243,Nuwareliya,SO2,11/17/2021 13:25,5,Warshini
244,Nuwareliya,NO2,11/18/2021 13:26,2,Warshini
245,Nuwareliya,CO2,11/19/2021 13:27,4,Malasha
246,Colombo,SO2,11/20/2021 13:28,2,Malasha
247,Colombo,NO2,11/21/2021 13:29,1,Malasha
248,Kandy,CO2,11/22/2021 13:30,5,Malasha
249,Kandy,SO2,11/23/2021 13:31,4,Malasha
250,Kandy,NO2,11/24/2021 13:32,1,Sarath
251,Jafna,CO2,11/25/2021 13:33,4,Sarath
252,Jafna,SO2,11/26/2021 13:34,3,Sarath
253,Jafna,NO2,11/9/2021 13:17,5,Sarath
254,Jafna,CO2,11/10/2021 13:18,1,Sarath
255,Jafna,SO2,11/11/2021 13:19,2,Sarath
256,Jafna,NO2,11/12/2021 13:20,2,Kishan
257,Jafna,CO2,11/13/2021 13:21,5,Kishan
258,Galle,SO2,11/14/2021 13:22,3,Kishan
259,Galle,NO2,11/15/2021 13:23,1,Kishan
260,Galle,CO2,11/16/2021 13:24,4,Kishan
261,Colombo,SO2,11/17/2021 13:25,5,Kishan
262,Colombo,CO2,11/18/2021 13:26,2,Himasha
263,Colombo,SO2,11/19/2021 13:27,4,Himasha
264,Colombo,NO2,11/20/2021 13:28,2,Himasha
265,Nuwareliya,CO2,11/21/2021 13:29,1,Himasha
266,Nuwareliya,SO2,11/22/2021 13:30,5,Himasha
267,Nuwareliya,NO2,11/23/2021 13:31,4,Himasha
268,Malabe,CO2,11/24/2021 13:32,1,Viraj
269,Malabe,SO2,11/25/2021 13:33,4,Viraj
270,Malabe,NO2,11/26/2021 13:34,3,Viraj
271,Kandy,NO2,11/9/2021 13:17,5,Viraj
272,Kandy,CO2,11/10/2021 13:18,1,Viraj
273,Kandy,SO2,11/11/2021 13:19,2,Viraj
274,Nuwareliya,NO2,11/12/2021 13:20,2,Susila
275,Nuwareliya,CO2,11/13/2021 13:21,5,Susila
276,Nuwareliya,SO2,11/14/2021 13:22,3,Susila
277,Jafna,NO2,11/15/2021 13:23,1,Susila
278,Jafna,CO2,11/16/2021 13:24,4,Susila
279,Jafna,SO2,11/17/2021 13:25,5,Susila
280,Kandy,NO2,11/18/2021 13:26,2,Dilrukshi
281,Kandy,CO2,11/19/2021 13:27,4,Dilrukshi
282,Kandy,SO2,11/20/2021 13:28,2,Dilrukshi
283,Kandy,NO2,11/21/2021 13:29,1,Dilrukshi
284,Galle,CO2,11/22/2021 13:30,5,Dilrukshi
285,Galle,SO2,11/23/2021 13:31,4,Dilrukshi
286,Galle,NO2,11/24/2021 13:32,1,Segar
287,Colombo,CO2,11/25/2021 13:33,4,Segar
288,Colombo,SO2,11/26/2021 13:34,3,Segar
289,Colombo,CO2,11/9/2021 13:17,5,Segar
290,Kandy,SO2,11/10/2021 13:18,1,Segar
291,Kandy,NO2,11/11/2021 13:19,2,Segar
292,Kandy,CO2,11/12/2021 13:20,2,Jothi
293,Jafna,SO2,11/13/2021 13:21,5,Jothi
294,Jafna,NO2,11/14/2021 13:22,3,Jothi
295,Malabe,CO2,11/15/2021 13:23,1,Jothi
296,Malabe,SO2,11/16/2021 13:24,4,Jothi
297,Malabe,NO2,11/17/2021 13:25,5,Jothi
298,Colombo,CO2,11/18/2021 13:26,2,Pidshi
299,Colombo,SO2,11/26/2021 13:34,4,Pidshi
\ No newline at end of file
,0,1,2,3
0,NO2,25.0,Colombo,2021-10-13
1,CO2,10.0,Colombo,2021-10-13
2,NO2,25.0,Colombo,2021-10-13
3,CO2,10.0,Colombo,2021-10-13
'victimized': 'cheated',
'accused': 'cheated',
'acquitted': 'singled out',
'adorable': 'loved',
'adored': 'loved',
'affected': 'attracted',
'afflicted': 'sad',
'aghast': 'fearful',
'agog': 'attracted',
'agonized': 'sad',
'alarmed': 'fearful',
'amused': 'happy',
'angry': 'angry',
'anguished': 'sad',
'animated': 'happy',
'annoyed': 'angry',
'anxious': 'attracted',
'apathetic': 'bored',
'appalled': 'angry',
'appeased': 'singled out',
'appreciated': 'esteemed',
'apprehensive': 'fearful',
'approved of': 'loved',
'ardent': 'lustful',
'aroused': 'lustful',
'attached': 'attached',
'attracted': 'attracted',
'autonomous': 'independent',
'awed': 'fearful',
'awkward': 'embarrassed',
'beaten down': 'powerless',
'beatific': 'happy',
'belonging': 'attached',
'bereaved': 'sad',
'betrayed': 'cheated',
'bewildered': 'surprise',
'bitter': 'angry',
'blissful': 'happy',
'blithe': 'happy',
'blocked': 'powerless',
'blue': 'sad',
'boiling': 'angry',
'bold': 'fearless',
'bored': 'bored',
'brave': 'fearless',
'bright': 'happy',
'brisk': 'happy',
'calm': 'safe',
'capable': 'adequate',
'captivated': 'attached',
'careless': 'powerless',
'categorized': 'singled out',
'cautious': 'fearful',
'certain': 'fearless',
'chagrined': 'belittled',
'challenged': 'attracted',
'chastised': 'hated',
'cheated': 'cheated',
'cheerful': 'happy',
'cheerless': 'sad',
'cheery': 'happy',
'cherished': 'attached',
'chicken': 'fearful',
'cocky': 'independent',
'codependent': 'codependent',
'coerced': 'cheated',
'comfortable': 'happy',
'common': 'average',
'competent': 'adequate',
'complacent': 'apathetic',
'composed': 'adequate',
'concerned': 'attracted',
'confident': 'adequate',
'confused': 'surprise',
'connected': 'attached',
'conned': 'cheated',
'consumed': 'obsessed',
'contented': 'happy',
'controlled': 'powerless',
'convivial': 'happy',
'cornered': 'entitled',
'courageous': 'fearless',
'cowardly': 'fearful',
'craving': 'attracted',
'crestfallen': 'sad',
'criticized': 'hated',
'cross': 'angry',
'cross-examined': 'singled out',
'crushed': 'sad',
'curious': 'attracted',
'cut off': 'alone',
'daring': 'fearless',
'dark': 'sad',
'dedicated': 'attracted',
'defeated': 'powerless',
'defenseless': 'fearful',
'degraded': 'belittled',
'dejected': 'sad',
'depressed': 'sad',
'deserted': 'hated',
'desirable': 'loved',
'despondent': 'sad',
'detached': 'alone',
'determined': 'focused',
'diminished': 'belittled',
'disappointed': 'demoralized',
'discarded': 'hated',
'disconsolate': 'sad',
'discontented': 'sad',
'discounted': 'belittled',
'discouraged': 'powerless',
'disgraced': 'belittled',
'disgusted': 'angry',
'disheartened': 'demoralized',
'disillusioned': 'demoralized',
'disjointed': 'derailed',
'dismal': 'sad',
'dismayed': 'fearful',
'disoriented': 'derailed',
'disparaged': 'cheated',
'displeased': 'sad',
'disrespected': 'belittled',
'distressed': 'sad',
'distrustful': 'anxious',
'dolorous': 'sad',
'doubtful': 'fearful',
'down': 'sad',
'downhearted': 'sad',
'dreadful': 'sad',
'dreary': 'sad',
'dubious': 'anxious',
'dull': 'sad',
'duped': 'cheated',
'eager': 'attracted',
'earnest': 'attracted',
'ecstatic': 'happy',
'elated': 'happy',
'embarrassed': 'embarrassed',
'empathetic': 'attached',
'enchanted': 'attracted',
'encouraged': 'adequate',
'engrossed': 'attracted',
'enraged': 'angry',
'enterprising': 'fearless',
'enthusiastic': 'happy',
'entrusted': 'loved',
'esteemed': 'esteemed',
'excited': 'happy',
'excluded': 'alone',
'exempt': 'entitled',
'exhausted hopeless': 'powerless',
'exhilarated': 'happy',
'exploited': 'cheated',
'exposed': 'fearful',
'fabulous': 'ecstatic',
'fainthearted': 'fearful',
'fantastic': 'ecstatic',
'fascinated': 'attracted',
'favored': 'entitled',
'fearful': 'fearful',
'fervent': 'attracted',
'fervid': 'attracted',
'festive': 'happy',
'flat': 'sad',
'focused': 'focused',
'forced': 'powerless',
'forsaken': 'hated',
'framed': 'cheated',
'free': 'free',
'free & easy': 'happy',
'frightened': 'fearful',
'frisky': 'happy',
'frustrated': 'angry',
'full of anticipation': 'attracted',
'full of ennui': 'apathetic',
'fuming': 'angry',
'funereal': 'sad',
'furious': 'angry',
'gallant': 'fearless',
'genial': 'happy',
'glad': 'happy',
'gleeful': 'happy',
'gloomy': 'sad',
'glum': 'sad',
'grief-stricken': 'sad',
'grieved': 'sad',
'guilt': 'sad',
'guilty': 'singled out',
'happy': 'happy',
'hardy': 'fearless',
'heartbroken': 'sad',
'heavyhearted': 'sad',
'hesitant': 'fearful',
'high-spirited': 'happy',
'hilarious': 'happy',
'hopeful': 'attracted',
'horny': 'lustful',
'horrified': 'fearful',
'hot and bothered': 'lustful',
'humiliated': 'sad',
'humorous': 'happy',
'hurt': 'sad',
'hysterical': 'fearful',
'ignored': 'hated',
'ill at ease': 'sad',
'immobilized': 'apathetic',
'immune': 'entitled',
'important': 'happy',
'impotent': 'powerless',
'imprisoned': 'entitled',
'in a huff': 'angry',
'in a stew': 'angry',
'in control': 'adequate',
'in fear': 'fearful',
'in pain': 'sad',
'in the dumps': 'sad',
'in the zone': 'focused',
'incensed': 'angry',
'included': 'attached',
'indecisive': 'anxious',
'independent': 'free',
'indignant': 'angry',
'infatuated': 'lustful',
'inflamed': 'angry',
'injured': 'sad',
'inquisitive': 'attracted',
'insecure': 'codependent',
'insignificant': 'belittled',
'intent': 'attracted',
'interested': 'attracted',
'interrogated': 'singled out',
'intrigued': 'attracted',
'irate': 'angry',
'irresolute': 'fearful',
'irresponsible': 'powerless',
'irritated': 'angry',
'isolated': 'alone',
'jaunty': 'happy',
'jocular': 'happy',
'jolly': 'happy',
'jovial': 'happy',
'joyful': 'happy',
'joyless': 'sad',
'joyous': 'happy',
'jubilant': 'happy',
'justified': 'singled out',
'keen': 'attracted',
'labeled': 'singled out',
'lackadaisical': 'bored',
'lazy': 'apathetic',
'left out': 'hated',
'let down': 'hated',
'lethargic': 'apathetic',
'lied to': 'cheated',
'lighthearted': 'happy',
'liked': 'attached',
'lively': 'happy',
'livid': 'angry',
'lonely': 'alone',
'lonesome': 'alone',
'lost': 'lost',
'loved': 'attached',
'low': 'sad',
'lucky': 'happy',
'lugubrious': 'sad',
'macho': 'independent',
'mad': 'angry',
'melancholy': 'sad',
'menaced': 'fearful',
'merry': 'happy',
'mirthful': 'happy',
'misgiving': 'fearful',
'misunderstood': 'alone',
'moody': 'sad',
'moping': 'sad',
'motivated': 'attracted',
'mournful': 'sad',
'needed': 'attracted',
'needy': 'codependent',
'nervous': 'fearful',
'obligated': 'powerless',
'obsessed': 'obsessed',
'offended': 'angry',
'oppressed': 'sad',
'optionless': 'entitled',
'ordinary': 'average',
'organized': 'adequate',
'out of control': 'powerless',
'out of sorts': 'sad',
'outmaneuvered': 'entitled',
'outraged': 'angry',
'overjoyed': 'happy',
'overlooked': 'hated',
'overwhelmed': 'powerless',
'panicked': 'fearful',
'passionate': 'lustful',
'passive': 'apathetic',
'pathetic': 'sad',
'peaceful': 'safe',
'pensive': 'anxious',
'perplexed': 'anxious',
'phobic': 'fearful',
'playful': 'happy',
'pleased': 'happy',
'powerless': 'powerless',
'pressured': 'burdened',
'privileged': 'entitled',
'proud': 'happy',
'provoked': 'angry',
'punished': 'hated',
'put upon': 'burdened',
'quaking': 'fearful',
'quiescent': 'apathetic',
'rageful': 'angry',
'rapturous': 'happy',
'rated': 'singled out',
'reassured': 'fearless',
'reckless': 'powerless',
'redeemed': 'singled out',
'regretful': 'sad',
'rejected': 'alone',
'released': 'free',
'remorse': 'sad',
'replaced': 'hated',
'repulsed': 'demoralized',
'resentful': 'angry',
'resolute': 'fearless',
'respected': 'esteemed',
'responsible': 'adequate',
'restful': 'fearful',
'revered': 'esteemed',
'rueful': 'sad',
'sad': 'sad',
'satisfied': 'happy',
'saucy': 'happy',
'scared': 'fearful',
'secure': 'fearless',
'self-reliant': 'fearless',
'serene': 'happy',
'shaky': 'fearful',
'shamed': 'sad',
'shocked': 'surprise',
'significant': 'esteemed',
'singled out': 'singled out',
'skeptical': 'anxious',
'snoopy': 'attracted',
'somber': 'sad',
'sparkling': 'happy',
'spirited': 'happy',
'spiritless': 'sad',
'sprightly': 'happy',
'startled': 'surprise',
'stereotyped': 'singled out',
'stifled': 'powerless',
'stout hearted': 'fearless',
'strong': 'independent',
'suffering': 'sad',
'sulky': 'sad',
'sullen': 'angry',
'sunny': 'happy',
'surprised': 'surprise',
'suspicious': 'anxious',
'sympathetic': 'codependent',
'tense': 'anxious',
'terrified': 'fearful',
'terrorized': 'fearful',
'thankful': 'happy',
'threatened': 'fearful',
'thwarted': 'powerless',
'timid': 'fearful',
'timorous': 'fearful',
'torn': 'derailed',
'tortured': 'sad',
'tragic': 'sad',
'tranquil': 'happy',
'transported': 'happy',
'trapped': 'entitled',
'tremulous': 'fearful',
'tricked': 'entitled',
'turned on': 'lustful',
'unapproved of': 'hated',
'unbelieving': 'anxious',
'uncertain': 'anxious',
'unconcerned': 'apathetic',
'understood': 'attached',
'unfocussed': 'lost',
'unlovable': 'hated',
'unloved': 'hated',
'unmotivated': 'apathetic',
'unshackled': 'free',
'unsupported': 'belittled',
'up in arms': 'angry',
'upset': 'fearful',
'validated': 'loved',
'valued': 'esteemed',
'victimized': 'sad',
'violated': 'cheated',
'virulent': 'angry',
'vivacious': 'happy',
'vulnerable': 'powerless',
'wavering': 'anxious',
'weak': 'powerless',
'welcomed': 'loved',
'woebegone': 'sad',
'woeful': 'sad',
'worn down': 'powerless',
'worn out': 'powerless',
'worried': 'fearful',
'worshiped': 'esteemed',
'wrathful': 'angry',
'wronged': 'singled out',
'wrought up': 'angry',
'yearning': 'lustful',
'yellow': 'fearful',
'zealous': 'attracted',
'abandoned': 'hated',
'absolved': 'singled out',
'absorbed': 'attracted',
'abused': 'powerless',
'accepted': 'loved',
'aching': 'sad',
'acrimonious': 'angry',
'addicted': 'codependent',
'adequate': 'adequate',
'admired': 'esteemed',
'affectionate': 'attached',
'affronted': 'singled out',
'afraid': 'fearful',
'airy': 'happy',
'alone': 'alone',
'ambivalent': 'bored',
'apathetic': 'apathetic',
'apprehensive': 'anxious',
'arrogant': 'independent',
'ashamed': 'embarrassed',
'astonished': 'surprise',
'at ease': 'safe',
'attacked': 'fearful',
'audacious': 'fearless',
'autonomous': 'free',
'average': 'average',
'avid': 'attracted',
'baffled': 'lost',
'bashful': 'powerless',
'belittled': 'belittled',
'buoyant': 'happy',
'burdened': 'burdened',
'clouded': 'sad',
'committed': 'focused',
'compassionate': 'attached',
'compelled': 'obsessed',
'dauntless': 'fearless',
'debonair': 'happy',
'deceived': 'entitled',
'delighted': 'ecstatic',
'demoralized': 'demoralized',
'derailed': 'derailed',
'desirous': 'attracted',
'despairing': 'sad',
'devastated': 'angry',
'diffident': 'fearful',
'discredited': 'belittled',
'disheartened': 'sad',
'disinclined': 'demoralized',
'disorganized': 'powerless',
'downcast': 'sad',
'entitled': 'entitled',
'excited': 'adequate',
'exultant': 'happy',
'fidgety': 'fearful',
'frowning': 'sad',
'full of misgiving': 'anxious',
'great': 'happy',
'hapless': 'sad',
'hated': 'hated',
'heroic': 'fearless',
'hostile': 'angry',
'in despair': 'sad',
'indifferent': 'bored',
'infuriated': 'angry',
'insecure': 'fearful',
'inspired': 'happy',
'inspiring': 'attracted',
'judged': 'singled out',
'justified': 'singled out',
'laughting': 'happy',
'loved': 'loved',
'loving': 'attached',
'low': 'sad',
'lustful': 'lustful',
'manipulated': 'cheated',
'mumpish': 'sad',
'nosey': 'attracted',
'numb': 'apathetic',
'obliterated': 'powerless',
'peaceful': 'happy',
'petrified': 'fearful',
'piqued': 'angry',
'piteous': 'sad',
'powerless': 'powerless',
'questioning': 'anxious',
'rejected': 'hated',
'self-satisfied': 'happy',
'set up': 'entitled',
'shut out': 'alone',
'sorrowful': 'sad',
'spirited': 'sad',
'supported': 'esteemed',
'suspicious': 'fearful',
'terrific': 'happy',
'trapped': 'entitled',
'trembling': 'fearful',
'uncomfortable': 'anxious',
'underestimated': 'belittled',
'unhappy': 'sad',
'vindicated': 'singled out',
'worked up': 'angry'
{
"info": {
"_postman_id": "b6cdabc7-50b3-4c93-a602-26b6ef60171e",
"name": "sapnaka_and_shan_research",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "LOCAL-FLASK",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:3030/chat?message=hi",
"protocol": "http",
"host": [
"localhost"
],
"port": "3030",
"path": [
"chat"
],
"query": [
{
"key": "message",
"value": "hi"
}
]
}
},
"response": []
},
{
"name": "NGROK",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://18c5-2402-4000-2381-b6fe-9983-e31c-6f29-b85c.ngrok.io/chat?message=hi",
"protocol": "https",
"host": [
"18c5-2402-4000-2381-b6fe-9983-e31c-6f29-b85c",
"ngrok",
"io"
],
"path": [
"chat"
],
"query": [
{
"key": "message",
"value": "hi"
}
]
}
},
"response": []
},
{
"name": "flask-sentiment",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:3030/sentiment?data=I am very sad",
"protocol": "http",
"host": [
"localhost"
],
"port": "3030",
"path": [
"sentiment"
],
"query": [
{
"key": "data",
"value": "I am very sad"
}
]
}
},
"response": []
},
{
"name": "chemical by location",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:3030/chemical?location=Colombo",
"protocol": "http",
"host": [
"localhost"
],
"port": "3030",
"path": [
"chemical"
],
"query": [
{
"key": "location",
"value": "Colombo"
}
]
}
},
"response": []
},
{
"name": "create excel",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:3030/createExcel?startDate=2021-09-06&endDate=2021-09-10",
"protocol": "http",
"host": [
"localhost"
],
"port": "3030",
"path": [
"createExcel"
],
"query": [
{
"key": "startDate",
"value": "2021-09-06"
},
{
"key": "endDate",
"value": "2021-09-10"
}
]
}
},
"response": []
}
]
}
\ No newline at end of file
# https://www.kaggle.com/saurav9786/recommendation-based-on-amazon-food-review
# #################################################################################
import numpy as np
import pandas as pd
import math
import json
import time
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split
from sklearn.neighbors import NearestNeighbors
import scipy.sparse
from scipy.sparse import csr_matrix
import warnings; warnings.simplefilter('ignore')
def recommendation_function(user_array):
#Import the data set
df = pd.read_csv('dataset_sapnaka.csv')
print(df.head())
# Dropping the columns
df = df.drop(['id', 'date'], axis = 1)
print("\n")
print(df.head())
# Check the number of rows and columns
rows, columns = df.shape
print("\n")
print("No of rows: ", rows)
print("No of columns: ", columns)
#Check Data types
print("\n")
print(df.dtypes)
# Check for missing values present
print("\n")
print('Number of missing values across columns-\n', df.isnull().sum())
# Combine location and chemicat to get a key feature
df["location_chemical"] = df["location"] + "/" + df["chemical"]
print("\n")
print(df.head())
# Summary statistics of 'rating' variable
print("\n")
print(df[['score']].describe().transpose())
# find minimum and maximum ratings
def find_min_max_rating():
print("\n")
print('The minimum rating is: %d' %(df['score'].min()))
print('The maximum rating is: %d' %(df['score'].max()))
find_min_max_rating()
# Number of unique location_chemical in the data
print("\n")
print('Number of unique location_chemical in Raw data = ', df['location_chemical'].nunique())
# Top 3 users based on rating
most_rated = df.groupby('user_id').size().sort_values(ascending=False)[:3]
print("\n")
print(most_rated)
counts = df['user_id'].value_counts()
df_final = df[df['user_id'].isin(counts[counts >= 12].index)]
print("\n")
print(df_final.head())
print("\n")
print('Number of users who have rated 12 or more items =', len(df_final))
print('Number of unique USERS in final data = ', df_final['user_id'].nunique())
print('Number of unique ITEMS in final data = ', df_final['location_chemical'].nunique())
print("\n")
final_ratings_matrix = pd.pivot_table(df_final,index=['user_id'], columns = 'location_chemical', values = "score")
final_ratings_matrix.fillna(0,inplace=True)
print('Shape of final_ratings_matrix: ', final_ratings_matrix.shape)
given_num_of_ratings = np.count_nonzero(final_ratings_matrix)
print('given_num_of_ratings = ', given_num_of_ratings)
possible_num_of_ratings = final_ratings_matrix.shape[0] * final_ratings_matrix.shape[1]
print('possible_num_of_ratings = ', possible_num_of_ratings)
density = (given_num_of_ratings/possible_num_of_ratings)
density *= 100
print ('density: {:4.2f}%'.format(density))
print("\n")
print(final_ratings_matrix.tail())
# Matrix with one row per 'location_chemical' and one column per 'user_id' for location_chemical-based CF
final_ratings_matrix_T = final_ratings_matrix.transpose()
print("\n")
print(final_ratings_matrix_T.head())
#Split the training and test data in the ratio 70:30
train_data, test_data = train_test_split(df_final, test_size = 0.3, random_state=0)
print("\n")
# changed
print(train_data.head(1))
def shape():
print("\n")
print("Test data shape: ", test_data.shape)
print("Train data shape: ", train_data.shape)
shape()
#Count of user_id for each unique product as recommendation score
print("\n")
train_data_grouped = train_data.groupby('location_chemical').agg({'user_id': 'count'}).reset_index()
train_data_grouped.rename(columns = {'user_id': 'score'},inplace=True)
print(train_data_grouped.head())
#Sort the products on recommendation score
train_data_sort = train_data_grouped.sort_values(['score', 'location_chemical'], ascending = [0,1])
#Generate a recommendation rank based upon score
train_data_sort['Rank'] = train_data_sort['score'].rank(ascending=0, method='first')
#Get the top 1 recommendations
# changed
popularity_recommendations = train_data_sort.head(1)
print("\n")
print(popularity_recommendations)
# #################################################################################
# #################################################################################
# #################################################################################
# Model
# #################################################################################
# #################################################################################
# #################################################################################
print("\n")
def recommend(user_id):
user_recommendations = popularity_recommendations
#Add user_id column for which the recommendations are being generated
user_recommendations['user_id'] = user_id
#Bring user_id column to the front
cols = user_recommendations.columns.tolist()
cols = cols[-1:] + cols[:-1]
user_recommendations = user_recommendations[cols]
return user_recommendations
find_recom = user_array # This list is user choice.
data = ""
for i in find_recom:
print("Here is the recommendation for the userId: %s\n" %(i))
print(recommend(i))
print("\n")
data = data + str(recommend(i))
return(data)
print("Hello\n")
data = recommendation_function(["Malaka"])
print(data)
x = data.split()
print("x: " + str(x[6]))
\ No newline at end of file
int smokeA0= A0;
int buzzer = 11;
float sensorValue;
void setup()
{
pinMode (buzzer, OUTPUT);
pinMode (smokeA0, INPUT);
Serial.begin(9600);
Serial.println("Gas sensor warming up!");
delay(2000);
noTone(buzzer);
}
void loop()
{
sensorValue= analogRead(smokeA0);
Serial.print("Methane(CH4)senor-:");
Serial.print(sensorValue);
if(sensorValue > 250)
{
Serial.print(" | Smoke detected!");
tone(buzzer,1000,200);
}
else {
noTone(buzzer);
}
Serial.println("");
delay(200);
}
const int gasPin=A0;
int buzzer = 11;
float sensorValue;
void setup() {
pinMode (buzzer, OUTPUT);
pinMode (gasPin, INPUT);
Serial.begin(9600);
Serial.println("Gas sensor warming up!");
delay(2000);
noTone(buzzer);
}
void loop() {
sensorValue= analogRead(gasPin);
Serial.print("Butane senor-:");
Serial.print(sensorValue);
if(sensorValue > 300)
{
Serial.print(" | Smoke detected!");
tone(buzzer,1000,200);
}
else {
noTone(buzzer);
}
Serial.println("");
delay(200);
}
const int AOUTpin=0;
const int DOUTpin=8;
const int ledPin=13;
int limit;
int value;
void setup() {
Serial.begin(115200);
pinMode(DOUTpin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop()
{
value=analogRead(AOUTpin);
limit=digitalRead(DOUTpin);
Serial.print("Carbon Monoxide(CO)Sensor: ");
Serial.println(value);
Serial.print("Limit: ");
Serial.print(limit);
delay(100);
if(limit == HIGH){
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(ledPin, LOW);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment