电影知识图谱的智能问答系统在本机跑通实验及遇到问题的解决

**本文是一份大作业,目的是跑通博主appleyk的基于电影知识图谱的智能问答系统,相关信息可以去

https://blog.csdn.net/Appleyk/article/details/80422055?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

处查看**
1, Neo4j的相关操作
Neo4j在处理节点(对象)关系这方面性能比较棒,而且查询语句简单,更容易构建我们的电影知识图谱,本系列实验中,参考博主采用neo4j来构建项目,所以我们自然需要安装Neo4j来储存对对象的数据处理。
首先,我们需要下载Neo4j的安装包,由于从官网下载速度太慢,我们选择了网上国内的资源,下载的版本位3.5.5。
下载后解压到任意文件夹,下面是本次作业中我的Neo4j的安装路径:E:\neo4j-community-3.5.5
之后我们需要将Neo4j的环境变量配置好:
编辑完路径后,测试一下是否安装成功:

	安装成功后我们就可以将准备好了CSV数据文件导入到Neo4j中:


	如图我们已经成功地将数据导入Neo4j的默认路径了,下面需要将数据导入Neo4j中:

找到neo4j的安装路径,并在D:\neo4j-community-3.4.0\目录下创建import目录
完整路径如下D:\neo4j-community-3.4.0\import
因为neo4j支持导入csv文件,其默认目录入口是 …\import

//导入节点 电影类型 == 注意类型转换
LOAD CSV WITH HEADERS FROM “file:///genre.csv” AS line
MERGE (p:Genre{gid:toInteger(line.gid),name:line.gname})

//导入节点 演员信息
LOAD CSV WITH HEADERS FROM ‘file:///person.csv’ AS line
MERGE (p:Person { pid:toInteger(line.pid),birth:line.birth,
death:line.death,name:line.name,
biography:line.biography,
birthplace:line.birthplace})

// 导入节点 电影信息
LOAD CSV WITH HEADERS FROM “file:///movie.csv” AS line
MERGE (p:Movie{mid:toInteger(line.mid),title:line.title,introduction:line.introduction,
rating:toFloat(line.rating),releasedate:line.releasedate})

// 导入关系 actedin 电影是谁参演的 1对多
LOAD CSV WITH HEADERS FROM “file:///person_to_movie.csv” AS line
match (from:Person{pid:toInteger(line.pid)}),(to:Movie{mid:toInteger(line.mid)})
merge (from)-[r:actedin{pid:toInteger(line.pid),mid:toInteger(line.mid)}]->(to)

//导入关系 电影是什么类型 == 1对多
LOAD CSV WITH HEADERS FROM “file:///movie_to_genre.csv” AS line
match (from:Movie{mid:toInteger(line.mid)}),(to:Genre{gid:toInteger(line.gid)})
merge (from)-[r:is{mid:toInteger(line.mid),gid:toInteger(line.gid)}]->(to)

导入完成后:

测试一下:match (n)-[r:actedin]-(b) return n,r,b limit 10

2, Spark环境搭建
步骤如下:
====第一步:安装Java1.8 JDK,配置JAVA_HOME环境变量

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-netbeans-jsp-142931.html

JAVA_HOME = D:\java
path = …;%JAVA_HOME%\bin;

====第二步:安装Scala环境【Spark依赖于scala语言环境】

选择tools目录下的scala-2.10.5.msi【windows下可执行安装】

注意:安装的目录名一定不能带空格,可以再D盘下创建安装根目录D:\scala

安装完成后配置 scala环境变量

SCALA_HOME = D:\scala
path = …;%SCALA_HOME%\bin;

===第三步:配置hadoop环境

选择tools目录下的hadoop-3.0.1.tar.gz,解压,并重命名目录,最终路径形式为

D:\hadoop

解压完成后,配置hadoop系统环境变量

HADOOP_HOME=D:\hadoop
path=…;%HADOOP_HOME%\bin;

hadoop这里需要注意一个地方,需要将tools目录下的winutils.exe文件拷贝到hadoop的bin目录下

如果没有这个否则会出现 java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

