AI 智能搜索 开源hanlp实现
AI智能搜索
通过网络资源可知有很多种开源方式实现智能搜索,其中hanlp在GitHub中响应居高
参考链接:
Java版:https://github.com/hankcs/HanLP
Python版:https://github.com/hankcs/pyhanlp
https://hanlp.hankcs.com/docs/api/restful_java.html
http://www.hankcs.com/nlp/hanlp.html
https://github.com/hankcs/HanLP/releases
浅谈拙见
Hanlp说明
想要调用hanlp,首先需要有相应jar包,具体下载地址已在参考链接中
其次,hanlp中包含一个配置文件hanlp.properties
如果想进行相似对比,文本推荐等需要hanlp语料库的支持,故还需语料库文件data-for-1.7.5.zip
由于现有需求,需要将jar包转换为dll文件在.net core 文件中引用
转换dll的方法可自行百度,但注意,.net framework 和.net core所需的dll并非是同一种,不然会报错。
稍后我将我转换的dll文件上传,链接后补
https://files.cnblogs.com/files/zwbsoft/hanlp-core-1.8.3.dll.zip?t=1668498093 记得去掉zip后缀
所有准备工作完成,将相当于jvm的文件IKVM.OpenJDK.Core.dll和将jar包解析出来的hanlp-core-1.8.3.dll同时引用到.net core 项目中
具体使用如下,相关使用参考官网文档
本人core程序,实践可行几种方式如下
- nlp分词
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
try
{
java.lang.System.getProperties().setProperty("java.class.path", @"E:\\install\\hanlp");
Console.WriteLine(HanLP.segment("你好,欢迎在CSharp中调用HanLP的API! "));}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
说明一下“E:\\install\\hanlp”需要把jar包和配置文件,及解压后的data语料库文件夹放在同一目录,该方法其实是通过jvm调用java,使得.net core 能够对其进行方法调用
- 关键字提取
Console.WriteLine(HanLP.extractKeyword("商品和服务",2));
输出结果

- 汉字转拼音
private static void py()
{
string stringpy = "每个青年都应当有远大的抱负";
//var z = HanLP.convertToPinyinString("报复","",true);
//Console.WriteLine(z);
//汉字转拼音搜索
var listpy = HanLP.convertToPinyinList(stringpy);
Console.WriteLine(listpy);
foreach (var item in listpy.toArray())
{
Console.WriteLine(item);
}
var firstpyt = HanLP.convertToPinyinFirstCharString(stringpy, "", true);
Console.WriteLine(firstpyt);
var firstpyf = HanLP.convertToPinyinFirstCharString(stringpy, " ", false);
Console.WriteLine(firstpyf);
//拼音转汉字
String text = "重载不是重任";
java.util.List pinyinList = HanLP.convertToPinyinList(text);
Console.WriteLine("原文,");
foreach (char c in text.ToCharArray())
{
Console.WriteLine("%c,", c);
}
Console.WriteLine();
Console.WriteLine("拼音(数字音调),");
foreach (Pinyin pinyin in pinyinList.toArray())
{
Console.Write("%s,", pinyin);
}
Console.WriteLine();
Console.WriteLine("拼音(符号音调),");
foreach (Pinyin pinyin in pinyinList.toArray())
{
Console.Write("%s,", pinyin.getPinyinWithToneMark());
}
Console.WriteLine();
Console.WriteLine("拼音(无音调),");
foreach (Pinyin pinyin in pinyinList.toArray())
{
Console.WriteLine("%s,", pinyin.getPinyinWithoutTone());
}
Console.WriteLine();
Console.WriteLine("声调,");
foreach (Pinyin pinyin in pinyinList.toArray())
{
Console.Write("%s,", pinyin.getTone());
}
}
- 繁简互转
string fttext = "知識沒有盡頭,就像海沒有邊際";
Console.WriteLine(HanLP.convertToSimplifiedChinese(fttext));
效果如下

- 文本推荐,耗时最长,如有解决,烦请指教(未成功)
文本推荐原理
假设“你爱我们”和“我们爱你”进行相似度计算,计算机会将每一句话的每个词,根据语料库进行计算,算出词向量值,在通过对每个词向量进行累加就变成了句向量,再将两个计算的句向量值,进行cos余弦计算,最终得出相似匹配度
先贴代码后赘述
public static Vector query(string content)
{
if (content == null || content.Length == 0)
{ Console.WriteLine("-------------------");return null; }
//对句子进行分词,我爱你们--->["我"、"爱"、"你们"]
object z = NotionalTokenizer.segment(content);//
java.util.List termList = NotionalTokenizer.segment(content);
Vector result = new Vector(200);
int n = 0;
//WordVectorModel wordVectorModelss = new WordVectorModel("en-vectors.txt");
WordVectorModel wordVectorModelss = new WordVectorModel("E:\\install\\hanlp\\data\\model\\sogouyuliaoku.txt");
foreach (Term term in termList.toArray())
{
//从word2vec词典中查出这个词的 词向量
Vector vector = wordVectorModelss.vector(term.word);
if (vector == null)
{
//如果这是一个oov词,则直接忽略
continue;
}
++n;
//将 句子分词后的每个词 的词向量 相加
result.addToSelf(vector);
}
if (n == 0)
{
Console.WriteLine("-------------------");
return null;
}
//归一化
result.normalize();
//句子--->分词--->查询词向量--->词向量相加作为"句向量"
Console.WriteLine(result);
return result;
}
/**
* 文档相似度计算
* @param what
* @param with
* @return
*/
public static float similarity(string what, string with)
{
//what 文档的 向量
Vector A = query(what);
if (A == null) return -1f;
//to 文档的 向量
Vector B = query(with);
if (B == null) return -1f;
//计算余弦相似度
return A.cosineForUnitVector(B);
}
其他均可运行,但通过java.Util对其进行获取WordVectorModel wordVectorModelss = new WordVectorModel("E:\\install\\hanlp\\data\\model\\sogouyuliaoku.txt");
指定语料库时,报错,报错信息如图

