相似度计算

master
hujunbo 3 years ago
parent 4052fbfdc0
commit 5f9156ff4d

1
.gitignore vendored

@ -33,6 +33,7 @@ nbproject/private/
build/* build/*
nbbuild/ nbbuild/
dist/ dist/
dist.zip
nbdist/ nbdist/
.nb-gradle/ .nb-gradle/

@ -35,6 +35,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId> <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>

@ -4,6 +4,7 @@ import com.ruoyi.biemo.business.domain.Report;
import com.ruoyi.biemo.business.service.ReportService; import com.ruoyi.biemo.business.service.ReportService;
import com.ruoyi.biemo.core.page.Page; import com.ruoyi.biemo.core.page.Page;
import com.ruoyi.biemo.core.page.PageFactory; import com.ruoyi.biemo.core.page.PageFactory;
import com.ruoyi.biemo.nlp.WordVectorModelUtils;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
@ -95,4 +96,10 @@ public class ReportController
return AjaxResult.success("查询成功",reportService.ticket2token(ticket)); return AjaxResult.success("查询成功",reportService.ticket2token(ticket));
} }
@PostMapping("/similar")
public AjaxResult similar(String text1,String text2){
return AjaxResult.success(WordVectorModelUtils.similarCount(text1,text2));
}
} }

@ -0,0 +1,59 @@
package com.ruoyi.biemo.nlp;
import com.hankcs.hanlp.corpus.io.IOUtil;
import com.hankcs.hanlp.mining.word2vec.DocVectorModel;
import com.hankcs.hanlp.mining.word2vec.Word2VecTrainer;
import com.hankcs.hanlp.mining.word2vec.WordVectorModel;
import com.ruoyi.biemo.utils.TestUtility;
import java.io.IOException;
/**
*
*/
public class WordVectorModelUtils {
private static final String TRAIN_FILE_NAME = TestUtility.ensureTestData("搜狗文本分类语料库已分词.txt", "http://hanlp.linrunsoft.com/release/corpus/sogou-mini-segmented.zip");
private static final String MODEL_FILE_NAME = "data/test/word2vec.txt";
//相似度计算
public static Float similarCount(String text1,String text2) {
WordVectorModel wordVectorModel = null;
try {
wordVectorModel = trainOrLoadModel();
DocVectorModel docVectorModel = new DocVectorModel(wordVectorModel);
return docVectorModel.similarity(text1, text2);
} catch (IOException ioException) {
ioException.printStackTrace();
return null;
}
}
public static void main(String[] args) throws Exception{
System.out.println(similarCount("沙尔克 VS 斯图加特 初盘 主队 水位 偏高 目前 斯图加特 客场 路有 反弹 迹象 排除 客队 可能 ","沃尔夫斯堡 VS 凯泽斯劳滕 一线 战役 庄家 开出 较高 平局 赔率 想必 有望 分出 胜负"));
}
static WordVectorModel trainOrLoadModel() throws IOException
{
if (!IOUtil.isFileExisted(MODEL_FILE_NAME))
{
if (!IOUtil.isFileExisted(TRAIN_FILE_NAME))
{
System.err.println("语料不存在请阅读文档了解语料获取与格式https://github.com/hankcs/HanLP/wiki/word2vec");
System.exit(1);
}
Word2VecTrainer trainerBuilder = new Word2VecTrainer();
return trainerBuilder.train(TRAIN_FILE_NAME, MODEL_FILE_NAME);
}
return loadModel();
}
static WordVectorModel loadModel() throws IOException
{
return new WordVectorModel(MODEL_FILE_NAME);
}
}

@ -42,3 +42,13 @@ export function delReport(id) {
method: 'delete' method: 'delete'
}) })
} }
// 相似度计算
export function similar(query) {
return request({
url: '/makesoft/report/similar',
method: 'post',
params: query
})
}

@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" > <el-form :model="queryParams" :rules="rules" ref="queryForm" size="small" :inline="true" v-show="showSearch" >
<el-form-item label="标题" prop="title"> <el-form-item label="标题" prop="title">
<el-input <el-input
v-model="queryParams.title" v-model="queryParams.title"

@ -0,0 +1,74 @@
<template>
<el-form :model="queryParams" :rules="rules" ref="queryForm">
<el-form-item prop="text1">
<el-input
type="textarea"
:autosize="{ minRows: 10, maxRows: 20}"
placeholder="请输入文本"
v-model="queryParams.text1">
</el-input>
</el-form-item>
<div style="margin: 20px 0;"></div>
<el-form-item prop="text2">
<el-input
type="textarea"
:autosize="{ minRows: 10, maxRows: 20}"
placeholder="请输入文本"
v-model="queryParams.text2">
</el-input>
</el-form-item>
<el-form-item style="text-align: center;margin-left:-100px;margin-top:10px;">
<el-button type="primary" @click="submitForm('queryForm')"></el-button>
<el-button @click="resetForm('queryForm')"></el-button>
</el-form-item>
</el-form>
</template>
<script>
import {similar} from "@/api/biemo/report"
import { Loading } from 'element-ui';
export default {
data() {
return {
result:null,
queryParams:{
text1: '',
text2: ''
},
rules: {
text1: [
{required: true, message: '请输入文本1', trigger: 'blur'}
],
text2: [
{required: true, message: '请输入文本2', trigger: 'blur'}
],
}
}
},
methods:{
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.$modal.loading("正在拼命计算中,请稍候!");
similar(this.queryParams).then(response =>{
this.$modal.closeLoading();
if(response.data){
alert("相似度计算值:"+response.data);
}
}).catch(()=>{
alert("计算出错了!");
})
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>
Loading…
Cancel
Save