拷贝后,在D盘新建一个二级目录 D:\tmp\hive

然后cmd切换到D:\hadoop\bin\目录下,并执行
D:\hadoop\bin>winutils.exe chmod 777 D:/tmp/hive == 赋权限

===第四步:安装spark并配置环境变量
选择tools目录下的spark-2.3.0-bin-hadoop2.6.tgz,解压,并重命名目录,最终路径形式为

D:\spark

然后和上面雷同,配置spark环境变量

随后任意目录cmd执行 spark-shell,即可验证spark环境是否搭建成功。

3, Hanlp环境搭建
下载hanlp的各种东西
方法1.maven方法,下载一个0配置即可。【但是我不太会用】
方法2:先下载hanlp-1.2.8.jar这个jar包
http://hanlp.linrunsoft.com/services.html
再下载data.zip这个数据包,可以选择,选择下载标准数据or迷你数据or全部数据。大小不同。我下的是标准版的。40M
再下载hanlp.properties这个是一个以properties结尾的一个文件,我之前从来没见过,不过可以用txt打开。
第四步:把下载的这些东西导入到eclipse里面去。构建路径
1.把jar包导入到eclipse的lib目录下
http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html
2.自己在src里面创建一个包,在包里面创建一个类。包会在我设置的根目录D:/下面,类名称首字母必须大写?【貌似不大写的话,会被否决】
3.把data包解压,然后放在一个自己喜欢的路径【我的路径是D://py/】然后,在hanlp.properties这个文件里,把root修改为data存放的上一级目录。
4.把hanlp.properties拖动到src这个目录下。
这里我们用的是idea里面的maven,所以基本不用手动导入

它会自动导入你需要的包,非常实用,方便。
但这里需要注意的是,hanlp的词库需要你自己放到本机的正确位置,并且将需要的自定义词库放进去。

上图的红框内就是需要的自定义词库。

4, 项目运行
做完这些其实你为项目进行的环境配置已经足够了,那么我们可以在博主给的github上下载我们的智能问答系统运行一下。

有了上图SPRING的标志就代表着我们的项目正常运行了。
在运行之前还需要将之前配置的Neo4j启动

还需要在idea中将tomcat配置好,因为我们的前端是在web服务器上来进行的。

接下来就可以区localhost:8080看一下我们的项目是否运行成功:

可以看到我们的项目已经跑起来了。

5, 算法原理理解:
那么正常的跑起来项目我们已经做到了,但是更重要的是我们要理解这个问答系统的算法原理。
其中最重要的一点就是我们需要理解机器是如何识别我们的问题,并且分类理解我们的问题如何解答呢?
事实上为了实现上面这点,在这个项目中运用的是Hanlp+朴素贝叶斯分类器来进行机器学习,用部分数据训练,这样机器就可以识别我们的问题到底属于哪一类。
Hanlp分词就用hanlp自带的方法,这里我们编译一个小的测试范例来熟悉一下hanlp的工作原理。
下面附上理解hanlp的测试代码,并附上注释:
import java.util.ArrayList;
import java.util.List;

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.Test;

import com.appleyk.process.ModelProcess;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.CustomDictionary;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;

public class HanLPTest {

@Test
public void TestA(){
String lineStr = “明天虽然会下雨,但是我还是会看周杰伦的演唱会。”;
try{
Segment segment = HanLP.newSegment();
segment.enableCustomDictionary(true);
/**
* 自定义分词+词性
*/
CustomDictionary.add(“虽然会”,“ng 0”);
List seg = segment.seg(lineStr);
for (Term term : seg) {
System.out.println(term.toString());
}
}catch(Exception ex){
System.out.println(ex.getClass()+","+ex.getMessage());
}
}
@Test
public void TestB(){
HanLP.Config.Normalization = true;
CustomDictionary.insert(“爱听4G”, “nz 1000”);
System.out.println(HanLP.segment(“爱听4g”));
System.out.println(HanLP.segment(“爱听4G”));
System.out.println(HanLP.segment(“爱听4G”));
System.out.println(HanLP.segment(“爱听4G”));
System.out.prin

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值