From e096d7ecf7e6d8afe8006634e922a8683ea496f5 Mon Sep 17 00:00:00 2001 From: Seongjoon Lee Date: Wed, 19 Oct 2022 22:28:14 +0900 Subject: [PATCH] Initial commit --- android/.gitignore | 13 + android/LICENSE.txt | 201 + android/README.md | 16 + android/app/.gitignore | 1 + android/app/build.gradle | 40 + android/app/proguard-rules.pro | 21 + .../spamo/ExampleInstrumentedTest.kt | 24 + android/app/src/main/AndroidManifest.xml | 21 + android/app/src/main/assets/model.tflite | Bin 0 -> 100336 bytes android/app/src/main/assets/word_dict.json | 1 + .../java/com/ml/quaterion/spamo/Classifier.kt | 106 + .../com/ml/quaterion/spamo/MainActivity.kt | 88 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 74 + .../app/src/main/res/layout/activity_main.xml | 48 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes android/app/src/main/res/values/colors.xml | 6 + android/app/src/main/res/values/strings.xml | 3 + android/app/src/main/res/values/styles.xml | 11 + .../com/ml/quaterion/spamo/ExampleUnitTest.kt | 17 + android/build.gradle | 28 + android/gradle.properties | 21 + android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + android/gradlew | 172 + android/gradlew.bat | 84 + android/settings.gradle | 1 + python/DataProcessor.py | 48 + python/LICENSE.txt | 201 + python/MainFile.py | 29 + python/Model.py | 63 + python/README.md | 3 + python/TFLiteBufferConverter.py | 13 + python/android/model.tflite | Bin 0 -> 100336 bytes python/android/word_dict.json | 1 + python/models/model.h5 | Bin 0 -> 568648 bytes python/processed_data/test_x.npy | Bin 0 -> 1524764 bytes python/processed_data/test_y.npy | Bin 0 -> 17960 bytes python/processed_data/x.npy | Bin 0 -> 2286740 bytes python/processed_data/y.npy | Bin 0 -> 26872 bytes python/raw_data/data.csv | 5573 +++++++++++++++++ 52 files changed, 6978 insertions(+) create mode 100644 android/.gitignore create mode 100644 android/LICENSE.txt create mode 100644 android/README.md create mode 100644 android/app/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/proguard-rules.pro create mode 100644 android/app/src/androidTest/java/com/ml/quaterion/spamo/ExampleInstrumentedTest.kt create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/assets/model.tflite create mode 100644 android/app/src/main/assets/word_dict.json create mode 100644 android/app/src/main/java/com/ml/quaterion/spamo/Classifier.kt create mode 100644 android/app/src/main/java/com/ml/quaterion/spamo/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/main/res/layout/activity_main.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/values/colors.xml create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/test/java/com/ml/quaterion/spamo/ExampleUnitTest.kt create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.jar create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/gradlew create mode 100644 android/gradlew.bat create mode 100644 android/settings.gradle create mode 100644 python/DataProcessor.py create mode 100644 python/LICENSE.txt create mode 100644 python/MainFile.py create mode 100644 python/Model.py create mode 100644 python/README.md create mode 100644 python/TFLiteBufferConverter.py create mode 100644 python/android/model.tflite create mode 100644 python/android/word_dict.json create mode 100644 python/models/model.h5 create mode 100644 python/processed_data/test_x.npy create mode 100644 python/processed_data/test_y.npy create mode 100644 python/processed_data/x.npy create mode 100644 python/processed_data/y.npy create mode 100644 python/raw_data/data.csv diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..2b75303 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +*.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 diff --git a/android/LICENSE.txt b/android/LICENSE.txt new file mode 100644 index 0000000..21e2533 --- /dev/null +++ b/android/LICENSE.txt @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/android/README.md b/android/README.md new file mode 100644 index 0000000..ebfeb9c --- /dev/null +++ b/android/README.md @@ -0,0 +1,16 @@ + +# Spam Classification Android Demo + +An Android Project to demonstrate the use of a TensorFlow Lite model to classify spam messages. + +## Major Updates as of February 2021 + +* Improved `Classifier.kt` by removing unwanted methods. +* Added documentation for classes and methods in `Classifier.kt` and `MainActivity.kt`. +* Replaced `AsyncTask` with [Kotlin Coroutines](https://developer.android.com/kotlin/coroutines). + +## Feedback + +You can [open an issue](https://github.com/shubham0204/Spam_Classification_Android_Demo/issues/new) here or +[start a new Discussion](https://github.com/shubham0204/Spam_Classification_Android_Demo/discussions/new). +You may consider filling out this [form](https://forms.gle/6dbLZdmnBZjE99Bx5). \ No newline at end of file diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..885a8bb --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.ml.quaterion.spamo" + minSdkVersion 23 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + aaptOptions { + noCompress "tflite" + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.core:core-ktx:1.0.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'org.tensorflow:tensorflow-lite:1.13.1' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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 diff --git a/android/app/src/androidTest/java/com/ml/quaterion/spamo/ExampleInstrumentedTest.kt b/android/app/src/androidTest/java/com/ml/quaterion/spamo/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..a892d8c --- /dev/null +++ b/android/app/src/androidTest/java/com/ml/quaterion/spamo/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.ml.quaterion.spamo + +import androidx.test.InstrumentationRegistry +import androidx.test.runner.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getTargetContext() + assertEquals("com.ml.quaterion.spamo", appContext.packageName) + } +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ad15679 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/assets/model.tflite b/android/app/src/main/assets/model.tflite new file mode 100644 index 0000000000000000000000000000000000000000..d45c373f499881187390d796a1fc6acfd0b2264f GIT binary patch literal 100336 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 G? = null + + // Load the contents of the vocab ( see assets/word_dict.json ) + private fun loadJSONFromAsset(filename : String? ): String? { + var json: String? + try { + val inputStream = context!!.assets.open(filename ) + val size = inputStream.available() + val buffer = ByteArray(size) + inputStream.read(buffer) + inputStream.close() + json = String(buffer) + } + catch (ex: IOException) { + ex.printStackTrace() + return null + } + return json + } + + fun processVocab( callback: VocabCallback ) { + CoroutineScope( Dispatchers.Main ).launch { + loadVocab( callback , loadJSONFromAsset( filename )!! ) + } + } + + // Tokenize the given sentence + fun tokenize ( message : String ): IntArray { + val parts : List = message.split(" " ) + val tokenizedMessage = ArrayList() + for ( part in parts ) { + if (part.trim() != ""){ + var index : Int? = 0 + index = if ( vocabData!![part] == null ) { + 0 + } else{ + vocabData!![part] + } + tokenizedMessage.add( index!! ) + } + } + return tokenizedMessage.toIntArray() + } + + // Pad the given sequence to maxlen with zeros. + fun padSequence ( sequence : IntArray ) : IntArray { + val maxlen = this.maxlen + if ( sequence.size > maxlen ) { + return sequence.sliceArray( 0..maxlen ) + } + else if ( sequence.size < maxlen ) { + val array = ArrayList() + array.addAll( sequence.asList() ) + for ( i in array.size until maxlen ){ + array.add(0) + } + return array.toIntArray() + } + else{ + return sequence + } + } + + + interface VocabCallback { + fun onVocabProcessed() + } + + private fun loadVocab(callback : VocabCallback, json : String ) { + with( Dispatchers.Default ) { + val jsonObject = JSONObject( json ) + val iterator : Iterator = jsonObject.keys() + val data = HashMap< String , Int >() + while ( iterator.hasNext() ) { + val key = iterator.next() + data[key] = jsonObject.get( key ) as Int + } + with( Dispatchers.Main ){ + vocabData = data + callback.onVocabProcessed() + } + } + } + +} \ No newline at end of file diff --git a/android/app/src/main/java/com/ml/quaterion/spamo/MainActivity.kt b/android/app/src/main/java/com/ml/quaterion/spamo/MainActivity.kt new file mode 100644 index 0000000..a1b129d --- /dev/null +++ b/android/app/src/main/java/com/ml/quaterion/spamo/MainActivity.kt @@ -0,0 +1,88 @@ +package com.ml.quaterion.spamo + +import android.app.ProgressDialog +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.text.TextUtils +import android.widget.Toast +import kotlinx.android.synthetic.main.activity_main.* +import org.tensorflow.lite.Interpreter +import java.io.FileInputStream +import java.io.IOException +import java.nio.MappedByteBuffer +import java.nio.channels.FileChannel +import java.util.* + +class MainActivity : AppCompatActivity() { + + // Name of TFLite model ( in /assets folder ). + private val MODEL_ASSETS_PATH = "model.tflite" + + // Max Length of input sequence. The input shape for the model will be ( None , INPUT_MAXLEN ). + private val INPUT_MAXLEN = 171 + + private var tfLiteInterpreter : Interpreter? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + // Init the classifier. + val classifier = Classifier( this , "word_dict.json" , INPUT_MAXLEN ) + // Init TFLiteInterpreter + tfLiteInterpreter = Interpreter( loadModelFile() ) + + // Start vocab processing, show a ProgressDialog to the user. + val progressDialog = ProgressDialog( this ) + progressDialog.setMessage( "Parsing word_dict.json ..." ) + progressDialog.setCancelable( false ) + progressDialog.show() + classifier.processVocab( object: Classifier.VocabCallback { + override fun onVocabProcessed() { + // Processing done, dismiss the progressDialog. + progressDialog.dismiss() + } + }) + + classifyButton.setOnClickListener { + + val message = message_text.text.toString().toLowerCase().trim() + if ( !TextUtils.isEmpty( message ) ){ + // Tokenize and pad the given input text. + val tokenizedMessage = classifier.tokenize( message ) + val paddedMessage = classifier.padSequence( tokenizedMessage ) + + val results = classifySequence( paddedMessage ) + val class1 = results[0] + val class2 = results[1] + result_text.text = "SPAM : $class2\nNOT SPAM : $class1 " + } + else{ + Toast.makeText( this@MainActivity, "Please enter a message.", Toast.LENGTH_LONG).show(); + } + + } + + } + + @Throws(IOException::class) + private fun loadModelFile(): MappedByteBuffer { + val assetFileDescriptor = assets.openFd(MODEL_ASSETS_PATH) + val fileInputStream = FileInputStream(assetFileDescriptor.fileDescriptor) + val fileChannel = fileInputStream.channel + val startOffset = assetFileDescriptor.startOffset + val declaredLength = assetFileDescriptor.declaredLength + return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength) + } + + // Perform inference, given the input sequence. + private fun classifySequence (sequence : IntArray ): FloatArray { + // Input shape -> ( 1 , INPUT_MAXLEN ) + val inputs : Array = arrayOf( sequence.map { it.toFloat() }.toFloatArray() ) + // Output shape -> ( 1 , 2 ) ( as numClasses = 2 ) + val outputs : Array = arrayOf( FloatArray( 2 ) ) + tfLiteInterpreter?.run( inputs , outputs ) + return outputs[0] + } + +} diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..3ac9d3e --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,48 @@ + + + + + +