Unable to cast object of type 'java.util.PropertyResourceBundle' to type 'sun.util.resources.OpenListResourceBundle'.
对其无法追究其根本,故从java中进行测试,能获取到文件,但同样会报错
报错信息如下

查询具体报错是,大致意思是说足彩这种从文本中获取的文字数据无法计算词向量,计算出的值为-1就报异常,但其实应该是0-9之间的区间值。
AI 智能搜索 开源hanlp实现的更多相关文章
- AI 智能写情诗、藏头诗
一.AI 智能情诗.藏头诗展示 最近使用PyTorch的LSTM训练一个写情诗(七言)的模型,可以随机生成情诗.也可以生成藏头情诗. 在特殊的日子用AI生成一首这样的诗,是不是很酷!下面分享下AI 智 ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
- 【百度地图API】如何区分地址解析和智能搜索?
原文:[百度地图API]如何区分地址解析和智能搜索? 摘要: 很多用户一直无法区分地址解析geocoder和智能搜索localsearch的使用场景.该文章用一个详尽的示例,充分展示了这两个类,共5种 ...
- 实现input输入时智能搜索
// 智能搜索 function oSearchSuggest(searchFuc) { var input = $('#in'); var suggestWrap = $('#gov_search_ ...
- 用人工智能学习,凡亿推出PCB问题解答智能搜索机器人:pcb助手
对于学习者,你是不是经常遇到这样的问题:在我们狠狠下定决心学习PCB技术的时候,我们常常遇到很多大大小小的问题,遗憾的是身边没有一个能及时给自己解答问题的高手指点,通过论坛.群等方式询问可能半天也得不 ...
- AI智能外呼机器人网络拓扑结构笔记
最近开发了一套AI智能外呼机器人系统,系统主要有3部分组成:web管理平台:呼叫机器人:SIP软交换.具体网络拓扑结构如下图: 三部分主要功能如下: 1.web管理平台:话术管理.任务管理.线路管理. ...
- 用电销机器人让电销企业迈入AI智能时代
2019年是AI智能快速发展的一年,有非常多的企业已经用AI智能代替原有的传统员工做重复性高的工作,就拿销售行业来说,为了让电销员工提升工作效率,拥有更多的成单,大部分有电销岗位的公司都会把重复率较高 ...
- 玩转百度地图API(地图,坐标,标记,添加控件,2D图,混合图,智能搜索,地址解析器,信息窗口)
1.注册得到appkey 2.直接上代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...
- AI智能皮肤测试仪助力美业数字化营销 实现门店与用户双赢局面
当皮肤遇到AI智能,会有怎么样的火花呢?随着生活水平的提升,人们对肌肤保养护理的需求也越来越高,人要美,皮肤养护也要更精准,数字化必将成为美业发展的新契机.新机遇下肌肤管家SkinRun为美业客户提供 ...
- 三分钟玩转微软AI量化投资开源库QLib
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...
随机推荐
- python获取上月、当月、下月的开始和结束日期
获取上月开始结束日期 方法一 import datetime def get_date_of_last_month(form="%Y-%m-%d"): ""&q ...
- Flutter 登录与list列表demo
import 'package:flutter/material.dart'; void main() => runApp(DemoApp()); class DemoApp extends S ...
- docker 部署mongodb 并建立用户和授权数据库
docker pull mongo:4.4.8 (拉取镜像) docker run --name mongo -v /data/mongo-data:/data/db -p 27018:27017 - ...
- SDN之Openflow+OpenDayLight课程开课通知
内容简介: 该课程为期2天,在这两天里 我们将会深入体会SDN的特点与传统网络的区别 ,掌握SDN架构里各层的协议用途,Openflow作为sdn里的一款开源的南向协议,最大的意义体现在它实现了网络设 ...
- 容器逃逸 --with docker.sock
容器逃逸 --with docker.sock 本人对于容器逃逸的基本理解就是用户从容器中逃出去到宿主机里去了. 本文意在记录一个使用 docker.sock 来进行容器逃逸的方法. 首先随便来个镜像 ...
- webpack的加载器兼容配置一览
"devDependencies": { "css-loader": "^3.2.1", "file-loader": ...
- Win10打开Autodesk软件时提示“管理员已阻止你运行此应用”
Win10用户的最大困扰就是系统的安全性太高,导致很多软件在运行时总是会报错,这不,又有同学遇到了下面的问题: 当你的电脑跳出这么鲜红的界面你是不是很想砸了它....手下留脑~它还能再奋斗两年. 出现 ...
- A - Yet Another Tetris Problem
A - Yet Another Tetris Problem 思路:判读一堆数字是不是同奇数偶数,写一个函数,循环遍历,然后判断是否同为奇数偶数. 代码: #include<iostream&g ...
- 路飞项目 day02 全局日志、全局异常处理、封装Response、数据库准备
一.路飞项目全局日志配置 那个代码不用死记硬背,知道一些地方是啥意思即可 1.复制django自带的日志模块的大代码到dev(settings)文件中 LOGGING = { 'version': ...
- 前端之Vue day08 Vue3项目搭建、setup、toRefs
一.Vue3 介绍 # 新项目使用vue3,有部分老项目使用vue2 # vue3 的变化 1.性能的提升 -打包大小减少41% -初次渲染快55%, 更新渲染快133% -内存减少54% 2.源码的 ...