Java 人工智能
Java人工智能学习目标:
理解人工智能、机器学习、深度学习的关系
理解智能分类的执行流程
掌握IK分词器的使用
掌握Word2vec的使用
能够使用卷积神经网络模型CNN
能够使用卷积神经网络模型CNN
完成十次方-智能分类的功能
人工智能与机器学习谈谈人工智能人工智能(Artificialintelligence),英文缩写为AI
研究,开发用于模拟,延伸和扩展人的智能的理论,方法,技术及应用系统的一门新的技术科学
人工智能是计算机科学的一个分支,企图了解智能的实质,并生产出一种新的能力以人类智能相似的方式做出反应的智能机器
该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等
人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”
人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能
人工智能热门方向人工智能的三次浪潮1956ArtificialIntelligence提出1950-1970符号主义流派:专家系统占主导地位1950:图灵设计国际象棋程序1962:IBM的跳棋程序战胜人类高手(人工智能第一次浪潮)1980-2000统计主义流派:主要用统计模型解决问题1993:SVM模型1997:IBM深蓝战胜象棋选手卡斯帕罗夫(人工智能第二次浪潮)2010-至今神经网络、深度学习、大数据流派2006DNN(深度神经网络)2016:GoogleAlphaGO战胜围棋选手李世石(人工智能第三次浪潮)机器学习什么是机器学习机器学习,它正是这样一门学科,它致力于研究如何通过计算(CPU和GPU计算)的手段,利用经验来改善(计算机)系统自身的性能它是人工智能的核心,是使计算机具有智能的根本途径,应用遍及人工智能各领域数据+机器学习算法=机器学习模型人工智能、机器学习、深度学习的关系机器学习是人工智能的一个分支,深度学习是实现机器学习的一种技术智能分类智能分类的执行流程IK分词器IK分词器简介
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包从2006年12月推出1.0版开始,IKAnalyzer已经推出了4个大版本最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化快速入门创建工程引入依赖
com.janeluoikanalyzer2012_u6编写代码
importorg.wltea.analyzer.core.IKSegmenter;importorg.wltea.analyzer.core.Lexeme;importjava.io.IOException;importjava.io.StringReader;publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{Stringtext="基于java语言开发的轻量级的中文分词工具包";StringReadersr=newStringReader(text);IKSegmenterik=newIKSegmenter(sr,true);Lexemelex=null;while((lex=ik.next())!=null){System.out.print(lex.getLexemeText()+"");}}}IKSegmenter的第一个构造参数为StringReader类型。StringReader是装饰Reader的类,其用法是读取一个String字符串
IKSegmenter的第二个构造参数userSmart为切分粒度true表示最大切分false表示最细切分
Lexeme:词单位类
构建分词语料库在CSDN抓取文章,以分词形式保存,词之间用空格分隔引入依赖
com.janeluoikanalyzer2012_u6创建分词工具类
packageutil;importorg.wltea.analyzer.core.IKSegmenter;importorg.wltea.analyzer.core.Lexeme;importjava.io.IOException;importjava.io.StringReader;/***分词工具类*/publicclassIKUtil{/***根据文本返回分词后的文本*@paramcontent*@return*/publicstaticStringsplit(Stringcontent,StringsplitChar)throwsIOException{StringReadersr=newStringReader(content);IKSegmenterik=newIKSegmenter(sr,true);Lexemelex=null;StringBuildersb=newStringBuilder("");while((lex=ik.next())!=null){sb.append(lex.getLexemeText()+splitChar);//拼接}returnsb.toString();}}创建HTML工具类,将文本中html标签剔除
packageutil;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***html标签处理工具类*/publicclassHTMLUtil{publicstaticStringdelHTMLTag(StringhtmlStr){StringregEx_script="]*?>[\s\S]*?";//定义script的正则表达式StringregEx_style="]*?>[\s\S]*?";//定义style的正则表达式StringregEx_html="]+>";//定义HTML标签的正则表达式Patternp_script=Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);Matcherm_script=p_script.matcher(htmlStr);htmlStr=m_script.replaceAll("");//过滤script标签Patternp_style=Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);Matcherm_style=p_style.matcher(htmlStr);htmlStr=m_style.replaceAll("");//过滤style标签Patternp_html=Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);Matcherm_html=p_html.matcher(htmlStr);htmlStr=m_html.replaceAll("");//过滤html标签returnhtmlStr.trim();//返回文本字符串}}创建ArticleTxtPipeline,爬取的内容存入文本文件
packagecom.tensquare.crawler.pipeline;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importorg.springframework.stereotype.Repository;importus.codecraft.webmagic.ResultItems;importus.codecraft.webmagic.Task;importus.codecraft.webmagic.pipeline.Pipeline;importutil.HTMLUtil;importutil.IKUtil;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Map;importjava.util.UUID;/***入库类(分词后保存为txt)*/@ComponentpublicclassArticleTxtPipelineimplementsPipeline{@Value("${ai.dataPath}")privateStringdataPath;privateStringchannelId;//频道IDpublicvoidsetChannelId(StringchannelId){this.channelId=channelId;}@Overridepublicvoidprocess(ResultItemsresultItems,Tasktask){Stringtitle=resultItems.get("title");//获取标题Stringcontent=HTMLUtil.delHTMLTag(resultItems.get("content"));//获取正文并删除html标签try{//将标题+正文分词后保存到相应的文件夹PrintWriterprintWriter=newPrintWriter(newFile(dataPath+"/"+channelId+"/"+UUID.randomUUID()+".txt"));printWriter.print(IKUtil.split(title+""+content,""));printWriter.close();}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}配置文件application.yml中添加配置
ai:#语料库目录dataPath:E:\article修改ArticleTask类,新增爬取db和web任务
importcom.tensquare.crawler.pipeline.ArticleTxtPipeline;importcom.tensquare.crawler.processor.ArticleProcessor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importus.codecraft.webmagic.Spider;importus.codecraft.webmagic.scheduler.RedisScheduler;/***文章任务类*/@ComponentpublicclassArticleTask{//@Autowired//privateArticlePipelinearticlePipeline;@AutowiredprivateArticleTxtPipelinearticleTxtPipeline;@AutowiredprivateRedisSchedulerredisScheduler;/***爬取ai数据*/@Scheduled(cron="03810**?")publicvoidaiTask(){System.out.println("爬取AI文章");Spiderspider=Spider.create(newArticleProcessor());spider.addUrl("https://blog.csdn.net/nav/ai");articleTxtPipeline.setChannelId("ai");spider.addPipeline(articleTxtPipeline);spider.setScheduler(redisScheduler);spider.start();spider.stop();}/***爬取db数据*/@Scheduled(cron="201711**?")publicvoiddbTask(){System.out.println("爬取DB文章");Spiderspider=Spider.create(newArticleProcessor());spider.addUrl("https://blog.csdn.net/nav/db");articleTxtPipeline.setChannelId("db");spider.addPipeline(articleTxtPipeline);spider.setScheduler(redisScheduler);spider.start();spider.stop();}/***爬取web数据*/@Scheduled(cron="202711**?")publicvoidwebTask(){System.out.println("爬取WEB文章");Spiderspider=Spider.create(newArticleProcessor());spider.addUrl("https://blog.csdn.net/nav/web");articleTxtPipeline.setChannelId("web");spider.addPipeline(articleTxtPipeline);spider.setScheduler(redisScheduler);spider.start();spider.stop();}}分词语料库合并创建启动类
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication@EnableSchedulingpublicclassAiApplication{publicstaticvoidmain(String[]args){SpringApplication.run(AiApplication.class,args);}}创建文件工具类FileUtil,用于文本文件的读取,合并,以及获取某目录下的文本文件名称
importjava.io.*;importjava.util.ArrayList;importjava.util.List;/***文件工具类*/publicclassFileUtil{/***将多个文本文件合并为一个文本文件*@paramoutFileName*@paraminFileNames*@throwsIOException*/publicstaticvoidmerge(StringoutFileName,ListinFileNames)throwsIOException{FileWriterwriter=newFileWriter(outFileName,false);for(StringinFileName:inFileNames){try{Stringtxt=readToString(inFileName);writer.write(txt);System.out.println(txt);}catch(Exceptione){}}writer.close();}/***查找某目录下的所有文件名称*@parampath*@return*/publicstaticListgetFiles(Stringpath){Listfiles=newArrayList();Filefile=newFile(path);File[]tempList=file.listFiles();for(inti=0;i//如果是文件files.add(tempList[i].toString());}if(tempList[i].isDirectory()){//如果是文件夹files.addAll(getFiles(tempList[i].toString()));}}returnfiles;}/***读取文本文件内容到字符串*@paramfileName*@return*/publicstaticStringreadToString(StringfileName)throwsIOException{Stringencoding="UTF‐8";Filefile=newFile(fileName);Longfilelength=file.length();byte[]filecontent=newbyte[filelength.intValue()];FileInputStreamin=newFileInputStream(file);in.read(filecontent);in.close();returnnewString(filecontent,encoding);}}创建application.yml
ai:#语料库汇总文本文件wordLib:E:\article.txt#语料库目录dataPath:E:\article创建服务类
@ServicepublicclassWord2VecService{//模型分词路径@Value("${ai.wordLib}")privateStringwordLib;//爬虫分词后的数据路径@Value("${ai.dataPath}")privateStringdataPath;/***合并*/publicvoidmergeWord(){ListfileNames=FileUtil.getFiles(dataPath);try{FileUtil.merge(wordLib,fileNames);}catch(IOExceptione){e.printStackTrace();}}}创建任务类TrainTask
/***训练任务类*/@ComponentpublicclassTrainTask{@AutowiredprivateWord2VecServiceword2VecService;/***训练模型*/@Scheduled(cron="03016**?")publicvoidtrainModel(){System.out.println("开始合并语料库......");word2VecService.mergeWord();System.out.println("合并语料库结束‐‐‐‐‐‐");}}Deeplearning4j之Word2VecDeeplearning4j简介DeepLearning4J(DL4J)是一套基于Java语言的神经网络工具包
可以构建、定型和部署神经网络
DL4J与Hadoop和Spark集成,支持分布式CPU和GPU,为商业环境
(而非研究工具目的)所设计,Skymind是DL4J的商业支持机构
Deeplearning4j拥有先进的技术,以即插即用为目标
通过更多预设的使用,避免多余的配置,让非企业也能够进行快速的原型制作
DL4J同时可以规模化定制
Word2Vec简介Word2vec是一种比较流行的自然语言算法,能创建可以输入深度神经网络的神经词向量代码实现引入依赖
1.0.0‐beta1.0.0‐betand4j‐native‐platformorg.deeplearning4jdeeplearning4j‐core${dl4j.version}org.deeplearning4jdeeplearning4j‐nlp${dl4j.version}org.nd4j${nd4j.backend}${nd4j.version}application.yml中增加配置
ai:#词向量模型vecModel:E:\article.vecmodel修改服务类Word2VecService,增加方法构建词向量模型
importcom.tensquare.ai.util.FileUtil;importorg.deeplearning4j.models.embeddings.loader.WordVectorSerializer;importorg.deeplearning4j.models.word2vec.Word2Vec;importorg.deeplearning4j.text.sentenceiterator.LineSentenceIterator;importorg.deeplearning4j.text.sentenceiterator.SentenceIterator;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importjava.io.File;importjava.io.IOException;importjava.util.List;/***把分词文本内容训练成机器符号*Createdbylghon2018/3/28.*/@ServicepublicclassWord2VecService{//模型分词路径@Value("${ai.wordLib}")privateStringwordLib;//模型训练保存的路径@Value("${ai.vecModel}")privateStringvecModel;//爬虫分词后的数据路径@Value("${ai.dataPath}")privateStringdataPath;/***合并*/publicvoidmergeWord(){//..........}/***根据分词模型生成词向量模型*/publicvoidbuild(){try{//加载数爬虫分词数据集SentenceIteratoriter=newLineSentenceIterator(newFile(wordLib));Word2Vecvec=newWord2Vec.Builder().minWordFrequency(5).iterations(1).layerSize(100).seed(42).windowSize(5).iterate(iter).build();vec.fit();//保存模型之前先删除newFile(vecModel).delete();//删除WordVectorSerializer.writeWordVectors(vec,vecModel);}catch(Exceptione){e.printStackTrace();}}}参数说明:
minWordFrequency是一个词在语料中必须出现的最少次数。本例中出现不到5次的词都不予学习。词语必须在多种上下文中出现,才能让模型学习到有用的特征。对于规模很大的语料库,理应提高出现次数的下限iterations是网络在处理一批数据时允许更新系数的次数。迭代次数太少,网络可能来不及学习所有能学到的信息;迭代次数太多则会导致网络定型时间变长layerSize指定词向量中的特征数量,与特征空间的维度数量相等。以500个特征值表示的词会成为一个500维空间中的点windowSize:表示当前词与预测词在一个句子中的最大距离是多少seed:用于随机数发生器。与初始化词向量有关iterate:告知网络当前定型的是哪一批数据集vec.fit()让已配置好的网络开始定型修改任务类TrainTask
importcom.tensquare.ai.service.CnnService;importcom.tensquare.ai.service.Word2VecService;importcom.tensquare.ai.util.FileUtil;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.io.IOException;importjava.util.List;/***模型任务类*/@ComponentpublicclassTrainTask{@AutowiredprivateWord2VecServiceword2VecService;/***训练模型*/@Scheduled(cron="03016**?")publicvoidmakeModel(){System.out.println("开始合并语料库......");word2VecService.mergeWord();System.out.println("合并语料库结束‐‐‐‐‐‐");System.out.println("开始构建词向量模型");word2VecService.build();System.out.println("构建词向量模型结束");}}构建卷积神经网络模型(CNN)神经网络神经网络可以指向两种,一个是生物神经网络,一个是人工神经网络生物神经网络
一般指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的
意识,帮助生物进行思考和行动
一个神经元可以通过轴突作用于成千上万的神经元,也可以通过树突从成千上万的神经元接受信息
上级神经元的轴突在有电信号传导时释放出化学递质,作用于下一级神经元的树突,树突受到递质作用后产生出电信号,从而实现了神经元间的信息传递
化学递质可以使下一级神经元兴奋或抑制
人工神经网络
人工神经网络(ArtificialNeuralNetworks,简写为ANNs)也简称为神
经网络(NNs)或称作连接模型(ConnectionModel),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的
是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。在工程与学术界也常直接简称为“神经网络”或类神经网络
卷积英文中的toconvolve词源为拉丁文convolvere,意为“卷在一起”从数学角度说,卷积是指用来计算一个函数通过另一个函数时,两个函数有多少重叠的积分卷积可以视为通过相乘的方式将两个函数进行混合代码实现修改配置文件application.yml
ai:#神经网络卷积模型cnnModel:E:\article.cnnmodel添加工具类CnnUtil
/***CNN工具类*/publicclassCnnUtil{/***创建计算图(卷积神经网络)*@paramcnnLayerFeatureMaps卷积核的数量(=词向量维度)*@return计算图*/publicstaticComputationGraphcreateComputationGraph(intcnnLayerFeatureMaps){//训练模型intvectorSize=300;//向量大小//intcnnLayerFeatureMaps=100;每种大小卷积层的卷积核的数量=词向量维度ComputationGraphConfigurationconfig=newNeuralNetConfiguration.Builder().convolutionMode(ConvolutionMode.Same)//设置卷积模式.graphBuilder().addInputs("input").addLayer("cnn1",newConvolutionLayer.Builder()//卷积层.kernelSize(3,vectorSize)//卷积区域尺寸.stride(1,vectorSize)//卷积平移步幅.nIn(1).nOut(cnnLayerFeatureMaps).build(),"input").addLayer("cnn2",newConvolutionLayer.Builder().kernelSize(4,vectorSize).stride(1,vectorSize).nIn(1).nOut(cnnLayerFeatureMaps).build(),"input").addLayer("cnn3",newConvolutionLayer.Builder().kernelSize(5,vectorSize).stride(1,vectorSize).nIn(1).nOut(cnnLayerFeatureMaps).build(),"input").addVertex("merge",newMergeVertex(),"cnn1","cnn2","cnn3")//全连接层.addLayer("globalPool",newGlobalPoolingLayer.Builder()//池化层.build(),"merge").addLayer("out",newOutputLayer.Builder()//输出层.nIn(3*cnnLayerFeatureMaps).nOut(3).build(),"globalPool").setOutputs("out").build();ComputationGraphnet=newComputationGraph(config);net.init();returnnet;}/***获取训练数据集*@parampath分词语料库根目录*@paramchildPaths分词语料库子文件夹*@paramvecModel词向量模型*@return*/publicstaticDataSetIteratorgetDataSetIterator(Stringpath,String[]childPaths,StringvecModel){//加载词向量模型WordVectorswordVectors=WordVectorSerializer.loadStaticModel(newFile(vecModel));//词标记分类比标签MapreviewFilesMap=newHashMap();for(StringchildPath:childPaths){reviewFilesMap.put(childPath,Arrays.asList(newFile(path+"/"+childPath).listFiles()));}//标记跟踪LabeledSentenceProvidersentenceProvider=newFileLabeledSentenceProvider(reviewFilesMap,newRandom(12345));returnnewCnnSentenceDataSetIterator.Builder().sentenceProvider(sentenceProvider).wordVectors(wordVectors).minibatchSize(32).maxSentenceLength(256).useNormalizedWordVectors(false).build();}publicstaticMappredictions(StringvecModel,StringcnnModel,StringdataPath,String[]childPaths,Stringcontent)throwsIOException{Mapmap=newHashMap();//模型应用ComputationGraphmodel=ModelSerializer.restoreComputationGraph(cnnModel);//通过cnn模型获取计算图对象//加载数据集DataSetIteratordataSet=CnnUtil.getDataSetIterator(dataPath,childPaths,vecModel);//通过句子获取概率矩阵对象INDArrayfeaturesFirstNegative=((CnnSentenceDataSetIterator)dataSet).loadSingleSentence(content);INDArraypredictionsFirstNegative=model.outputSingle(featuresFirstNegative);Listlabels=dataSet.getLabels();for(inti=0;i@Value("${ai.dataPath}")privateStringdataPath;//合并前的分词语料库@Value("${ai.vecModel}")privateStringvecModel;//词向量模型@Value("${ai.cnnModel}")privateStringcnnModel;//卷积神经网络模型/***生成卷积神经网络模型*/publicvoidbuild(){try{//1.创建计算图对象ComputationGraphnet=CnnUtil.createComputationGraph(100);//2.加载训练数据集String[]childPaths={"ai","db","web"};DataSetIteratordataSet=CnnUtil.getDataSetIterator(dataPath,childPaths,vecModel);//3.训练模型net.fit(dataSet);//4.保存模型newFile(cnnModel).delete();ModelSerializer.writeModel(net,cnnModel,true);}catch(Exceptione){e.printStackTrace();}}}修改任务类TrainTask
importcom.tensquare.ai.service.CnnService;importcom.tensquare.ai.service.Word2VecService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;/***训练任务类*/@ComponentpublicclassTrainTask{@AutowiredprivateWord2VecServiceword2VecService;@AutowiredprivateCnnServicecnnService;/***训练模型*/@Scheduled(cron="03016**?")publicvoidmakeModel(){System.out.println("开始合并语料库......");word2VecService.mergeWord();System.out.println("合并语料库结束‐‐‐‐‐‐");System.out.println("开始构建词向量模型");word2VecService.build();System.out.println("构建词向量模型结束");System.out.println("开始构建神经网络卷积模型");cnnService.build();System.out.println("构建神经网络卷积模型结束");}}实现智能分类需求分析传入文本,得到所属分类信息代码实现修改CnnService,增加方法
/***返回map集合分类与百分比*@paramcontent*@return*/publicMaptextClassify(Stringcontent){System.out.println("content:"+content);//分词try{content=util.IKUtil.split(content,"");}catch(IOExceptione){e.printStackTrace();}String[]childPaths={"ai","db","web"};//获取预言结果Mapmap=null;try{map=CnnUtil.predictions(vecModel,cnnModel,dataPath,childPaths,content);}catch(IOExceptione){e.printStackTrace();}returnmap;}创建AiControllerimportcom.tensquare.ai.service.CnnService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;@RestController@RequestMapping("/cnn")publicclassCnnController{@AutowiredprivateCnnServicecnnService;@RequestMapping(value="/textclassify",method=RequestMethod.POST)publicMaptextClassify(@RequestBodyMapcontent){returncnnService.textClassify(content.get("content"));}}使用postman测试{"content":"测试文本"}}returnmap;}
创建AiControllerimportcom.tensquare.ai.service.CnnService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;@RestController@RequestMapping("/cnn")publicclassCnnController{@AutowiredprivateCnnServicecnnService;@RequestMapping(value="/textclassify",method=RequestMethod.POST)publicMaptextClassify(@RequestBodyMapcontent){returncnnService.textClassify(content.get("content"));}}使用postman测试{"content":"测试文本"}韩清宗