我用四种方式实现某场所码箭头动画(css3+canvas+svg+js)讲解超详细
我用四种方式实现某场所码箭头动画(css3+canvas+svg+js)讲解超详细
大家好!我是猫小白,本期给大家带来一个简单的实战demo,希望大家食用得开心,有收获。
==首先声明:此demo存粹为了学习其中的动画知识,请不要用于真实的场景,否则被JC叔叔抓起包吃包住就不应该了瑟!== 此项目基于==成都天府健康通==,其它地区的场所码不知道是否有类似的动画,如果没有也没关系,可以学习下是如何实现的。 为啥子要做这个呢?那是因为有一天我出去买菜,回来保安叔叔恩是要我扫一下场所码,作为一个5星好公民,肯定是非常配合的掏出手机开始扫 。叮~,屏幕上出现一个不挺放大缩小的箭头。我就想,要不用代码来实现一下这个动画吧。
于是就有了这篇文章,我一共是实现了4种方法:
第一种,css,零js代码(最简单)
第二种,svg,零js代码 (较简单)
第三种,js+dom (较复杂)
第四种,js+canvas (较复杂)
全文源码地址:点击跳转到github ,可以拉下来亲操练操练,顺便给一个start!
接下来,我们一个一个来分析如何实现的。
准备工作
首先我们假装出去买个菜(未解封的同胞除外例如上海的朋友),回来的时候去保安那里故作镇定,连贯的掏出手机打开天府健康通(成都的哈)扫一下,然后给保安亮一下,不退出界面,淡定回家。
回到家后,拿出手机,打开刚刚的界面,截一个图:
加入html
中,作为div
容器的背景图片,然后我们创建一个白色的框把中间的圆圈和勾遮住,因为我们要自己实现其中的动画效果。 实现效果如下:
遮板的css代码:
/**遮板**/
.shutter {
position: absolute;
display: block;
width: 120px;
height: 120px;
background-color: #fff;
top: 206px;
left: 150px;
}
核心html代码结构如下,:
只是列举关键的代码,完整代码请到github仓库查看。
准备工作完成,开始正片!
第一种,css,零js代码
使用css3
的animation
动画,可以很容易实现这样的效果,不用一行js代码。单关键是要看明白我们目标动画是由哪些部分组成的,动画是怎么变化的。所以先再次看看这个gif
,注意其中动画部分:
不难发现:
圆圈是由小到大,再由大到小
内圈放大到一定程度时,外圈(扩散部分)出现,并且半径不停增大,当内圈放到最大时,扩散圈消失
内部的勾也会一起放大缩小,频率和内圈相同 根据上面的规律,我们先实现一个内圈(绿色圈部分)
内部圈css代码:
/**内部圆圈**/
.circle {
position: absolute;
z-index: 9;
width: var(--circle-size);
height: var(--circle-size);
top: 218px;
left: 165px;
background-color: var(--theme-green);
/* background-color: red; */
border-radius: 45px;
animation: circleMove 0.7s alternate infinite cubic-bezier(1, 1, 1, 1);
}
--circle-size、--theme-green是我们在开头定义的变量,方便后续使用。
:root {
--theme-green: #4ba776; /**主题绿色**/
--circle-size: 90px; /**圆圈大小 宽高一样**/
}
内部圈画好了,还差一个白色的"√",为了简单我直接使用了"√"这个字符串,加入伪类元素的content
中。你们也可以用图片或者svg。 "√"的css
代码如下:
/**内部的勾,使用`.circle`的`before`伪类**/
.circle::before {
z-index: 2;//z-index要比外圈(阔散圈)大,否则要被背景覆盖
position: absolute;
display: block;
content: "✔";
font-size: 63px;
color: #fff;
left: 18px;
top: -1px;
}
让我们预览下现在的效果: 哟也~看起来是那么回事了。
现在我们按照内圈相同的颜色和大小,画一个外部圈(扩散圈)。 参考上面的"√"
的实现,我们用after
伪类来实现:
/**动画时外部渐变圈*/
.circle::after {
z-index: 1;//z-index要比内部的勾小,否则要覆盖掉勾
position: absolute;
display: block;
content: "";
width: calc(var(--circle-size));
height: calc(var(--circle-size));
box-sizing: border-box;
border-radius: 50%;
background-color: #4ba776;
transform: scale(1.2);
/**外圈动画 一轮时间是内圈的2倍 内部圈放大0.7s+缩小0.7s=1.4s infinite无限重复**/
/* animation: outCircleMove 1.4s infinite cubic-bezier(1, 1, 1, 1); */
}
内圈加入放大缩小动画,在.circle
中计入animation
/**内部圆圈**/
.circle {
position: absolute;
z-index: 9;
width: var(--circle-size);
height: var(--circle-size);
top: 218px;
left: 165px;
background-color: var(--theme-green);
/* background-color: red; */
border-radius: 45px;
/*加入放大缩小动画 alternate:轮流播放,放大再放小 infinite:无限播放 ease-in-out:变化函数*/
animation: circleMove 0.7s alternate infinite ease-in-out;
}
/**定义放大缩小动画,最大放大到1.2倍**/
@keyframes circleMove {
0% {
transform: scale(1);
}
100% {
transform: scale(1.2);
}
}
解读:时间设置为0.7s,我们定义了circleMove 动画,意思是在0秒的时候圆圈保持1倍大小,在0.1~0.7s圆圈逐渐变为1.2倍大小。变化的快慢是由animation-timing-function
参数决定的,文中设置的ease-in-out
是进入和退出较慢,中间速度较快的一种变化曲线。
我们可以打开开发者工具,点击animation
属性的曲线图标,查看和选择想要的动画曲线
好内圈动画已经完成,我们来看下效果:
perfect!现在我们加入外圈动画,让我们回顾一下:外圈动画是要在内圈放大到一定时间外圈才出现,我们暂定1/5,也就是20%的时候显示并且开始放大(放大对应属性:scale);放大后外圈会越来越便透明,直到内圈放到最大,此时完全透明,感觉像是扩散的效果(透明对应属性:opacity)。 知道这些后,我们设置外圈动画如下: /*动画时外部渐变圈 /
.circle::after {
z-index: 1;
position: absolute;
display: block;
content: "";
width: calc(var(--circle-size));
height: calc(var(--circle-size));
box-sizing: border-box;
border-radius: 50%;
background-color: #4ba776;
/**外圈动画 一轮时间是内圈的2倍 内部圈放大0.7s+缩小0.7s=1.4s infinite无限重复**/
animation: outCircleMove 1.4s infinite ease-in-out;
}
/**定义扩散圈的放大缩小动画**/
@keyframes outCircleMove {
/**0%~50% 0s~ 0.7s前的时间 此时内圈放大,扩散圈等待时机出现**/
0% {
opacity: 0;
}
/**10% 此时内圈已经放大一段时间, 扩散全显示opacity设为1,倍率为1 **/
10% {
opacity: 1;
transform: scale(1);
}
/**50%到100%是动画0.7s~1.4s的时间 此时内圈缩小,扩散圈变为1.3倍,但是透明度设为0**/
50%,
100% {
transform: scale(1.3);
opacity: 0;
}
}
至此就大功告成了,看下效果:
第二种,svg,零js代码 (较简单)
上面了利用css3的动画属性,操作起来非常简单。现在介绍一种用svg动画的方式实现相同的效果。我们知道svg也是有比较丰富的动画特性支持。 我们简单列举一下svg实现动画的几种方法:
1.set
set元素是SVG动画元素中最简单的元素。在经过特定时间间隔后,它只是将属性设置为特定值。因此,形状不会连续进行动画处理,而只是更改属性值一次。
2.animate
元素通常放置到一个SVG图像元素里面,用来定义这个图像元素的某个属性的动画变化过程。
3.animateMotion
元素也是放置一个图像元素里面,它可以引用一个事先定义好的动画路径,让图像元素按路径定义的方式运动。
4.animateTransform
动画上一个目标元素变换属性,从而使动画控制平移,缩放,旋转或倾斜。
简单了解过后,我们今天主要用animate
来实现动画。
首先,我们还是拿出上面的基础布局,祖传代码(背景+遮罩)
基本框架的样式和上一节css动画的样式相同,就不重复粘贴了。
然后我们画一个圆和勾,也就是内部的部分;svg中画圆是用
,于是我们有这样的代码:
效果如下:
继续添加中间的白色"√"
。为了简介,我们用
文字标签: 添加
后的代码如下:
添加文字后效果如下: 好了,内圈添加好了,我们再添加一个外圈(扩散圈),还是用
,大小和位置都和内圈一模一样,这里就不粘贴代码了。
现在来添加动画,根据上一章节的css3动画,我们需要不挺的放大缩小内圈的大小。所以我们通过动画改编圆的半径就ok了。上面介绍了
标签可以动态改变某一属,这里的属性就是半径R
:
...其它代码
...其它代码
实现效果: 完美!看起来就是那么回事,后面的步骤其实都是依葫芦画瓢。 添加内部"√"
的动画,用
改变font-size
。
✔
添加后效果我们来看下:
最后,我们添加扩散效果。扩散效果其实分两步,第一步是放大半径,另一步是从不透明到透明的过程。所以我们用
改变半径的同时,改变它的透明度。
...其它代码
...其它代码
最终效果如下:
第三种,js+dom (较复杂)
前面都是通过css或者svg自带特性完成的动画效果,下面这种是通过js动态改变圆圈div
大小实现的,较为复杂,理解起来需要一定的js基础,在做项目优先选择css3,我们一起来看下是如何实现的。 首先,我们还是拿出上面的基础布局,添加内外圈的div和布局。 关键css部分:
/**外部圆圈**/
.circle,
.outCircle {
z-index: 1;
position: absolute;
width: var(--circle-size);
height: var(--circle-size);
top: 218px;
left: 165px;
background-color: var(--theme-green);
/* background-color: red; */
border-radius: 45px;
}
/**内部的勾**/
.circle::before {
position: absolute;
display: block;
content: "✔";
font-size: 63px;
color: #fff;
left: 18px;
top: -1px;
}
html部分:
至此,元素已经画好了,就差动画部分了,简单分析一波: 内圈需要逐渐放大再逐渐放小,我们用一个变量size_inner
来代表放大缩小的倍数,STEP_INNER
代表内圈递增或者递减的步长,最终设置到style
上的transform
属性。 外圈也需要有一个放大过程,且放大的速度比内圈快,我们用size_outer
来代表放大倍数,STEP_OUT
代表外圈递增步长。 外圈需要一个透明度逐渐小的值opacity_out
,透明度变化的步长用OPA_STEP
代替,最终设置style
上的opacity
属性。 动画是持续不断的,所以我们需要不停的执行,先暂时采用setInterval
函数; 放大到一定倍数然后再缩小,最大倍数我们用MAX_SCALE
常量代表,如果递增到最大然后STEP_INNER
设置为负数,意味着开始缩小。
最终的源代码如下:
因篇幅有限,不逐一解释各行代码的含义,有不理解的可以私聊我。 最终效果:
众所周知,因为浏览器的eventloop
机制,setInterval
往往并不能按照设置的时间执行,在稍微复杂一些的页面中会出现卡顿。固可采用requestAnimationFrame
api代替。 代码如下:
第四种,js+canvas (较复杂)
经过上面章节的洗礼,canvas版本和js+dom版本非常相似,唯一的不同就是绘画圆或者文字的api不同。 我们分析下要点:
需要在画布上用arc
api绘制2个圆,一个内圈一个外圈,并且不停改变圆圈的大小或透明度。
需要用fillText
绘制一个✔
字样,并且改变字体大小。
需要不停执行绘制函数,这里使用流畅的requestAnimationFrame
api。
每次绘制前,需清空画布clearRect
。 其实原理和第三种差不多,都需要用变量记录内部圈变化的大小,到最大值后方向递减。外部圈是需要等到内圈放大到一定倍数(1.1)倍,才显示出来,并且放大速度要比内圈快,随着外圈变大,透明度逐渐减小到0。
我想第四种和第三种其实都有这样的逻辑,为此我花了一点事件把这个动作进行了封装,采用了一种订阅发布模式
来实现。 为了大家浏览我这篇文章的同时,除了能学习到动画知识,也能学习到一些其它的比较重要的js知识。大家应该了解或者听过js的各种模式,什么工厂模式、单列模式、观察者模式、发布订阅模式等等,都是学习到了理论知识。今天我就用这个例子介绍下发布订阅模式是如何在实践中使用的。
刚我们分析了canvas
实现的方式和js+dom
的方式,这两种方式都需要用变量来记录一个值(这里是放大倍数),而且每次执行渲染函数时都要递增一个常量值(成为步长),到达某个最大值(比如1.3倍大小)后开始反向递减(步长乘以-1),然后递减到最初值(1倍大小)。同时还有一个细节,当内圈递增到一定倍数(比如1.1倍)要让外圈开始加入动画,当内圈递增到最大时,外圈要消失(透明度设置为0)
基于这个分析,我们得出封装的类需要设计成这样:
/***
* 放大缩小数字变化类
* 根据放大缩小初始值和步长等递增
* 提供到达某一数值时的回调
* @params {Number} from 数字初始值
* @params {Number} to 数字最大值
* @params {Number} step 数字步长
* @params {Array} dingNums 达到dingNums的区间触发回调 只再放大轮回触发
*/
export default class MoveCrycle {
constructor({ from = 0, to = 100, step = 1, dingNums = [] }) {
this.from = from;
this.to = to;
this.step = step;
this.dingNums = dingNums;
this.currValue = this.from;
this._turnNum = 0; //放大缩小轮次 一次放大一次缩小为一轮
this._event = {
onchange: [], //每一次变化触发的回调
onlarge: [], //每次到最大值触发的回调
onsmall: [], //每次到最小值触发的回调
onding: [], //每次到dingNums区间值时触发的回调
};
this._init();
}
_init() {
//注册放大事件
//记录轮次 每次放大+1
this.on("onlarge", function turn() {
this._turnNum++;
});
}
//开始滚动数字
jump() {
if (this.step > 0) {
//放大过程
if (this.currValue <= this.to) {
//递增过程中
this.currValue += this.step;
//判断是否在dingNums区间
if (
this.currValue >= this.dingNums[0] &&
this.currValue <= this.dingNums[1]
) {
this._emit("onding", this.currValue, this._turnNum);
}
} else {
this._emit("onsmall", this.currValue);
this.currValue = this.to;
this.step *= -1;
}
} else {
//缩小过程
if (this.currValue > this.from) {
this.currValue += this.step;
} else {
//缩到初始值了 重新放大
this.step *= -1;
this.currValue = this.from;
this._emit("onlarge", this.currValue);
}
}
this._emit("onchange", this.currValue, this.step > 0, this._turnNum);
}
//触发事件函数
_emit(type, ...args) {
//触发每次变动函数
this._event[type].forEach((f) => {
try {
f.apply({}, args);
} catch (e) {
console.error(e);
}
});
}
//注册回调
on(type, func) {
if (
this._event[type] &&
!this._event[type].filter((f) => f === func).length
) {
this._event[type].push(func);
}
}
//注销回调
off(type, func) {
if (this._event[type]) {
this._event[type] = this._event[type].filter((f) => f !== func);
}
}
}
一看比较长,别急慢慢分析:
constructor
部分就是接收入参,没有什么好说的。需要注意的是this._init()
,初始化时自己也注册一个onlarge
事件,来记录每次轮回的次数_turnNum
。
jump
是核心代码,主要管理每一次被执行时的递增或递减状态,同时通过this.emit()函数触发响应的回调事件。放大过程中判断是否到达dingNums的区间,如果在其中则不停触发onding
事件,当到达最大值时触发onsmall
事件代表即将变小,同时this.step *= -1
步长取反方向值。到达最小值时触发onlarge
事件,代表即将增大,同时this.step *= -1
步长取反方向值。jump
函数并没有这个类中进行递归调用,是因为把这个调用权交给使用者会更加灵活,后面会介绍如何调用。
_emit
函数是触发事件的控制中心,根据传入的type
类型找到事件对象中对应的函数数组,遍历执行。用try{} catch(e){}
是为了避免在某个回调函数中出错而影响了其它回调函数正常执行。
on
和off
顾名思义,就是注册和注销回调的入口。on
函数把传入的事件类型和函数加入对应的数组中,如果重复添加同一个函数是无效的。off
函数接收事件类型和函数,然后数组中过滤掉。这里留给你想像一下,如果用匿名函数注册的事件能取消掉吗?
好了,MoveCrycle类封装好了,回到我们的主题,看下如何在这个箭头动画中使用。
HTML部分
script部分
引入MoveCrycle
类,初始化
import MoveCrycle from "./js/MoveCrycle.js";
let cavas = document.getElementById("canvas");
var ctx = cavas.getContext("2d");
//定义的一些常量和变量下面会用到
const R_SMALL = 45;//内圈初始大小
...省略部分代码
//看着里!!!!初始化封装的类
let move = new MoveCrycle({
from: R_SMALL, //初始值
to: R_SMALL * 1.35, //最大1.35倍
step: 0.3, //步长
dingNums: [R_SMALL * 1.1, R_SMALL * 1.35], //外圈开始出现的区间内圈的1.1倍到1.35倍
});
...
注册onchange
事件,监听每一次变化,然后渲染画布
//注册数值变化事件,每次变化获取值渲染
move.on("onchange", (value, step) => {
//绘制内圆
clear(); //清空画布
//绘制内圈
drawInnerCircle(value);
//绘制外圈
drawOutCircle();
//文字放在最后,不然会被上面的圆属性fillStyle覆盖
drawText(value);
});
注册onding
事件,控制外圈的变大,透明度减小
//再设定的区间触发事件,控制外圈的变大,透明度减小
move.on("onding", (value) => {
r_out += R_OUT_STEP; //外圈变大
opa -= OPA_STEP; //外圈变大的同时透明度减小
});
注册onlarge
事件,控制外圈
//动画圈开始变大控制外圈
move.on("onlarge", (value) => {
opa = 1; //开始变大,透明度为1
r_out = 45; //外部开始变大时半径回复到初始值
});
注册onsmall
事件,控制外圈透明度为0
move.on("onsmall", (value) => {
//控制外圈光环-隐藏
opa = 0;
});
绘制内圈、外圈、文字函数
//绘制内圆
function drawInnerCircle(val) {
ctx.beginPath();
ctx.arc(SIZE / 2, SIZE / 2, val, 0, 2 * Math.PI);
ctx.fillStyle = `rgba(${COLOR}, 1)`;
ctx.fill();
}
//绘制外圈圆 变大的同时透明度下降
function drawOutCircle() {
ctx.beginPath();
ctx.arc(SIZE / 2, SIZE / 2, r_out, 0, 2 * Math.PI);
ctx.fillStyle = `rgba(${COLOR}, ${opa})`;
ctx.fill();
}
//放大字体 大小随内圈一起变化
function drawText(val) {
//font放大倍数和内圈一样
ctx.font = (val / R_SMALL) * 60 + "px Arial";
ctx.textBaseline = "center"; //设置字体底线居中
ctx.textAlign = "center"; //设置字体对齐方式居中
ctx.fillStyle = `rgba(255,255,255,1)`;
ctx.fillText("✔", 70, 90);
}
清除画布
//清除画布
function clear() {
ctx.clearRect(0, 0, SIZE, SIZE);
}
循环递归函数
//循环递归函数
(function start() {
move.jump(); //开始执行
requestAnimationFrame(() => {
start();
});
})
script部分完整代码:
以上。 完整代码可以到我的github仓库获取! 各位大佬,不要忘了给我点赞
+评论
+收藏
。
你可能感兴趣的:(我用四种方式实现某场所码箭头动画(css3+canvas+svg+js)讲解超详细)
苏妘、萧陆声《替嫁后,医妃她被暴虐王爷爆宠》完整版小说免费全文在线赏析_替嫁后,医妃她被暴虐王爷爆宠最新章节无广告
霸道推书3
小说简介:前世,我被家人忽视,他们只爱着我的妹妹。后来,妹妹被皇上指婚嫁给暴虐王爷。为了妹妹,他们让我替嫁,害怕的我选择逃婚,却被贵妃抓住打断双腿,冻死在家门口。重生后,我才发现自己是团宠文里的炮灰女配,注定要为女主妹妹牺牲。可我不想屈服命运,只想让我那些垃圾家人付出代价!首先,先安抚一下暴虐王爷吧……书名:《替嫁后,医妃她被暴虐王爷爆宠》主角配角:苏妘、萧陆声推荐指数:✩✩✩✩✩———小说内容试
分辨率、帧率、平均码率、视点数之间的区别与联系
Dream Algorithm
信息与通信 视频编解码 计算机视觉
这四项参数共同决定了视频内容的清晰度、流畅度、数据量以及3D/VR体验,但它们各自的作用和计算方式不同。以下是详细对比:1.分辨率(Resolution)定义表示视频画面的像素数量,通常以宽度×高度(如1920×1080)表示。例如:4K=3840×2160(约830万像素)16K=15360×14400(约2.2亿像素)影响✅清晰度:分辨率越高,画面越细腻(但受屏幕尺寸影响)。❌数据量:分辨率越
Python读取.parquet文件
Henrietta's NOTES
python pandas
提示:在MacOS和Jupyternotebook环境下的用法Device:MacOSPython:3.10.9Pandas:1.5.3Jupyternotebook问题描述直接用pandas中pd.read_parquet()即可,但是这个方法在和read_csv一样用之前需要先安装fastparquet活着pyarrow,方法如下:打开MacOS的终端,输入:pipinstallfastpar
我很笨,但我很爱很爱你(14)
Betty_L_Vivian
张强的手臂也正在慢慢恢复当中,这段时间除了绘画之外,就是想着开画展的事,还有就是与小琴煲电话粥,一煲就是半个小时或一个小时,还不时来一场浪漫约会,就是蜜雪冰城甜蜜蜜。过完春节后,小雅的奶奶从老家过来帮着照看孩子,这样,小琴得到了解放,不用等到晩上了,正常下班。正常的星期一早晨,小雅背着小书包,拉着奶奶的手,蹦蹦跳跳地去上学了。太阳露出了灿烂的笑容,花儿对着小雅笑,正值春花烂漫之时,到处都是花儿朵朵
公开的秘密
零温度
你的命名在我的心里是一个深藏很久的秘密那时候的我就像是一只花丛中的蜜蜂嗡嗡响的声音停下来我就会没有了魂魄那时候的我雨浇灭不了我的热情我甚至甚至做梦都会拟一封书稿我找到刚适合我的表情花便开了月亮居然圆的近下来要亲我那时候的我我找不到可以懈怠的理由浪花拍打着脚丫子痒痒的风吹来的时候我觉得我能赶上风我喜欢长长秀发的飘逸后来秘密藏不住了你居然亲了我每当我想起我就吻你的额头就像现在一样你说我流氓你说我骗了你
浪漫和悲观并不冲突
红豆儿_记录与分享
浪漫和悲观并不冲突我时常消极但又觉得生活很美好。面对日复一日无比繁忙的工作,连续的加班,心情坏到了崩溃的边缘。我终究不是圣人,做不到完全没有情绪。回到家里,看到狗狗拼命摇着尾巴,开心的跳起来,我一把把它抱了起来,那一刻我的心情瞬间美好了。带着狗狗去小路上奔跑一会儿,享受夜晚的清静,释放一日的疲惫。进门看到妈妈热好的粽子,生活的美好已经占满了心间,情绪早已被美好融化了。坦然接受自己的情绪化,我们都是
只要肯动手,处处有惊喜
柒太话人间
以前,我在书本上看到“用双手可以创造奇迹”的句子时,只是过了脑子,并没有去理解过这句话的真正意思。直到这些年,我慢慢地发现,有些事情只有动手去做,就能改变现状,变成想要的模样。自从发现了这个奥妙之后,我越来越喜欢通过自己的双手把生活中的一些事物改变原样。村里的文化广场又新建了喷泉,让这个充满了古色古香气息的广场又增添了一番美丽的景象,引得前来观光的游客们一波接一波,热闹非凡。可每次要进到广场里面去
中国AI应用“三分天下”:国企成主力、中小企偏订阅、C端仍在观望
在美的苦命程序员
人工智能
AI在中国的落地路径,正在迅速分化:国企不再只是“建底座”,而是明确聚焦于AI应用的实际部署,特别是在制造、能源、装备等领域。订单量和投入强度明显提升。中小企业开始普遍接受“订阅制+垂直应用”的组合模型,以年费万元级的方式引入AI能力,用于财税、HR、客服等关键业务流程。C端市场则相对承压。虽有WPSAI等大模型产品突破,但整体变现节奏较慢,巨头产品仍处于免费体验或早期内测阶段。国企推动AI从“可
TensorFlow为AI人工智能航空航天领域带来变革
AI原生应用开发
人工智能 tensorflow python ai
TensorFlow为AI人工智能航空航天领域带来变革关键词:TensorFlow、人工智能、航空航天、机器学习、深度学习、神经网络、自主系统摘要:本文探讨了TensorFlow这一强大的机器学习框架如何推动航空航天领域的创新。我们将从基础概念入手,逐步深入分析TensorFlow在航天器导航、卫星图像处理、飞行器自主决策等关键应用场景中的实现原理。通过实际代码示例和架构图解,展示TensorFl
多语言文本分类在AI应用中的实践
AI原生应用开发
人工智能 分类 数据挖掘 ai
多语言文本分类在AI应用中的实践关键词:多语言文本分类、自然语言处理、机器学习、深度学习、BERT、迁移学习、跨语言模型摘要:本文深入探讨多语言文本分类在AI领域的应用实践。我们将从基础概念出发,逐步讲解其核心原理、技术架构和实现方法,并通过实际案例展示如何构建一个高效的多语言文本分类系统。文章将涵盖从传统机器学习方法到最先进的深度学习技术,特别关注跨语言迁移学习在实际业务场景中的应用。背景介绍目
“亮剑”女神童蕾丈夫获刑3年!曾造假50亿身家,前任是朱丹老公
麦大人
说起童蕾这个演员,大家一定很陌生,但要说起《亮剑》这部电视剧,大家肯定有看过。她曾在这部电视剧中,饰演小护士田雨,其敢爱敢恨的性格,获得了观众们的喜爱。3月9日,童蕾在某平台发布一条视频,并配字:看过两部以上的请举手。之后,她先后介绍一些自己拍摄的作品,比如《我的小姨》《隋唐英雄传》等等。视频一发,立即引发了网友的热议。可能大家的印象,还都停留在《亮剑》当中,又或者是这个电视剧,简直太深入人心了,
职场上,这三种员工不会被辞退,但永远不会被升职加薪!
云学科技
在职场上,每个人都希望通过自己的努力实现升职加薪的梦想。但不是所有人都能达成愿望,有这么几类人工作很多年都没能实现升职加薪1、办公室文员无论是在一二线的高大上的写字楼里,还是各种中小企业的办公室里,都存在一些基础性的工作,技术含量及要求不高,但是又不得不安排人去做的工作,这就是办公室文员。因为办公室文员的工作环境好,而且清闲安逸,好多年轻的女孩子都喜欢这个职业。小张毕业后就一直从事行政的考勤、请假
我的父亲母亲(一)
长空云剑
小时候,最期盼寒假了。因为我们可以走亲戚,很重要是是可以挣压岁钱。小孩子喜欢过年,大人都不喜欢,因为考虑的不一样。那时,我只管跟着父母走亲戚,父母把走亲戚当做任务,父亲有其不喜欢走亲戚,大概是因为性格内敛,不善表达吧。所以就有个怪现象:走的亲戚,大多是母亲娘家那边的亲戚,而父亲这边的亲戚,就去的很少。长此以往,就不平衡了,小小的我也没有意识到这些。因为,只要没有人和你提起这个,你很难跳出这个局面来
(日更第15天)自己的第一篇收费文章刚刚出炉,好玩。
水云川流
今天开通了的会员,这是自己发的第一篇付费文章。开通会员,是对自己之前的一个小小奖励和鼓励,也是对自己未来的一个督促。之前接触过,但是一直没有在这里付出太多精力和时间。最近最引起自己注意的是,采用了区块链技术,玩起了钻。新事物里孕育着新机会,不愿错过新机会的自己当然得为自己种下一颗种子。虽然不知道这颗种子未来会变成什么样子,但是种下种子总比啥都不种强吧。第一篇付费文章也不知道该写些啥,我想应该是有价
2025版最新黑客网站整理大全,全新整理黑客网站大全!收藏这一篇就够了_暗域网入口网址
爱吃小石榴16
网络 安全 前端 php 数据库
今天给大家分享一些学习网络安全的好去处。对于网络安全的学习,多逛论坛、阅读他人的技术分析帖是非常重要的。但有时候,初学者可能会感到迷茫,不知道去哪里寻找这些技术分析帖,也不知道有哪些相关的论坛或网站。所以,今天我就来给大家分享一些比较常见的国内安全论坛。1、黑客基地:http://www.hackbase.com/黑基网(WWW.HACKBASE.NET)成立于2003年,由IT精英和白帽黑客共同
2025年想做黑客?推荐给你4本高质量黑客书籍,让你彻底研究黑客编程技术书!
写在开头在开始之前,我想说的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一
职场乾坤之坤卦
人生百态千悟
乾卦对应着天、男性、阳刚等,强调自强不息。坤卦对应着地、女性、阴柔等,强调厚德载物。坤卦为64卦中的第二卦,有了乾、坤这第一、第二卦,才有了后续的62卦。也因为有了天、地,便有了顶天立地创业的空间。图一01地位初爻为“履霜,坚冰至”。作为新入职的员工,为了尽快掌握公司的制度、工作内容,适应其节奏及方式等,必须要有举一反三的能力。当脚踩到初现的霜冻,那么就应该知道,很快深冬就要来临,厚厚的积冰即将出
省妞怎么赚钱?详细解说使用流程
省妞返利最高
在当今这个充满消费诱惑的时代,如何聪明地消费、省钱甚至赚钱成为了许多人的关注焦点。省妞APP作为一款集购物优惠、高额返利、社交分享于一体的综合性平台,凭借其靠谱性、高返利和丰富的优惠活动,成为了众多消费者的首选。下面,我们将详细解说省妞APP的赚钱方式及使用流程,并推荐其官方直升团长邀请码。省妞APP的靠谱性首先,省妞APP拥有正规的企业认证,其运营主体经过相关部门的严格审核,具备合法经营的资质和
3篇5章2节:绘制临床研究中的趋势图与ROC曲线
MD分析
用R探索医药数据科学 信息可视化 r语言 r语言-4.2.1 数据分析 趋势变化图 模型性能评估
在医学统计分析与数据科学实践中,趋势图与ROC曲线不仅是可视化的“门面担当”,更是揭示数据背后规律与诊断性能的核心工具。无论是观察血压、血糖等临床指标随时间或干预手段的变化,还是评估模型的判别能力与诊断准确性,一幅设计得当的图表,往往胜过千言万语。本文围绕R语言中两个功能强大的可视化函数展开,深入剖析它们在实际科研中的应用技巧与美化策略。通过案例演示与参数讲解,你将学会如何绘制清晰、美观、信息量丰
2/5 碎碎念
卓橙爱读书
阿错这几天感冒,喉咙有点痛。感觉喉咙一痛就让他化身小公举了,这个不想吃,那个没胃口。想想自己怀孕时犯恶心依然狂吃海塞,我真是汉子心妹子身。也可能是因为我没给他煮稀饭端烂面条,所以控诉我了。但我怀孕时在公司没胃口每天都吃的辣酱拌饭啊。也许是我怀孕时责任太重,不能相提并论。但我感冒的时候好像也没有缺过一顿饭啊,真的想不起来了……即便胃口差也会逼着自己少吃点,好像刚刚感冒好不久,真的不记得自己有哪天没吃
天性识别五福觉察日记2023年2月1日
琨姐坤学院智慧家庭陪伴老师
坤学院会长天性识别五福觉察日记姓名:李琨所在团队:4团颜色偏好:绿色1.我今天颜色偏好上发掘自己的优势故事(五大模式)思维模式:问题思维到结果思维转变。31号一个人带仨娃开七个多小时车回到天津,奶奶要到元宵节以后才能过来帮忙,家里要收拾,三宝幼儿园接送,大宝二宝思维导图学习,我们正月十一开始上班,很多事情放在一起,心态竟能如此平静,跟孩子也能不着急了,尽可能用知止的状态活当下,当下即未来。2月1日
buntu 22.04 上离线安装Docker 25.0.5(二)
努力一点948
底层ubuntu系统入门 docker 容器 运维 人工智能 linux 服务器 gpu算力
以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作地址:星宇科技|GPU服务器高性能云主机云服务器-登录相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客兑换码要是过期了,可以私信我获取最新兑换码!!!之所以推荐给大家使用,是因为上面的云主机目前是免费使用的,不需要大家再去安装虚拟机,部署虚拟机,环境都搭配好了,非常适合新手入门,减少搭建的时间,把时
FastAPI 中,数据库模型(通常使用 SQLAlchemy 定义)和接口模型(使用 Pydantic 定义的 schemas)的差异
在FastAPI中,数据库模型(通常使用SQLAlchemy定义)和接口模型(使用Pydantic定义的schemas)虽然都用于表示数据结构,但它们有明确的职责区分。以下是它们的核心区别和协作方式:1.数据库模型(Models)位置:通常在models.py中定义技术:使用SQLAlchemyORM目的:直接映射数据库表结构,处理数据库操作特点:fromsqlalchemyimportColum
系统设计时平衡超时时间与多因素认证(MFA)带来的用户体验下降
Alex艾力的IT数字空间
ux 架构 中间件 微服务 测试用例 功能测试 产品经理
金融系统中,平衡超时时间与多因素认证(MFA)带来的用户体验下降,需通过动态策略、技术优化和用户感知增强实现安全与便捷的协同一、动态调整认证强度基于风险的分级认证低风险场景(如常规查询):缩短超时时间(如5分钟),但减少MFA层级(仅密码+设备指纹)。高风险场景(如转账、密码修改):延长超时时间(如10分钟),但强制启用MFA(密码+短信验证码+生物识别)。异常行为触发:通过AI分析登录地点、设备
亲爱的小孩
阳光嗨
亲爱的小孩,你好!今天六一节快乐吗?有人关心你,理解你,相信你,陪着你吗?我知道你很爱你的父母,相信他们说的话,更相信他们为了你好,相信父母是爱你的。有时候你是受伤的:当你被爸妈责怪的时候你会委屈,因为他们还没等你把话说完,说清楚,就替你得出结论,做出“好的”安排。我知道你也会生气、愤怒,因为爸妈有时候会说,你再顶嘴试试看,没大没小,不懂礼貌,你害怕他们会发怒会惩罚或者抛弃你,于是你咽下这口气。有
Selenium 处理表单、弹窗与文件上传:从基础到实战
二向箔reverse
selenium 爬虫 自动化
在Web自动化领域,表单交互、弹窗处理和文件上传是最常见也最容易踩坑的场景。想象一下:你编写的脚本明明定位到了输入框,却无法输入文字;点击按钮后弹出的对话框让脚本瞬间“卡壳”;好不容易找到文件上传按钮,却发现Selenium无法直接操作系统文件选择框……这些问题往往让新手头疼不已。本文将系统讲解Selenium在这三类场景中的解决方案,结合实战案例帮你突破瓶颈。一、表单处理:搞定输入、选择与提交网
不浪费≠节俭
松仁儿
一粥一饭,当思来处不易;半丝半缕,恒念物力维艰。节俭,历来都是中华民族的美德,我们从小接受的教育也是节约光荣浪费可耻。近来,商务部正会同相关部门研究制定制止餐饮浪费的相关政策,建议引导餐饮网科学消费,不误导消费者超量点餐,推行N-1点餐模式。为响应国家号召,网上出现一些说法,有人建议十个人点九个人的菜,更有甚者,十个人点八个人的菜。基于此,我和一个朋友开始讨论不浪费。他理解的不浪费不等于节俭。比如
六项精进
壹念百花開_
六项精进又一次迎来了6位新家人的家人,学习会时听到家人们发自肺腑的分享,自己也好像又参加了一次,当时的一幕幕也在脑海中闪现,那充实的三天,仿佛就在昨天。真的很感谢家人们的真诚分享,感谢公司不仅提供给我工作机会,还为我创造这么好的学习机会,感谢杜总给我们提供的这么好的平台,让我能够在工作中继续学习、锻炼、成长。当我真正的静下心来思考的时候,才发现自己肚子里的那点墨水与公司的需要存在着一定的差距,我只
《感恩日志》第【406】天
enhui1994
感恩感谢相遇。今天刘慧姐组的局,让我了解到圈子以外的东西,隔行如隔山,只是术业有专攻,做好自己的本职工作就好了。感恩感谢交通工具。今天感恩感谢夏琳姐,把我捎到徐堡,工作结束后,刚好碰到回城出租车,没耽误什么时间,很顺利。感恩感谢我家荣宝做的晚饭,被人照顾的感觉真好。图片发自App
少吃这5类食物 你也能拥有莫文蔚的“神仙身材”
有良方
近日48岁的莫文蔚举办了自己的世界巡回演唱会,一身金色透明纱裙惊艳亮相,瞬间把这位不老女神送上热搜。满屏大长腿,没有一丝多余的赘肉,让我们忍不住惊呼“这是什么神仙身材?”“莫文蔚真的48岁了?”还有网友发出感叹:“莫文蔚的腿才是真的腿,我的腿只是代步工具。”据说,“腿精”莫文蔚还为她的腿投保了3000万。为什么人家的48岁活的像18岁呢?莫文蔚的工作人员透露:敲黑板!我已经为大家划出了重点!想和莫
用MiddleGenIDE工具生成hibernate的POJO(根据数据表生成POJO类)
AdyZhang
POJO eclipse Hibernate MiddleGenIDE
推荐:MiddlegenIDE插件, 是一个Eclipse 插件. 用它可以直接连接到数据库, 根据表按照一定的HIBERNATE规则作出BEAN和对应的XML ,用完后你可以手动删除它加载的JAR包和XML文件! 今天开始试着使用
.9.png
Cb123456
android
“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png
智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。
我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边
算法的效率
天子之骄
算法效率 复杂度 最坏情况运行时间 大O阶 平均情况运行时间
算法的效率
效率是速度和空间消耗的度量。集中考虑程序的速度,也称运行时间或执行时间,用复杂度的阶(O)这一标准来衡量。空间的消耗或需求也可以用大O表示,而且它总是小于或等于时间需求。
以下是我的学习笔记:
1.求值与霍纳法则,即为秦九韶公式。
2.测定运行时间的最可靠方法是计数对运行时间有贡献的基本操作的执行次数。运行时间与这个计数成正比。
java数据结构
何必如此
java 数据结构
Java 数据结构
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:
枚举(Enumeration)
位集合(BitSet)
向量(Vector)
栈(Stack)
字典(Dictionary)
哈希表(Hashtable)
属性(Properties)
以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collect
MybatisHelloWorld
3213213333332132
//测试入口TestMyBatis
package com.base.helloworld.test;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibat
Java|urlrewrite|URL重写|多个参数
7454103
java xml Web 工作
个人工作经验! 如有不当之处,敬请指点
1.0 web -info 目录下建立 urlrewrite.xml 文件 类似如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE u
达梦数据库+ibatis
darkranger
sql mysql ibatis SQL Server
--插入数据方面
如果您需要数据库自增...
那么在插入的时候不需要指定自增列.
如果想自己指定ID列的值, 那么要设置
set identity_insert 数据库名.模式名.表名;
----然后插入数据;
example:
create table zhabei.test(
id bigint identity(1,1) primary key,
nam
XML 解析 四种方式
aijuans
android
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object
spring中配置文件占位符的使用
avords
1.类
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.o
前端工程化-公共模块的依赖和常用的工作流
bee1314
webpack
题记: 一个人的项目,还有工程化的问题嘛? 我们在推进模块化和组件化的过程中,肯定会不断的沉淀出我们项目的模块和组件。对于这些沉淀出的模块和组件怎么管理?另外怎么依赖也是个问题? 你真的想这样嘛? var BreadCrumb = require(‘../../../../uikit/breadcrumb’); //真心ugly。
上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?
bijian1013
项目管理 沟通 IT职业规划
问题:上司说「看你每天准时下班就知道你工作量不饱和」,如何回应
正常下班时间6点,只要是6点半前下班的,上司都认为没有加班。
Eno-Bea回答,注重感受,不一定是别人的
虽然我不知道你具体从事什么工作与职业,但是我大概猜测,你是从事一项不太容易出现阶段性成果的工作
TortoiseSVN,过滤文件
征客丶
SVN
环境:
TortoiseSVN 1.8
配置:
在文件夹空白处右键
选择 TortoiseSVN -> Settings
在 Global ignote pattern 中添加要过滤的文件:
多类型用英文空格分开
*name : 过滤所有名称为 name 的文件或文件夹
*.name : 过滤所有后缀为 name 的文件或文件夹
--------
【Flume二】HDFS sink细说
bit1129
Flume
1. Flume配置
a1.sources=r1
a1.channels=c1
a1.sinks=k1
###Flume负责启动44444端口
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
a1.sources.r1.port=44444
a1.sources.r1.chan
The Eight Myths of Erlang Performance
bookjovi
erlang
erlang有一篇guide很有意思: http://www.erlang.org/doc/efficiency_guide
里面有个The Eight Myths of Erlang Performance: http://www.erlang.org/doc/efficiency_guide/myths.html
Myth: Funs are sl
java多线程网络传输文件(非同步)-2008-08-17
ljy325
java 多线程 socket
利用 Socket 套接字进行面向连接通信的编程。客户端读取本地文件并发送;服务器接收文件并保存到本地文件系统中。
使用说明:请将TransferClient, TransferServer, TempFile三个类编译,他们的类包是FileServer.
客户端:
修改TransferClient: serPort, serIP, filePath, blockNum,的值来符合您机器的系
读《研磨设计模式》-代码笔记-模板方法模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
配置心得
chenyu19891124
配置
时间就这样不知不觉的走过了一个春夏秋冬,转眼间来公司已经一年了,感觉时间过的很快,时间老人总是这样不停走,从来没停歇过。
作为一名新手的配置管理员,刚开始真的是对配置管理是一点不懂,就只听说咱们公司配置主要是负责升级,而具体该怎么做却一点都不了解。经过老员工的一点点讲解,慢慢的对配置有了初步了解,对自己所在的岗位也慢慢的了解。
做了一年的配置管理给自总结下:
1.改变
从一个以前对配置毫无
对“带条件选择的并行汇聚路由问题”的再思考
comsci
算法 工作 软件测试 嵌入式 领域模型
2008年上半年,我在设计并开发基于”JWFD流程系统“的商业化改进型引擎的时候,由于采用了新的嵌入式公式模块而导致出现“带条件选择的并行汇聚路由问题”(请参考2009-02-27博文),当时对这个问题的解决办法是采用基于拓扑结构的处理思想,对汇聚点的实际前驱分支节点通过算法预测出来,然后进行处理,简单的说就是找到造成这个汇聚模型的分支起点,对这个起始分支节点实际走的路径数进行计算,然后把这个实际
Oracle 10g 的clusterware 32位 下载地址
daizj
oracle
Oracle 10g 的clusterware 32位 下载地址
http://pan.baidu.com/share/link?shareid=531580&uk=421021908
http://pan.baidu.com/share/link?shareid=137223&uk=321552738
http://pan.baidu.com/share/l
非常好的介绍:Linux定时执行工具cron
dongwei_6688
linux
Linux经过十多年的发展,很多用户都很了解Linux了,这里介绍一下Linux下cron的理解,和大家讨论讨论。cron是一个Linux 定时执行工具,可以在无需人工干预的情况下运行作业,本文档不讲cron实现原理,主要讲一下Linux定时执行工具cron的具体使用及简单介绍。
新增调度任务推荐使用crontab -e命令添加自定义的任务(编辑的是/var/spool/cron下对应用户的cr
Yii assets目录生成及修改
dcj3sjt126com
yii
assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问。
assets设置对应的方法位置 \framework\web\CAssetManager.php
assets配置方法 在m
mac工作软件推荐
dcj3sjt126com
mac
mac上的Terminal + bash + screen组合现在已经非常好用了,但是还是经不起iterm+zsh+tmux的冲击。在同事的强烈推荐下,趁着升级mac系统的机会,顺便也切换到iterm+zsh+tmux的环境下了。
我为什么要要iterm2
切换过来也是脑袋一热的冲动,我也调查过一些资料,看了下iterm的一些优点:
* 兼容性好,远程服务器 vi 什么的低版本能很好兼
Memcached(三)、封装Memcached和Ehcache
frank1234
memcached ehcache spring ioc
本文对Ehcache和Memcached进行了简单的封装,这样对于客户端程序无需了解ehcache和memcached的差异,仅需要配置缓存的Provider类就可以在二者之间进行切换,Provider实现类通过Spring IoC注入。
cache.xml
<?xml version="1.0" encoding="UTF-8"?>
Remove Duplicates from Sorted List II
hcx2013
remove
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,Given 1->2->3->3->4->4->5,
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
MySQL安装文档
liyong0802
mysql
工作中用到的MySQL可能安装在两种操作系统中,即Windows系统和Linux系统。以Linux系统中情况居多。
安装在Windows系统时与其它Windows应用程序相同按照安装向导一直下一步就即,这里就不具体介绍,本文档只介绍Linux系统下MySQL的安装步骤。
Linux系统下安装MySQL分为三种:RPM包安装、二进制包安装和源码包安装。二
使用VS2010构建HotSpot工程
p2p2500
HotSpot OpenJDK VS2010
1. 下载OpenJDK7的源码:
http://download.java.net/openjdk/jdk7
http://download.java.net/openjdk/
2. 环境配置
▶
Oracle实用功能之分组后列合并
seandeng888
oracle 分组 实用功能 合并
1 实例解析
由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下:
表test 数据如下:
ID,SUBJECTCODE,DIMCODE,VALUE
1&nbs
Java定时任务注解方式实现
tuoni
java spring jvm xml jni
Spring 注解的定时任务,有如下两种方式:
第一种:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http
11大Java开源中文分词器的使用方法和分词效果对比
yangshangchuan
word分词器 ansj分词器 Stanford分词器 FudanNLP分词器 HanLP分词器
本文的目标有两个:
1、学会使用11大Java开源中文分词器
2、对比分析11大Java开源中文分词器的分词效果
本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。
11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:
/**
* 获取文本的所有分词结果, 对比