从JDK源码看StringBuffer
Java 中处理字符串时经常使用的 String 是一个常量,一旦创建后不能被改变。为了提供可修改的操作,引入了 StringBuilder 类,可看前面的文章《从JDK源码看StringBuilder》。但它不是线程安全的,只用在单线程场景下。所以引入了线程安全的 Strin…
开源一个机器学习文本分析项目
A text analyzer which is based on machine learning that can analyze text. So far, it supports hot word extracting, text classification, par…
直接内存和堆内存谁快
直接内存大多时候也被称为堆外内存,自从 JDK 引入 NIO 后,直接内存的使用也越来越普遍。通过 native 方法可以分配堆外内存,通过 DirectByteBuffer 对象来操作。 直接内存不属于 Java 堆,所以它不受堆大小限制,但是它受物理内存大小的限制。 可以通…
人工智能六十多年
作为吃瓜群众,多数人对人工智能的了解主要是通过科幻片,里面的机器人拥有人类的思维和超凡的能力。然而目前现实的人工智能却只是很弱的人工智能,它仅仅是功能单一的某个程序。 人工智能六十多年的发展经历了几度繁荣和衰落,虽然已取得不错的进展,然而现实与理想的差距还是很大,前进道路曲折。…
从JDK源码看StringBuilder
在 Java 中处理字符串时经常会使用 String 类,实际上 String 对象的值是一个常量,一旦创建后不能被改变。正是因为其不可变,所以也无法进行修改操作,只有不断地 new 出新的 String 对象。 为此 Java 引入了可变字符串变量 StringBuilder…
一图简看基于搜索的问答机器人设计
对于 chatbot,现在学界更流行的实现方式是基于深度学习和强化学习,比如seq2seq模型,具体可参考前面的文章《深度学习的seq2seq模型》。 而对于工业界,直接用 seq2seq 模型来实现端对端的还是几乎没有的,但在很多模块的处理也开始引入深度学习,除此之外也会尝试…
Java9后String的空间优化
据我所知 Java 开发人员几乎任何时候都会想到 String,字符串确实已经成为最常用的类了,而且是大量使用。我们都知道,String 其实是封装了字符,里面必须由字符或字节数组来存放,从 Java9 开始 Java 语言开发者对 String 做了一些空间的优化。 JDK9…
双向循环神经网络+条件随机场进行分词
目前 NLP 领域的很多任务基本都会朝深度学习、注意力模型、半监督等方向发展,而且确实也取得了更好的效果,而有些也会把深度学习和传统机器学习结合起来,都能有不错的性能提升。这里讲一个用深度学习和机器学习结合来做分词。 分词就是将一句话按照最合理的单词分开,英语一般就没有这个麻烦…
Java对象在JVM中长啥样
Java 是门面向对象的开发语言,那么我们自己编写的 Java 类生成的对象是什么样的?它肯定保存在虚拟机的内存中,但它以怎样的结构来保存的呢?带着疑问往下看看。 Java 层的开发可能不太熟悉 Klass,但肯定熟悉 class,我们只要知道 Klass 是 class 在 …
神经网络原理的可视化
神经网络具有很强的学习能力和自适应自组织能力,而且随着隐含层的数量增大学习能力也将变得更强,因此目前很多场景都使用神经网络,比如深度学习,我们更熟悉的就是阿法狗。 神经网络已经有很多变种,比如卷积神经网络、循环神经网络等等。 感知器是一种最基础的神经网络,他只有输入层和输出层,…
读《Linux之父自传-只是为了好玩》
很久前看了《Linux之父林纳斯自传-只是为了好玩》,趁有空写下些东西。Linux几乎作为最伟大的开源项目,我觉得跟机器打交道的人都应该了解下它是怎么诞生的。 就是那个很在意自己长了个大鼻子的人,1969年出生,从小受外公影响并从十一岁就开始捣鼓计算机,而且成功写出了自己的第一…
Java线程的调度
线程调度一般指的是系统为线程分配处理器使用权的过程,这个过程会产生上下文切换,即操作系统的CPU利用时间片轮转的方式给每个任务分配一定的执行时间,然后把当前任务状态保存下来,接着加载下一任务的状态并执行,它是一个状态保存与加载的过程。 一般线程调度模式分为两种——抢占式调度和协…
Java线程的CPU时间片
当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield()方法。 当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上。 当前运行线程结束,即运行完run()方法里…
如何生成指定分布的随机数
对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 c++ 中有random()函数,java 中有 Random 类,python 有 random 模块等等。都能很方便生成随机变量,但它们有一个特点,那就是都服从均匀分布,而有些场景需要要生成…
乐观的并发策略——基于CAS的自旋
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题;而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后不成功。这就是悲观锁与乐观锁的区别,悲观锁会把整个对象加锁占为自有后才去做操作…
智能算法之提升方法
提升方法的核心思想是通过将多个效果很一般的分类器(弱分类器)组合起来综合考虑,以实现一个效果较好的分类器,这就像“三个臭皮匠赛过诸葛亮”。弱学习者学习出来的效果可能只比随机分类器效果好一点,于是有人提出用一个弱分类器集合生成一个强分类器。 因为是将弱分类器提升为强分类器,所以叫…
悲观的并发策略——synchronized互斥锁
互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁释放后才能重新进行竞争。 对于Java开发人员,最熟悉的肯定就是用synchronized关键词完成锁功能,在涉及到多线程并发时,对于一些变量,…
条件随机场实现命名实体识别
NLP 被很多人称为人工智能皇冠上的明珠,可见其在 AI 领域的重要性,而命名实体识别(NER)又一直是 NLP 领域的研究热点,所以这块任务是 NLP 必谈的。 NER 早期的实现主要是基于词典和规则,然后是基于传统的机器学习,比如 HMM、MEMM 和 CRF。随后深度学习…
深入谈谈String.intern()在JVM的实现
String 类的intern方法可能大家比较少用也比较陌生,虽然实际项目中并不太建议使用intern方法,可以在 Java 层来实现类似的池,但我们还是要知道它的原理机制不是。 通过该方法可以返回一个字符串标准对象,JVM 有一个专门的字符串常量池来维护这些标准对象,常量池是…
双向循环神经网络及TensorFlow实现
循环神经网络得益于其记忆功能使其擅长处理序列方面的问题,它能提取序列之间的特征,进而对序列输出进行预测。比如我说“我肚子饿了,准备去xx”,那么根据前面的序列输入来预测“xx”很可能就是“吃饭”。 所谓的单向循环神经网络其实就是常见的循环神经网络,可以看到t时刻、t-1时刻、t…