From 9527908f0d2d488f2720d93eb5e18c41aa4753a4 Mon Sep 17 00:00:00 2001 From: ongbo <1308161085@qq.com> Date: Tue, 7 Jan 2020 10:17:26 +0800 Subject: [PATCH] update search and IDEA --- .../SearchCenter/SearchEntryActivity.java | 66 ++- .../com/example/Util/cmkgWebServiceGet.java | 1 + cmkg/.gitignore | 33 ++ cmkg/mvnw | 310 ++++++++++++++ cmkg/mvnw.cmd | 182 ++++++++ cmkg/pom.xml | 130 ++++++ .../java/com/cmkg/cmkg/CmkgApplication.java | 36 ++ .../Controller/LoginRegisterController.java | 62 +++ .../cmkg/Controller/ModifyController.java | 37 ++ .../cmkg/Controller/QuestionController.java | 74 ++++ .../java/com/cmkg/cmkg/Util/CodeMessage.java | 21 + .../src/main/java/com/cmkg/cmkg/database/info | 1 + .../java/com/cmkg/cmkg/database/user.java | 92 ++++ .../main/java/com/cmkg/cmkg/node/disease.java | 67 +++ cmkg/src/main/java/com/cmkg/cmkg/node/info | 1 + .../java/com/cmkg/cmkg/node/medicine.java | 115 +++++ .../com/cmkg/cmkg/process/ModelProcess.java | 405 ++++++++++++++++++ .../cmkg/repository/DiseaseRespository.java | 16 + .../repository/Login_Register_Repository.java | 10 + .../cmkg/repository/MedicineRespository.java | 15 + .../cmkg/repository/QuestionRespository.java | 70 +++ .../main/java/com/cmkg/cmkg/repository/info | 1 + .../com/cmkg/cmkg/server/QuestionService.java | 6 + .../cmkg/cmkg/server/ReturnD/funcDisea.java | 23 + .../java/com/cmkg/cmkg/server/ReturnData.java | 40 ++ .../cmkg/server/impl/QuestionServiceImpl.java | 224 ++++++++++ .../main/java/com/cmkg/cmkg/server/impl/info | 1 + cmkg/src/main/java/com/cmkg/cmkg/server/info | 1 + cmkg/src/main/resources/Dockerfile | 4 + .../src/main/resources/application.properties | 12 + cmkg/src/test/java/com/cmkg/cmkg/ape.java | 103 +++++ cmkg/src/test/java/com/cmkg/cmkg/hanlp.java | 61 +++ 32 files changed, 2219 insertions(+), 1 deletion(-) create mode 100644 cmkg/.gitignore create mode 100644 cmkg/mvnw create mode 100644 cmkg/mvnw.cmd create mode 100644 cmkg/pom.xml create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/CmkgApplication.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/Controller/LoginRegisterController.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/Controller/ModifyController.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/Controller/QuestionController.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/Util/CodeMessage.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/database/info create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/database/user.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/node/disease.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/node/info create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/node/medicine.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/process/ModelProcess.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/repository/DiseaseRespository.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/repository/Login_Register_Repository.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/repository/MedicineRespository.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/repository/QuestionRespository.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/repository/info create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/QuestionService.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/ReturnD/funcDisea.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/ReturnData.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/impl/QuestionServiceImpl.java create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/impl/info create mode 100644 cmkg/src/main/java/com/cmkg/cmkg/server/info create mode 100644 cmkg/src/main/resources/Dockerfile create mode 100644 cmkg/src/main/resources/application.properties create mode 100644 cmkg/src/test/java/com/cmkg/cmkg/ape.java create mode 100644 cmkg/src/test/java/com/cmkg/cmkg/hanlp.java diff --git a/app/src/main/java/com/example/SearchCenter/SearchEntryActivity.java b/app/src/main/java/com/example/SearchCenter/SearchEntryActivity.java index 2cc0148..83850ef 100644 --- a/app/src/main/java/com/example/SearchCenter/SearchEntryActivity.java +++ b/app/src/main/java/com/example/SearchCenter/SearchEntryActivity.java @@ -63,6 +63,7 @@ public class SearchEntryActivity extends AppCompatActivity implements CardStackV super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_entry); Intent intent = getIntent(); + Bundle bundle = intent.getExtras(); Log.i("bundle",bundle.toString()); init(bundle); @@ -237,7 +238,7 @@ public class SearchEntryActivity extends AppCompatActivity implements CardStackV texts=new String[1]; texts[0]=response.getMsg()+"能治什么病"; model_Text=Model_Function; - }else { + }else if(response.getCode()==MedicineToFunction){//返回的是病 /** *药——作用,能治什么病 * nm 吃什么药 @@ -266,6 +267,62 @@ public class SearchEntryActivity extends AppCompatActivity implements CardStackV } } model_Text=Model_Medicines; + }else{//当code=501 + int precode = bundle.getInt("code"); + if(precode==100||precode==200){ + //病 + content = (ArrayList) bundle.getSerializable("content"); + Random r=new Random(); + if(content.size()>3){ + texts=new String[3]; + for(int i=0;i<3;i++) { + int a; + while(true){ + a=r.nextInt(content.size()); + if(getDuplicate(a,index)) + break; + } + index[i] =a; + texts[i]=content.get(index[i])+"能治什么病症"; + } + }else{ + texts=new String[content.size()]; + for(int i=0;i) bundle.getSerializable("content"); + Random r=new Random(); + if(content.size()>3){ + texts=new String[3]; + for(int i=0;i<3;i++) { + int a; + while(true){ + a=r.nextInt(9); + System.out.println("The last a="+a); + if(getDuplicate(a,index)) + break; + } + System.out.println("The waibu a="+a); + index[i] = r.nextInt(content.size()); + texts[i]=content.get(index[i])+"吃什么药"; + System.out.println("text[i]="+texts[i]); + } + }else{ + texts=new String[content.size()]; + for(int i=0;i \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + 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 + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/cmkg/mvnw.cmd b/cmkg/mvnw.cmd new file mode 100644 index 0000000..84d60ab --- /dev/null +++ b/cmkg/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/cmkg/pom.xml b/cmkg/pom.xml new file mode 100644 index 0000000..ed73644 --- /dev/null +++ b/cmkg/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + com.cmkg + cmkg + 0.0.1-SNAPSHOT + cmkg + Demo project for Spring Boot + war + + 1.8 + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + org.springframework.boot + spring-boot-starter-data-neo4j + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + + org.json + json + 20190722 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + + + org.apache.spark + spark-core_2.11 + 2.3.0 + + + + + org.apache.spark + spark-mllib_2.11 + 2.3.0 + + + com.hankcs + hanlp + portable-1.7.1 + + + org.codehaus.janino + janino + 3.0.8 + + + + + + + alimaven spring plugin + alimaven spring plugin + https://maven.aliyun.com/repository/spring-plugin + + + + + + org.springframework.boot + spring-boot-maven-plugin + + cmkg + + + + + + + + + diff --git a/cmkg/src/main/java/com/cmkg/cmkg/CmkgApplication.java b/cmkg/src/main/java/com/cmkg/cmkg/CmkgApplication.java new file mode 100644 index 0000000..0115240 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/CmkgApplication.java @@ -0,0 +1,36 @@ +package com.cmkg.cmkg; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; + +@SpringBootApplication +@EnableNeo4jRepositories(basePackages = "com.cmkg.cmkg.repository") +@EntityScan(basePackages = {"com.cmkg.cmkg.node","com.cmkg.cmkg.database"}) + +// +//public class CmkgApplication { +//// @Override +//// protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { +//// return builder.sources(CmkgApplication.class); +//// } +// +// public static void main(String[] args) { +// SpringApplication.run(CmkgApplication.class, args); +// } +// +//} +public class CmkgApplication extends SpringBootServletInitializer{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(CmkgApplication.class); + } + + public static void main(String[] args) { + SpringApplication.run(CmkgApplication.class,args); + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/Controller/LoginRegisterController.java b/cmkg/src/main/java/com/cmkg/cmkg/Controller/LoginRegisterController.java new file mode 100644 index 0000000..c3a58a3 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/Controller/LoginRegisterController.java @@ -0,0 +1,62 @@ +package com.cmkg.cmkg.Controller; + + +import com.cmkg.cmkg.Util.CodeMessage; +import com.cmkg.cmkg.database.user; +import com.cmkg.cmkg.repository.Login_Register_Repository; +import com.cmkg.cmkg.server.ReturnData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import scala.tools.nsc.doc.base.comment.Code; + +@RestController +@RequestMapping("/request") +public class LoginRegisterController { + + @Autowired + Login_Register_Repository login_register_repository; + + @RequestMapping("/login") + @ResponseBody + public ReturnData LoginGet(@RequestParam("phonenumber") String phonenumber, @RequestParam("password") String password){ + ReturnData returnData=new ReturnData(); + user user=login_register_repository.findById(phonenumber).orElse(null); + if(user==null){ + returnData.setCode(CodeMessage.phonenumberisNotExist); + returnData.setMsg("该用户不存在"); + } + else{ + if(user.getPassword().equals(password)){ + returnData.setCode(CodeMessage.loginsucess); + returnData.setMsg("登录成功"); + returnData.setData(user.getUsername()); + }else{ + returnData.setCode(CodeMessage.passwordError); + returnData.setMsg("密码错误"); + returnData.setData("密码错误,登陆失败"); + } + } + return returnData; + + } + + @PostMapping("/register") + @ResponseBody + public ReturnData RegisterPost(@RequestBody user user){ + ReturnData returnData=new ReturnData(); + + if(login_register_repository.findById(user.getPhonenumber()).orElse(null)==null) { + login_register_repository.save(user); + returnData.setCode(CodeMessage.registersucess); + returnData.setMsg("注册成功"); + returnData.setData(null); + }else{ + returnData.setCode(CodeMessage.phonenumberHadExist); + returnData.setMsg("注册失败,用户已存在"); + returnData.setData(null); + } + + return returnData; + } + +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/Controller/ModifyController.java b/cmkg/src/main/java/com/cmkg/cmkg/Controller/ModifyController.java new file mode 100644 index 0000000..093fd81 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/Controller/ModifyController.java @@ -0,0 +1,37 @@ +package com.cmkg.cmkg.Controller; + +import com.cmkg.cmkg.database.user; +import com.cmkg.cmkg.repository.Login_Register_Repository; +import com.cmkg.cmkg.server.ReturnData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +@RequestMapping("/modify") + +@RestController +public class ModifyController { + @Autowired + Login_Register_Repository login_register_repository; +@RequestMapping("/mutimodify") +public ReturnData mutimodify(@RequestParam ("phonenumber") String phonenumber,@RequestParam("username") String username,@RequestParam("sex") Integer sex,@RequestParam("age") Integer age, @RequestParam("region") String region){ + ReturnData returnData=new ReturnData(); + user user=login_register_repository.findById(phonenumber).orElse(null); + user.setUsername(username); + user.setAge(age); + user.setSex(sex); + user.setRegion(region); + user.setPhonenumber(phonenumber); + login_register_repository.save(user); + return returnData; + } +@RequestMapping("/passwordmodify") + public ReturnData passwordmodify(@RequestParam("phonenumber") String phonenumber,@RequestParam("password") String password){ + ReturnData returnData=new ReturnData(); + user user=login_register_repository.findById(phonenumber).orElse(null); + user.setPassword(password); + login_register_repository.save(user); + return returnData; +} +} + diff --git a/cmkg/src/main/java/com/cmkg/cmkg/Controller/QuestionController.java b/cmkg/src/main/java/com/cmkg/cmkg/Controller/QuestionController.java new file mode 100644 index 0000000..7503b75 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/Controller/QuestionController.java @@ -0,0 +1,74 @@ +package com.cmkg.cmkg.Controller; + + +import com.cmkg.cmkg.node.disease; +import com.cmkg.cmkg.node.medicine; +import com.cmkg.cmkg.repository.QuestionRespository; +import com.cmkg.cmkg.server.QuestionService; +import com.cmkg.cmkg.server.ReturnData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rest/cmkg/question") +public class QuestionController { + @Autowired + QuestionService questionService; + //做个小测试 + @Autowired + public QuestionRespository questionRespository; + public String Search_disease_Success="查找病症成功"; + public String Search_medicine_Success="查找药品成功"; + public String SearchFaile="查找信息失败"; + public int code; + + ReturnData rd=new ReturnData(); + disease dis=new disease(); + medicine med=new medicine(); + + @RequestMapping("/hello") + public ReturnData JudgeAtrribute(@RequestParam("name") String name){ + ReturnData re = null; + try { + re = questionService.answer(name); + System.out.println(re); + } catch (Exception e) { + re.setData("有错误"); + e.printStackTrace(); + } + //去每个表里做查找,找到了的话做查询 +// System.out.println(questionRespository); +// System.out.println(name); +// Long i = questionRespository.getDiseaseId(name); +// System.out.println(i); +// if(questionRespository.getDiseaseId(name)!=0){//说明输入的事病症 +// String symptom=questionRespository.getDiseaseSymptom(name); +// String[] tomedicine=questionRespository.getDiseaseToMedicine(name); +// dis.setName(name); +// dis.setSyptom(symptom); +// dis.setTeammates(tomedicine); +// rd.setMessage(Search_disease_Success); +// rd.setCode(200); +// rd.setData(dis); +// return rd; +// }else if(questionRespository.getMedicineId(name)!=0){//说明输入的是养生方法或药品名称 +// String operation=questionRespository.getMedicineOperation(name); +// String syndromes=questionRespository.getMedicineSyndromes(name); +// med.setName(name); +// med.setOperation(operation); +// med.setSyndromes(syndromes); +// rd.setCode(200); +// rd.setMessage(Search_medicine_Success); +// rd.setData(med); +// return rd; +// }else{ +// rd.setMessage(SearchFaile); +// rd.setCode(502); +// return rd; +// } + + return re; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/Util/CodeMessage.java b/cmkg/src/main/java/com/cmkg/cmkg/Util/CodeMessage.java new file mode 100644 index 0000000..ec77a34 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/Util/CodeMessage.java @@ -0,0 +1,21 @@ +package com.cmkg.cmkg.Util; + +public class CodeMessage { + public static final int DiseaseToSymptom = 100; + public static final int DiseaseToMedicine = 200; + public static final int MedicineToOperation = 300; + public static final int MedicineToSymptom = 400; + public static final int NoMessage = 501; + + //登陆成功 + public static final int loginsucess = 200; + //手机号不存在 + public static final int phonenumberisNotExist = 501; + //密码错误 + public static final int passwordError = 502; + + //注册成功 + public static final int registersucess = 200; + //手机号已注册 + public static final int phonenumberHadExist = 501; +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/database/info b/cmkg/src/main/java/com/cmkg/cmkg/database/info new file mode 100644 index 0000000..67cd168 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/database/info @@ -0,0 +1 @@ +保存mysql的数据实体信息 \ No newline at end of file diff --git a/cmkg/src/main/java/com/cmkg/cmkg/database/user.java b/cmkg/src/main/java/com/cmkg/cmkg/database/user.java new file mode 100644 index 0000000..e477dff --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/database/user.java @@ -0,0 +1,92 @@ +package com.cmkg.cmkg.database; + +import javax.persistence.*; + +@Entity +@Table(name = "user") +public class user { + protected user(){} + public user(String phonenumber, String username, String password, Integer age, Integer sex, String region) { + this.phonenumber = phonenumber; + this.username = username; + this.password = password; + this.age = age; + this.sex = sex; + this.region = region; + } + + @Id + @Column(name = "phonenumber") + private String phonenumber; + + @Column(name = "username") + private String username; + @Column(name = "password") + private String password; + @Column(name = "age") + private Integer age; + @Column(name = "sex") + private Integer sex; + @Column(name = "region") + private String region; + + public String getPhonenumber() { + return phonenumber; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + + public Integer getAge() { + return age; + } + + public Integer getSex() { + return sex; + } + + public String getRegion() { + return region; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setAge(Integer age) { + this.age = age; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public void setRegion(String region) { + this.region = region; + } + + @Override + public String toString() { + return "user{" + + "phonenumber='" + phonenumber + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + ", sex=" + sex + + ", region='" + region + '\'' + + '}'; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/node/disease.java b/cmkg/src/main/java/com/cmkg/cmkg/node/disease.java new file mode 100644 index 0000000..4f1bf71 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/node/disease.java @@ -0,0 +1,67 @@ +package com.cmkg.cmkg.node; + + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +@NodeEntity +public class disease { + + @Id @GeneratedValue private Long did; + private String name; + private String syptom; + private String proune; + private String mchar; + @Relationship(type = "my", direction = Relationship.DIRECTION) + public String[] teammates; + + public Long getDid() { + return did; + } + + public String getName() { + return name; + } + + public String getSyptom() { + return syptom; + } + + public String getProune() { + return proune; + } + + public String getMchar() { + return mchar; + } + + public void setDid(Long did) { + this.did = did; + } + + public void setName(String name) { + this.name = name; + } + + public void setSyptom(String syptom) { + this.syptom = syptom; + } + + public void setProune(String proune) { + this.proune = proune; + } + + public void setMchar(String mchar) { + this.mchar = mchar; + } + + public String[] getTeammates() { + return teammates; + } + + public void setTeammates(String[] teammates) { + this.teammates = teammates; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/node/info b/cmkg/src/main/java/com/cmkg/cmkg/node/info new file mode 100644 index 0000000..32dd77a --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/node/info @@ -0,0 +1 @@ +保存图数据库的节点信息 \ No newline at end of file diff --git a/cmkg/src/main/java/com/cmkg/cmkg/node/medicine.java b/cmkg/src/main/java/com/cmkg/cmkg/node/medicine.java new file mode 100644 index 0000000..b916d02 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/node/medicine.java @@ -0,0 +1,115 @@ +package com.cmkg.cmkg.node; + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; + +public class medicine { + + @Id @GeneratedValue Long yid; + private String name; + private String sympton; + private String disease; + private String taboo;//禁用 + private String function;//功能 + private String remark;// + private String syndromes;// + private String position;// + private String operation;//用法 + + public Long getId(){ + return yid; + } + + public String getName(){ + return name; + } + + public String getSympton(){ + return sympton; + } + + public String getDisease(){ + return disease; + } + + public String getTaboo(){ + return taboo; + } + + public String getFunction(){ + return function; + } + + public String getRemark(){ + return remark; + } + + public String getSyndromes(){ + return syndromes; + } + + public String getPosition(){ + return position; + } + + public String getOperation(){ + return operation; + } + + public void setYid(Long id){ + this.yid=id; + } + + public void setName(String name){ + this.name=name; + } + + public void setSympton(String sympton){ + this.sympton=sympton; + } + + public void setDisease(String disease){ + this.disease=disease; + } + + public void setTaboo(String taboo){ + this.taboo=taboo; + } + + public void setFunction(String function){ + this.function=function; + } + + public void setRemark(String remark){ + this.remark=remark; + } + + public void setSyndromes(String syndromes){ + this.syndromes=syndromes; + } + + public void setPosition(String position){ + this.position=position; + } + + public void setOperation(String operation){ + this.operation=operation; + } + + + + public String toString() { + return "Yangsheng{" + + "yid=" + yid + + ", name='" + name + '\'' + + ", symptom='"+sympton + '\'' + + ", disease='" + disease +'\'' + + ",taboo='" + taboo + '\'' + + ",function='" + function + '\'' + + ",remark='" +remark + '\'' + + ",syndromes='" +syndromes + '\'' + + ",postiton='" +position +'\'' + + ",operation='" +operation +'\'' + + '}'; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/process/ModelProcess.java b/cmkg/src/main/java/com/cmkg/cmkg/process/ModelProcess.java new file mode 100644 index 0000000..49ab174 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/process/ModelProcess.java @@ -0,0 +1,405 @@ +package com.cmkg.cmkg.process; + +import org.apache.spark.mllib.classification.NaiveBayesModel; + +import java.io.*; +import java.util.*; + +import com.hankcs.hanlp.HanLP; +import com.hankcs.hanlp.seg.Segment; +import com.hankcs.hanlp.seg.common.Term; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.mllib.classification.NaiveBayes; +import org.apache.spark.mllib.classification.NaiveBayesModel; +import org.apache.spark.mllib.linalg.Vector; +import org.apache.spark.mllib.linalg.Vectors; +import org.apache.spark.mllib.regression.LabeledPoint; + +public class ModelProcess { + /** + * ·ÖÀà±êÇ©ºÅºÍÎʾäÄ£°å¶ÔÓ¦±í + */ + Map questionsPattern; + + /** + * Spark±´Ò¶Ë¹·ÖÀàÆ÷ + */ + NaiveBayesModel nbModel; + + /** + * ´ÊÓïºÍϱêµÄ¶ÔÓ¦±í == ´Ê»ã±í + */ + Map vocabulary; + + /** + * ¹Ø¼ü×ÖÓëÆä´ÊÐÔµÄmap¼üÖµ¶Ô¼¯ºÏ == ¾ä×Ó³éÏó + */ + Map abstractMap; + + /** + * Ö¸¶¨ÎÊÌâquestion¼°×ÖµäµÄtxtÄ£°åËùÔڵĸùĿ¼ + */ + String rootDirPath = "D:/HanLP/data"; + + /** + * ·ÖÀàÄ£°åË÷Òý + */ + int modelIndex = 0; + + public ModelProcess() throws Exception{ + questionsPattern = loadQuestionsPattern(); + vocabulary = loadVocabulary(); + nbModel = loadClassifierModel(); + } + + + public ModelProcess(String rootDirPath) throws Exception{ + this.rootDirPath = rootDirPath+'/'; + questionsPattern = loadQuestionsPattern(); + vocabulary = loadVocabulary(); + nbModel = loadClassifierModel(); + } + + public ArrayList analyQuery(String queryString) throws Exception { + + /** + * ´òÓ¡Îʾä + */ + System.out.println("原始句子:"+queryString); + System.out.println("========HanLP:开始分词========"); + + /** + * ³éÏó¾ä×Ó£¬ÀûÓÃHanLP·Ö´Ê£¬½«¹Ø¼ü×Ö½øÐдÊÐÔ³éÏó + */ + String abstr = queryAbstract(queryString); + System.out.println("抽象句子:"+abstr);// nm µÄ µ¼ÑÝ ÊÇ Ë­ + + /** + * ½«³éÏóµÄ¾ä×ÓÓësparkѵÁ·¼¯ÖеÄÄ£°å½øÐÐÆ¥Å䣬Äõ½¾ä×Ó¶ÔÓ¦µÄÄ£°å + */ + String strPatt = queryClassify(abstr); + System.out.println("句子套用模版结果:"+strPatt); // nm ÖÆ×÷ µ¼ÑÝÁбí + + /** + * Ä£°å»¹Ô­³É¾ä×Ó£¬´ËʱÎÊÌâÒÑת»»ÎªÎÒÃÇÊìϤµÄ²Ù×÷ + */ + String finalPattern = queryExtenstion(strPatt); + System.out.println("原始句子替换成系统可识别的结果"+finalPattern);// µ«¶¡ÃÜÂë ÖÆ×÷ µ¼ÑÝÁбí + + ArrayList resultList = new ArrayList(); + resultList.add(String.valueOf(modelIndex)); + String[] finalPattArray = finalPattern.split(" "); + for(String word : finalPattArray) + resultList.add(word); + return resultList; + } + + public String queryAbstract(String querySentence) { + + // ¾ä×Ó³éÏó»¯ + Segment segment = HanLP.newSegment().enableCustomDictionary(true); + List terms = segment.seg(querySentence); + String abstractQuery = ""; + abstractMap = new HashMap(); + for (Term term : terms) { + String word = term.word; + String termStr = term.toString(); + System.out.println(termStr); + if (termStr.contains("nm")) { //nm 病 + abstractQuery += "nm "; + abstractMap.put("nm", word); + }else if (termStr.contains("nhm")) { //nhm 药 + abstractQuery += "nhm "; + abstractMap.put("nhm", word); + } + else { + abstractQuery += word + " "; + } + } + System.out.println("========HanLP·Ö´Ê½áÊø========"); + return abstractQuery; + } + + public String queryExtenstion(String queryPattern) { + // ¾ä×Ó»¹Ô­ + Set set = abstractMap.keySet(); + for(String key : set) { + /** + * Èç¹û¾ä×ÓÄ£°åÖк¬ÓгéÏóµÄ´ÊÐÔ + */ + if (queryPattern.contains(key)) { + /** + * ÔòÌæ»»³éÏó´ÊÐÔΪ¾ßÌåµÄÖµ + */ + String value = abstractMap.get(key); + queryPattern = queryPattern.replace(key, value); + } + } + String extendedQuery = queryPattern; + /** + * µ±Ç°¾ä×Ó´¦ÀíÍ꣬³éÏómapÇå¿ÕÊͷſռ䲢Öÿգ¬µÈ´ýÏÂÒ»¸ö¾ä×ӵĴ¦Àí + */ + abstractMap.clear(); + abstractMap = null; + return extendedQuery; + } + + + /** + * ¼ÓÔØ´Ê»ã±í == ¹Ø¼üÌØÕ÷ == ÓëHanLP·Ö´ÊºóµÄµ¥´Ê½øÐÐÆ¥Åä + * @return + */ + public Map loadVocabulary() { + Map vocabulary = new HashMap(); + File file = new File(rootDirPath + "question/vocabulary.txt"); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + String line; + try { + while ((line = br.readLine()) != null) { + + System.out.println(line); + String[] tokens = line.split(":"); + System.out.println(tokens[0]); + int index = Integer.parseInt(tokens[0]); + String word = tokens[1]; + vocabulary.put(word, index); + } + }catch (NumberFormatException e) { + e.printStackTrace(); + }catch (IOException e) { + e.printStackTrace(); + } + return vocabulary; + } + + /** + * ¼ÓÔØÎļþ£¬²¢¶ÁÈ¡ÄÚÈÝ·µ»Ø + * @param filename + * @return + * @throws IOException + */ + public String loadFile(String filename) throws IOException { + File file = new File(rootDirPath + filename); + BufferedReader br = new BufferedReader(new FileReader(file)); + String content = ""; + String line; + while ((line = br.readLine()) != null) { + /** + * Îı¾µÄ»»ÐзûÔݶ¨ÓÃ"`"´úÌæ + */ + content += line + "`"; + } + /** + * ¹Ø±Õ×ÊÔ´ + */ + br.close(); + return content; + } + + /** + * ¾ä×ӷִʺóÓë´Ê»ã±í½øÐÐkeyÆ¥Åäת»»ÎªdoubleÏòÁ¿Êý×é + * @param sentence + * @return + * @throws Exception + */ + public double[] sentenceToArrays(String sentence) throws Exception { + + double[] vector = new double[vocabulary.size()]; + /** + * Ä£°å¶ÔÕÕ´Ê»ã±íµÄ´óС½øÐгõʼ»¯£¬È«²¿Îª0.0 + */ + for(int i = 0; i < vocabulary.size(); i++) { + vector[i] = 0; + } + + /** + * HanLP·Ö´Ê£¬Ä÷ִʵĽá¹ûºÍ´Ê»ã±íÀïÃæµÄ¹Ø¼üÌØÕ÷½øÐÐÆ¥Åä + */ + Segment segment = HanLP.newSegment(); + List terms = segment.seg(sentence); + for(Term term : terms) { + String word = term.word; +// System.out.println(word); + /** + * Èç¹ûÃüÖУ¬0.0 ¸ÄΪ 1.0 + */ + if(vocabulary.containsKey(word)) { + int index = vocabulary.get(word); + vector[index] = 1; + } + } + + return vector; + } + + /** + * SparkÆÓËر´Ò¶Ë¹(naiveBayes) + * ¶ÔÌض¨µÄÄ£°å½øÐмÓÔز¢·ÖÀà + * ÓûÁ˽âSparkÆÓËر´Ò¶Ë¹£¬¿É²Î¿¼µØÖ·£ºhttps://blog.csdn.net/appleyk/article/details/80348912 + * @return + * @throws Exception + */ + public NaiveBayesModel loadClassifierModel() throws Exception { + + /** + * Éú³ÉSpark¶ÔÏó + * Ò»¡¢Spark³ÌÐòÊÇͨ¹ýSparkContext·¢²¼µ½Spark¼¯ÈºµÄ + * Spark³ÌÐòµÄÔËÐж¼ÊÇÔÚSparkContextΪºËÐĵĵ÷¶ÈÆ÷µÄÖ¸»ÓϽøÐÐµÄ + * Spark³ÌÐòµÄ½áÊøÊÇÒÔSparkContext½áÊø×÷Ϊ½áÊø + * JavaSparkContext¶ÔÏóÓÃÀ´´´½¨SparkµÄºËÐÄRDDµÄ + * ×¢Ò⣺µÚÒ»¸öRDD,Ò»¶¨ÊÇÓÉSparkContextÀ´´´½¨µÄ + * + * ¶þ¡¢SparkContextµÄÖ÷¹¹ÔìÆ÷²ÎÊýΪ SparkConf + * SparkConf±ØÐëÉèÖÃappnameºÍmaster£¬·ñÔò»á±¨´í + * spark.master ÓÃÓÚÉèÖò¿Êðģʽ + * local[*] == ±¾µØÔËÐÐģʽ[Ò²¿ÉÒÔÊǼ¯ÈºµÄÐÎʽ]£¬Èç¹ûÐèÒª¶à¸öÏß³ÌÖ´ÐУ¬¿ÉÒÔÉèÖÃΪlocal[2],±íʾ2¸öÏß³Ì £¬*±íʾ¶à¸ö + * spark.app.name ÓÃÓÚÖ¸¶¨Ó¦ÓõijÌÐòÃû³Æ == + */ + + SparkConf conf = new SparkConf().setAppName("NaiveBayesTest").setMaster("local[*]"); + JavaSparkContext sc = new JavaSparkContext(conf); + + /** + * ѵÁ·¼¯Éú³É + * labeled point ÊÇÒ»¸ö¾Ö²¿ÏòÁ¿£¬ÒªÃ´ÊÇÃܼ¯Ð͵ÄҪôÊÇÏ¡ÊèÐ굀 + * ÓÃÒ»¸ölabel/response½øÐйØÁª¡£ÔÚMLlibÀlabeled points ±»ÓÃÀ´¼à¶½Ñ§Ï°Ëã·¨ + * ÎÒÃÇʹÓÃÒ»¸ödoubleÊýÀ´´æ´¢Ò»¸ölabel£¬Òò´ËÎÒÃÇÄܹ»Ê¹ÓÃlabeled points½øÐлعéºÍ·ÖÀà + */ + List train_list = new LinkedList(); + String[] sentences = null; + + + /** + * ÌÇÄò²¡µÄÖÎÁÆ·½·¨ÊÇʲô + */ + String scoreQuestions = loadFile("question/therapeuticmethod.txt"); + sentences = scoreQuestions.split("`"); + for (String sentence : sentences) { + double[] array = sentenceToArrays(sentence); + LabeledPoint train_one = new LabeledPoint(0.0, Vectors.dense(array)); + train_list.add(train_one); + } + + /** + * ÌÇÄò²¡µÄÖ¢×´ÊÇʲô + */ + String timeQuestions = loadFile("question/Symptom.txt"); + sentences = timeQuestions.split("`"); + for (String sentence : sentences) { + double[] array = sentenceToArrays(sentence); + LabeledPoint train_one = new LabeledPoint(1.0, Vectors.dense(array)); + train_list.add(train_one); + } + + + /** + * Ò©µÄÓ÷¨ÊÇʲô + */ + String styleQuestions = loadFile("question/Operation.txt"); + sentences = styleQuestions.split("`"); + for (String sentence : sentences) { + double[] array = sentenceToArrays(sentence); + LabeledPoint train_one = new LabeledPoint(2.0, Vectors.dense(array)); + train_list.add(train_one); + } + + + /** + * Ò©µÄ×÷ÓÃÊÇʲô + */ + String storyQuestions = loadFile("question/Function.txt"); + sentences = storyQuestions.split("`"); + for (String sentence : sentences) { + double[] array = sentenceToArrays(sentence); + LabeledPoint train_one = new LabeledPoint(3.0, Vectors.dense(array)); + train_list.add(train_one); + } + + + /** + * SPARKµÄºËÐÄÊÇRDD(µ¯ÐÔ·Ö²¼Ê½Êý¾Ý¼¯) + * SparkÊÇScalaдµÄ,JavaRDD¾ÍÊÇSparkΪJavaдµÄÒ»Ì×API + * JavaSparkContext sc = new JavaSparkContext(sparkConf); //¶ÔÓ¦JavaRDD + * SparkContext sc = new SparkContext(sparkConf) ; //¶ÔÓ¦RDD + */ + JavaRDD trainingRDD = sc.parallelize(train_list); + NaiveBayesModel nb_model = NaiveBayes.train(trainingRDD.rdd()); + + /** + * ¼ÇµÃ¹Ø±Õ×ÊÔ´ + */ + sc.close(); + + /** + * ·µ»Ø±´Ò¶Ë¹·ÖÀàÆ÷ + */ + return nb_model; + + } + + /** + * ¼ÓÔØÎÊÌâÄ£°å == ·ÖÀàÆ÷±êÇ© + * @return + */ + public Map loadQuestionsPattern() { + Map questionsPattern = new HashMap(); + File file = new File(rootDirPath + "question/question_classification.txt"); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + String line; + try { + while ((line = br.readLine()) != null) { + String[] tokens = line.split(":"); + double index = Double.valueOf(tokens[0]); + String pattern = tokens[1]; + questionsPattern.put(index, pattern); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return questionsPattern; + } + + /** + * ±´Ò¶Ë¹·ÖÀàÆ÷·ÖÀàµÄ½á¹û£¬Äõ½Æ¥ÅäµÄ·ÖÀà±êÇ©ºÅ£¬²¢¸ù¾Ý±êÇ©ºÅ·µ»ØÎÊÌâµÄÄ£°å + * @param sentence + * @return + * @throws Exception + */ + public String queryClassify(String sentence) throws Exception { + System.out.print(sentence); + double[] testArray = sentenceToArrays(sentence); + for(int i=0;i{ + + @Query("MATCH (n:Disease) where n.name={name} return n") + List getDisease(@Param("name") String name); + +// List findByName(@Param("name") String name); +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/repository/Login_Register_Repository.java b/cmkg/src/main/java/com/cmkg/cmkg/repository/Login_Register_Repository.java new file mode 100644 index 0000000..23826d4 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/repository/Login_Register_Repository.java @@ -0,0 +1,10 @@ +package com.cmkg.cmkg.repository; + +import com.cmkg.cmkg.database.user; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface Login_Register_Repository extends CrudRepository { + +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/repository/MedicineRespository.java b/cmkg/src/main/java/com/cmkg/cmkg/repository/MedicineRespository.java new file mode 100644 index 0000000..854df9c --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/repository/MedicineRespository.java @@ -0,0 +1,15 @@ +package com.cmkg.cmkg.repository; + +import com.cmkg.cmkg.node.disease; +import com.cmkg.cmkg.node.medicine; +import org.springframework.data.neo4j.annotation.Query; +import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface MedicineRespository extends Neo4jRepository{ + + @Query("MATCH (n:Yangsheng) where n.name={name} return n") + List getMedicine(@Param("name") String name); +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/repository/QuestionRespository.java b/cmkg/src/main/java/com/cmkg/cmkg/repository/QuestionRespository.java new file mode 100644 index 0000000..e89ce9a --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/repository/QuestionRespository.java @@ -0,0 +1,70 @@ +package com.cmkg.cmkg.repository; + +import com.cmkg.cmkg.node.disease; +import org.springframework.data.neo4j.annotation.Query; +import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + + +@Repository +public interface QuestionRespository extends Neo4jRepository{ + + /** + * param疾病铭恒 + * + * return 返回疾病的id + */ + @Query("match(n:Disease) where n.name={name} return n.did") + public Long getDiseaseId(@Param("name") String name); + + /** + * param the name of medicine + * + * return the id of medicine + */ + @Query("match(n:Yangsheng) where n.name={name} return n.yid") + public Long getMedicineId(@Param("name") String name); + + /** + * 对应问题模板 nm(病症) 症状 + * + * param 疾病名称 + * + * return 返回疾病的症状 + */ + @Query("match(n:Disease) where n.name={name} return n.syptom") + public String getDiseaseSymptom(@Param("name") String name); + + /** + * 对应问题模板 nm 治疗方法 + * + * param nm 病症名称 + * + * return 对应的药 + */ + @Query("match (n)-[r:my]-(b) where n.name={name} return b.name limit 10") + public String[] getDiseaseToMedicine(@Param("name") String name); + + /** + * 对应模板问题 nnt 用法 + * + * param nnt 药品或养生方法名称 + * + * return 药品用法 + */ + @Query("match(n:Yangsheng) where n.name={name} return n.operation") + public String getMedicineOperation(@Param("name") String name); + + /** + * 对应模板问题 nnt 作用 + * + * param nnt 药品或养生方法名称 + * + * return 药品作用 + */ + + @Query("match(n:Yangsheng) where n.name={name} return n.symptom") + public String getMedicineSyndromes(@Param("name") String name); + +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/repository/info b/cmkg/src/main/java/com/cmkg/cmkg/repository/info new file mode 100644 index 0000000..bf64fff --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/repository/info @@ -0,0 +1 @@ +操作数据库的接口 \ No newline at end of file diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/QuestionService.java b/cmkg/src/main/java/com/cmkg/cmkg/server/QuestionService.java new file mode 100644 index 0000000..03de034 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/QuestionService.java @@ -0,0 +1,6 @@ +package com.cmkg.cmkg.server; + +public interface QuestionService { + public ReturnData answer(String question) throws Exception; + void showDictPat(); +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnD/funcDisea.java b/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnD/funcDisea.java new file mode 100644 index 0000000..54c7b9b --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnD/funcDisea.java @@ -0,0 +1,23 @@ +package com.cmkg.cmkg.server.ReturnD; + +public class funcDisea { + private String[] disease; + private String function; + + public funcDisea(){} + public String[] getDisease() { + return disease; + } + + public String getFunction() { + return function; + } + + public void setDisease(String[] disease) { + this.disease = disease; + } + + public void setFunction(String function) { + this.function = function; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnData.java b/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnData.java new file mode 100644 index 0000000..534556e --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/ReturnData.java @@ -0,0 +1,40 @@ +package com.cmkg.cmkg.server; + +public class ReturnData { + public Integer code; + public String msg; + public Object data; + + public Integer getCode() { + return code; + } + + public String getMsg() { + return msg; + } + + public Object getData() { + return data; + } + + public void setCode(Integer code) { + this.code = code; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public void setData(Object data) { + this.data = data; + } + + @Override + public String toString() { + return "ReturnData{" + + "code:" + code + + ", msg:'" + msg + '\'' + + ", data:" + data + + '}'; + } +} diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/impl/QuestionServiceImpl.java b/cmkg/src/main/java/com/cmkg/cmkg/server/impl/QuestionServiceImpl.java new file mode 100644 index 0000000..b0de547 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/impl/QuestionServiceImpl.java @@ -0,0 +1,224 @@ +package com.cmkg.cmkg.server.impl; + +import com.cmkg.cmkg.Util.CodeMessage; +import com.cmkg.cmkg.process.ModelProcess; +import com.cmkg.cmkg.repository.QuestionRespository; +import com.cmkg.cmkg.server.QuestionService; +import com.cmkg.cmkg.server.ReturnD.funcDisea; +import com.cmkg.cmkg.server.ReturnData; +import com.hankcs.hanlp.dictionary.CustomDictionary; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.io.*; +import java.util.ArrayList; + + +@Service +@Primary +public class QuestionServiceImpl implements QuestionService { + + @Value("${rootDirPath}") //路径名需要更改 + private String rootDictPath; + + @Value("${HanLP.CustomDictionary.path.disease}") + private String diseasePath; + + @Value("${HanLP.CustomDictionary.path.medicine}") + private String medicinePath; + + @Autowired + private QuestionRespository questionRepository; + + + + @Override + public ReturnData answer(String question) throws Exception { + + ModelProcess queryProcess = new ModelProcess(rootDictPath); + + /** + * 加载自定义的病症字典 == 设置词性 nm 0 + */ + + loadDisease(diseasePath); + + /** + * 加载自定义的药品字典 == 设置词性 nhm 0 + */ + loadMedicine(medicinePath); + + ArrayList reStrings = queryProcess.analyQuery(question); + for(String sss:reStrings) System.out.println(sss); + int modelIndex = Integer.valueOf(reStrings.get(0)); + ReturnData answer = new ReturnData(); + String title = ""; + /** + * 匹配问题模板 + */ + switch (modelIndex) { + case 0: + /** + * nm 治疗方法 == 病的治疗方法 + */ + title = reStrings.get(1); + System.out.println(title); + String[] measure = questionRepository.getDiseaseToMedicine(title); + + if (measure.length==0) { + answer.setCode(CodeMessage.NoMessage); + answer.setMsg("暂时没有找到的消息"); + answer.setData(""); + } else { + answer.setCode(CodeMessage.DiseaseToMedicine); + answer.setMsg(title); + answer.setData(measure); + } + break; + case 1: + /** + * nm 症状 == 病的症状 + */ + title = reStrings.get(1); + String symptom = questionRepository.getDiseaseSymptom(title); + System.out.println(symptom); + if (symptom != null) { + answer.setCode(CodeMessage.DiseaseToSymptom); + answer.setMsg(title); + answer.setData(symptom); + } else { + answer.setCode(CodeMessage.NoMessage); + answer.setMsg("暂时没有找到的消息"); + answer.setData(""); + } + break; + case 2: + /** + * nhm 用法 == 药品用法 + */ + title = reStrings.get(1); + String use = questionRepository.getMedicineOperation(title); + System.out.println(use); + if (use != null) { + answer.setCode(CodeMessage.MedicineToOperation); + answer.setMsg(title); + answer.setData(use); + } else { + answer.setCode(CodeMessage.NoMessage); + answer.setMsg("暂时没有找到的消息"); + answer.setData(""); + } + break; + case 3: + /** + * nhm 作用 == 药品作用 + */ + title = reStrings.get(1); + funcDisea funcDisea = new funcDisea(); + String function= questionRepository.getMedicineSyndromes(title); + String[] disease = questionRepository.getDiseaseToMedicine(title); + + System.out.println(function); + if (function != null) { + answer.setCode(CodeMessage.MedicineToSymptom); + answer.setMsg(title); + funcDisea.setDisease(disease); + funcDisea.setFunction(function); + + + answer.setData(funcDisea); + } else { + answer.setCode(CodeMessage.NoMessage); + answer.setMsg("暂时没有找到的消息"); + answer.setData(""); + } + break; + + } + + System.out.println(answer); + return answer; + } + + @Override + public void showDictPat() { + System.out.println("HanLP分词字典及自定义问题模板根目录:" + rootDictPath); + System.out.println("用户自定义扩展词库【病症名】:" + diseasePath); + } + + /** + * 加载自定义病症字典 + * + * @param path + */ + public void loadDisease(String path) { + + File file = new File(path); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + addCustomDictionary(br, 0); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + + } + + /** + * 加载自定义药品类别字典 + * + * @param path + */ + public void loadMedicine(String path) { + + File file = new File(path); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + addCustomDictionary(br, 1); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + } + + + /** + * 添加自定义分词及其词性,注意数字0表示频率,不能没有 + * + * @param br + * @param type + */ + public void addCustomDictionary(BufferedReader br, int type) { + + String word; + try { + while ((word = br.readLine()) != null) { + switch (type) { + /** + * 设置病症名词词性 == nm 0 + */ + case 0: + CustomDictionary.add(word, "nm 0"); + break; + /** + * 设置药品名词词性 == nhm 0 + */ + case 1: + CustomDictionary.add(word, "nhm 0"); + break; + default: + break; + } + } + br.close(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/impl/info b/cmkg/src/main/java/com/cmkg/cmkg/server/impl/info new file mode 100644 index 0000000..9f74ab9 --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/impl/info @@ -0,0 +1 @@ +由server \ No newline at end of file diff --git a/cmkg/src/main/java/com/cmkg/cmkg/server/info b/cmkg/src/main/java/com/cmkg/cmkg/server/info new file mode 100644 index 0000000..832127a --- /dev/null +++ b/cmkg/src/main/java/com/cmkg/cmkg/server/info @@ -0,0 +1 @@ +服务层,由控制器Controller调用 \ No newline at end of file diff --git a/cmkg/src/main/resources/Dockerfile b/cmkg/src/main/resources/Dockerfile new file mode 100644 index 0000000..50de95c --- /dev/null +++ b/cmkg/src/main/resources/Dockerfile @@ -0,0 +1,4 @@ +FROM java:8 +VOLUME /tmp +ADD cmkg.jar cmkg.jar +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/cmkg.jar"] \ No newline at end of file diff --git a/cmkg/src/main/resources/application.properties b/cmkg/src/main/resources/application.properties new file mode 100644 index 0000000..bee4e3d --- /dev/null +++ b/cmkg/src/main/resources/application.properties @@ -0,0 +1,12 @@ +spring.data.neo4j.username=neo4j +spring.data.neo4j.password=chinesemedicine +spring.data.neo4j.uri=bolt://114.116.199.154:5003 +rootDirPath=/Users/ongbo/Downloads/Hanlp/data/ +HanLP.CustomDictionary.path.disease=${rootDirPath}dictionary/custom/disease.txt +HanLP.CustomDictionary.path.medicine=${rootDirPath}dictionary/custom/medicine.txt + +spring.datasource.url=jdbc:mysql://114.116.199.154:5005/cmkg +spring.datasource.username=root +spring.datasource.password=chinesemedicine +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + diff --git a/cmkg/src/test/java/com/cmkg/cmkg/ape.java b/cmkg/src/test/java/com/cmkg/cmkg/ape.java new file mode 100644 index 0000000..3055a84 --- /dev/null +++ b/cmkg/src/test/java/com/cmkg/cmkg/ape.java @@ -0,0 +1,103 @@ +package com.cmkg.cmkg; + +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.mllib.classification.NaiveBayes; +import org.apache.spark.mllib.classification.NaiveBayesModel; +import org.apache.spark.mllib.linalg.Vector; +import org.apache.spark.mllib.linalg.Vectors; +import org.apache.spark.mllib.regression.LabeledPoint; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class ape { + @Test + public void s(){ + + SparkConf conf = new SparkConf().setAppName("NaiveBayesTest").setMaster("local[*]"); + JavaSparkContext sc = new JavaSparkContext(conf); + + + /** + * MLlib的本地向量主要分为两种,DenseVector和SparseVector + * 前者是用来保存稠密向量,后者是用来保存稀疏向量 + */ + + /** + * 两种方式分别创建向量 == 其实创建稀疏向量的方式有两种,本文只讲一种 + * (1.0, 0.0, 1.0, 0.0, 1.0, 0.0) + * (1.0, 1.0, 1.0, 1.0, 0.0, 1.0) + */ + + //稠密向量 == 连续的 + Vector vMale = Vectors.dense(1,0,1,0,1,0); + + + //稀疏向量 == 间隔的、指定的,未指定位置的向量值默认 = 0.0 + int len = 6; + int[] index = new int[]{0,1,2,3,5}; + double[] values = new double[]{1,1,1,1,1}; + //索引0、1、2、3、5位置上的向量值=1,索引4没给出,默认0 + Vector vFemale = Vectors.sparse(len, index, values); + //System.err.println("vFemale == "+vFemale); + /** + * labeled point 是一个局部向量,要么是密集型的要么是稀疏型的 + * 用一个label/response进行关联 + * 在MLlib里,labeled points 被用来监督学习算法 + * 我们使用一个double数来存储一个label,因此我们能够使用labeled points进行回归和分类 + * 在二进制分类里,一个label可以是 0(负数)或者 1(正数) + * 在多级分类中,labels可以是class的索引,从0开始:0,1,2,...... + */ + + //训练集生成 ,规定数据结构为LabeledPoint == 构建方式:稠密向量模式 ,1.0:类别编号 == 男性 + LabeledPoint train_one = new LabeledPoint(1.0,vMale); //(1.0, 0.0, 1.0, 0.0, 1.0, 0.0) + //训练集生成 ,规定数据结构为LabeledPoint == 构建方式:稀疏向量模式 ,2.0:类别编号 == 女性 + LabeledPoint train_two = new LabeledPoint(2.0,vFemale); //(1.0, 1.0, 1.0, 1.0, 0.0, 1.0) + //我们也可以给同一个类别增加多个训练集 + LabeledPoint train_three = new LabeledPoint(2.0,Vectors.dense(0,1,1,1,0,1)); + + //List存放训练集【三个训练样本数据】 + List trains = new ArrayList<>(); + trains.add(train_one); + trains.add(train_two); + trains.add(train_three); + + /** + * SPARK的核心是RDD(弹性分布式数据集) + * Spark是Scala写的,JavaRDD就是Spark为Java写的一套API + * JavaSparkContext sc = new JavaSparkContext(sparkConf); //对应JavaRDD + * SparkContext sc = new SparkContext(sparkConf) ; //对应RDD + * 数据类型为LabeledPoint + */ + JavaRDD trainingRDD = sc.parallelize(trains); + + /** + * 利用Spark进行数据分析时,数据一般要转化为RDD + * JavaRDD转Spark的RDD + */ + NaiveBayesModel nb_model = NaiveBayes.train(trainingRDD.rdd()); + + //测试集生成 == 以下的向量表示,这个人具有特征:短发(1),运动鞋(3) + double [] dTest = {1,0,1,0,0,0}; + Vector vTest = Vectors.dense(dTest);//测试对象为单个vector,或者是RDD化后的vector + + //朴素贝叶斯用法 + int modelIndex =(int) nb_model.predict(vTest); + System.out.println("标签分类编号:"+modelIndex);// 分类结果 == 返回分类的标签值 + /** + * 计算测试目标向量与训练样本数据集里面对应的各个分类标签匹配的概率结果 + */ + System.out.println(nb_model.predictProbabilities(vTest)); + if(modelIndex == 1){ + System.out.println("答案:贝叶斯分类器推断这个人的性别是男性"); + }else if(modelIndex == 2){ + System.out.println("答案:贝叶斯分类器推断这个人的性别是女性"); + } + //最后不要忘了释放资源 + sc.close(); + + } +} diff --git a/cmkg/src/test/java/com/cmkg/cmkg/hanlp.java b/cmkg/src/test/java/com/cmkg/cmkg/hanlp.java new file mode 100644 index 0000000..1af4eed --- /dev/null +++ b/cmkg/src/test/java/com/cmkg/cmkg/hanlp.java @@ -0,0 +1,61 @@ +package com.cmkg.cmkg; + +import com.hankcs.hanlp.HanLP; +import com.hankcs.hanlp.seg.Segment; +import com.hankcs.hanlp.seg.common.Term; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class hanlp { + @Test +// 句子抽象化 + public void analyAbstract(){ + String test = "但丁密码的评分是多少"; + Segment segment = HanLP.newSegment().enableCustomDictionary(true); + List terms = segment.seg(test); + System.out.println(terms); + + + + + String abstractQuery = ""; + Map abstractMap = new HashMap(); + int nrCount = 0; //nr 人名词性这个 词语出现的频率 + for (Term term : terms) { + String word = term.word; + String termStr = term.toString(); + + System.out.println(termStr); + if (termStr.contains("nm")) { //nm 电影名 + abstractQuery += "nm "; + abstractMap.put("nm", word); + } else if (termStr.contains("nr") && nrCount == 0) { //nr 人名 + abstractQuery += "nnt "; + abstractMap.put("nnt", word); + nrCount++; + }else if (termStr.contains("nr") && nrCount == 1) { //nr 人名 再出现一次,改成nnr + abstractQuery += "nnr "; + abstractMap.put("nnr", word); + nrCount++; + }else if (termStr.contains("x")) { //x 评分 + abstractQuery += "x "; + abstractMap.put("x", word); + } else if (termStr.contains("ng")) { //ng 类型 + abstractQuery += "ng "; + abstractMap.put("ng", word); + } + else { + abstractQuery += word + " "; + } + } + System.out.println("========HanLP分词结束========"); + System.out.println(abstractMap); + System.out.println(abstractQuery); + + } + + +}