Anonymous World

迷失仙境


  • 首页

  • 标签

  • 分类

  • 归档

NLTK+LTP进行中文处理

发表于 2019-11-02 | 分类于 NLP
字数统计: 1,157
安装NLTK

NLTK是一个NLP工作平台,可以和一些NLP库配合使用。

激活虚拟环境,因为原本已经安装了 pyltp ,不想再开新的环境了…

继续安装:

1
2
3
4
pip install numpy
conda install scipy
pip install Tornado
pip install nltk

前两个是高性能数学计算软件包,第三个是网络包

作为一个非洲人,果然安装nltk的过程并不顺利

报错信息:

1
2
Could not find a version that satisfies the requirement nltk (from versions: )
No matching distribution found for nltk

切换成 conda 命令,居然好了…本非颇为不适

阅读全文 »

遥远的BERT模型...

发表于 2019-11-01 | 分类于 NLP
字数统计: 813

Transformer 是谷歌大脑在2017年底发表的论文 attention is all you need 文章解读 中所提出来的seq2seq模型,BERT就是从transformer 中衍生出来的预训练语言模型。

现在很多处理效果非常好的模型,都融合了BERT , 模型排名

transformer原理

相比于LSTM的迭代训练,transformer的训练是并行的,使用了位置嵌入来理解语言的顺序,使用自注意力机制和全连接层来进行计算。

主要分为两部分:

  • 编码器:把自然语言序列映射成隐藏层的数学表达

    1. 字向量与位置嵌入:由于没有迭代计算需要提供每个字的位置信息,从而让模型学到位置之间的依赖关系和自然语言的时序特征

    2. 自注意力机制:求词向量的点积,即余弦距离,最后得到 N * N 注意力矩阵,第 i 行表示第 i 个字 与 每一个字的相关程度,沿着最后一个维度做softmax归一化,是概率之和为1形成概率分布。

      注意力矩阵的作用就是得到一个权重的概率分布,然后用其点乘词向量,就可以得到加权后的线性组合,使得每个字向量都含有当前句子内所有字向量的信息

    3. 残差连接:避免梯度消失

    4. 归一化:把隐藏层归一为标准正态分布,加速收敛

    5. 前馈:进行两层线性映射并用激活函数激活;然后重复3、4

  • 解码器:把隐藏层映射为自然语言序列,用于下游的命名实体识别、语义关系抽取、摘要生成、情感分类等

阅读全文 »

HMM与Viterbi算法

发表于 2019-10-31 | 分类于 NLP
字数统计: 956

HMM作为一个生成式概率图模型,可以被用来处理序列标注的问题,如分词、词性标注,以及命名实体标注。

它把分词问题转为字的分类问题(序列标注问题)——由字构词,不依赖事先编制好的词表,但仍然需要分好词的训练语料 ,单字S,开始B-中间M-结尾E , 已知观察序列求对应的形式化序列

HMM描述的是一个从 隐状态序列(如实体标记,所属集合是N种标签) 生成 可观测结果(如可读文本,所属集合是M个汉字) 的过程

第一假设是第 t 个时刻的隐状态只跟前一时刻 t - 1 时刻的隐状态有关,计算一个转移概率 —— N * N 的转移概率矩阵

第二个假设是观测独立,任意时刻观测 $o_t$ 只依赖 当前时刻的 隐状态 $i_t$, 计算一个发射概率—— N * M 的发射概率矩阵

阅读全文 »

KG子任务划分

发表于 2019-10-30 | 分类于 NLP
字数统计: 1,077

首先我们需要考虑的是目前的搜索存在的问题。

当我们打开一个搜索引擎的时候,目前其实是想得到答案。然而,现在的互联网是一个基于HTML的网页结构以及相互直接通过URL相互链接。这种链接中有太多的无用信息,在其中寻找所需的信息往往是一个费时费力的过程。基于知识图谱的问答或搜索系统,可以从一定程度上解决这个问题。

KG的本质

  • Web角度:像建立文本之间的超链接一样建立数据之间的语义链接,并支持语义搜索
  • NLP视角:怎样从文本中抽取语义和结构化数据
  • KR视角:怎样利用计算机符号来表示和处理知识
  • AI视角:怎样利用知识库来辅助理解人的语言
  • DB视角:用图的方式去存储知识

传统KE的问题

传统知识工程在规则明确、边界清晰、应用封闭的应用场景取得了巨大成功。缺点是体系是自上而下的:严重依赖专家和人的干预 。

解决方式:大规模自动知识获取 。基于大数据、ML,充分利用现代计算机的强大算力,从大量数据中自动进行信息挖掘。

这种数据驱动的知识获取是自下而上的,以维基百科页面内容为例:

graph LR

A[Wikipedia] -->B(预处理器 
schema定义
训练数据构造) B --> C{是否分类} C -->|未分类| D[分类器
文本,句法分类] C -->|已分类| E[抽取器
CRFmodel] D --> E E --> F[infobox]

以其为基础建立的数据库有:YAGO、 CN-DBpedia(以后仔细学习下API)等

知识图谱富含实体、概念(is)、属性(has)、关系等信息。以RDF或图的形式存储

阅读全文 »

LSTM模型浅析

发表于 2019-10-29 | 分类于 NLP
字数统计: 948

在对神经网络类算法模型一无所知的时候,我就曾想过信息与时序的问题,并陷入混乱中…今天开始看BiLSTM的原理时,才发现早就有了相应的解决方案…

神经网络的灵感来自于人脑神经元的工作方式,然而为了在计算机中实现,依然是个跟加权有关的数学问题,权重决定了信息的重要程度。每个节点虽然有多个输入输出,但是一种状态下只是二值问题。神经网络的隐藏层越多,处理复杂问题的能力也就越强。

历史模型的局限

普通的神经网络(NN):各输入层之间没有运算连接,无法表示上下文关系

  • $h_t = sigmoid(W_x * x_t + b)$

循环神经网络(RNN): 其实比较类似于进位加法链,上一次运算的结果会加入到下一次运算中。这种基于时序的处理,只包含了上文信息,而忽略了下文信息。如果用增加依赖步数的方式,会导致把精力都集中在记忆大量的输入信息上,从而使建模能力下降。还有一个问题是RNN比较难以训练,逐步求导的梯度下降方式可能产生梯度爆炸问题

  • $h_t = tanh(W_x x_t + W_h h_{t-1} +b)$

双向循环神经网络(BRNN): 再增加一个向后的网络,使得未来信息被包含进来。然而,仍然存在存取的上下文信息范围有限的问题,随着网络环路的不断递归,隐含层的影响是会不断衰减的,即长期依赖问题,这就引出了关于权重的考虑,什么样的信息是重要的,需要在后续的计算中一直保留呢? 于是出现了 LSTM

长短期记忆(LSTM): 核心是基于门函数的自我衡量的机制,通过记忆门与遗忘门来控制之前的影响,相比于RNN,多了一个输入和输出,它们控制的是长期记忆。LSTM用细胞状态来表示内部复杂的处理过程。

双向长短期记忆(BiLSTM): 即增加一个反向的LSTM。两个方向的结果拼接后得最终结果。

门控循环单元(GRU):将忘记和输入门结合成一个“更新门”,它还合并了单元状态和隐藏状态,并做了一些其他更改。由此产生的模型比标准的LSTM模型更简单,并且越来越受欢迎。

阅读全文 »

KBQA中的一些问题

发表于 2019-10-28 | 分类于 NLP
字数统计: 596

QA知识来源:结构化知识(KB)、半结构化知识、非结构化知识、文本摘要、机器翻译

这里的KB主要有:Freebase,DBPedia,Yago 等现有知识库

知识库KB:RDF + SPARQL,问题—在高异质性的KB中写SPARQL语句很困难

KBQA : 由于缩写、同义词、数学换算等可能导致失配 —> 同义转换 —> 用CRF 计算候选匹配排名 —> 有反馈的特定排名(要与用户交互,实现困难)

统计方法和神经学习方法的主要区别:

  • 统计:人工设计规则和特征;从数据中学习权重
  • 神经:特征和权重都是从数据中学习来的,需要极大的训练数据集

同义问题转换:从原始问句中抽象出实体(基于主题实体和上下文寻找抽象),将含抽象实体的问题通过重排转为已有问题模板。通过问题类型接口(基于Bi-LSTM)获取答案。

阅读全文 »

Socket编程实践

发表于 2019-10-26 | 分类于 network
字数统计: 2,333

之前写过socket编程的原理 , 正好高级网络实验课要写socket程序,故总结一下实践中的一些问题。

Winsock实现

由于我的系统是windows,所以采用Winsock接口。

MFC提供了两个类用以封装Windows Sockets API

  • CAsyncSocket类:具有一定网络编程经验的开发人员
  • CSocket类:由CAsyncSocket类派生,简化网络编程

需要包含Winsock2.h,Winsock32.dll和ws2_32.lib

端口选择:端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号

WinSock初始化

Windows 下的 socket 程序依赖 Winsock.dll 或 ws2_32.dll,必须提前加载。

调用任何一个Winsock函数之前都必须检查协议栈安装情况,使用函数WSAStartup() 调用winsock DLL

阅读全文 »

不能用一种猛兽克制另一种猛兽

发表于 2019-10-16 | 分类于 life
字数统计: 547

可能我身体里的电池是二手的,新奇和幻灭交织着,加剧了消耗,在极短时间将其拔空。

在椅子上呆坐了一会,预感到它即将从虚空的深渊里爬出来。

我们不能看到一个人生命中全部的雪,每个人都在他自己的生命里,孤独地过冬。

我坐在从起点站出发去往市里的公车上,头倚着窗户,脑海里盘旋着这句话。

我喜欢坐起点出发的公车,喜欢在非节假日,一个人逛街。当我的情绪被耗干的时候。

车上零星的上来几个老头老太太,到小学门口下车,挤成一团,早早地等着他们的小祖宗。路过很多绿河青柳,桥的名字都一律地很有诗意。很有人间气息,可我面无表情。

要飘到高空的时候,得用什么东西把自己绑住。于是我在一个个商场里进进出出。为了克制一只猛兽,我放出了另一只猛兽。它沉沉压着我的双肩,像浸过水的稻草。直到连体力都被抽干。

它们嗅了嗅干枯的躯壳,终于渐渐离去了。

坐着等公交的时候,心算了一下好像被多收了钱。可是完全不想动。最终还是回去找了她们重算,这样多的钱就可以打滴滴了。

总是这样,用各种莫名其妙的借口。消耗。

重又坐到宿舍的椅子上,反思着白天发生的事情。

每个人都是一个正弦波,频率和相位一致,才能共振。否则,要么充斥着恼人的冲突,要么甚至合为一条无波的曲线。

我的振幅太小了,大概始终只能当个谐波。被迫提高振幅,就会加剧消耗。又给自己找了一个完美借口。

八点了,想起来还没吃饭。拖着游魂般的步子,路过玩滑板的少年。

真实的灵魂,不能直视。

明日又在大地中完整,这才是我打碎一切的真情。

Anaconda、py2neo和Neo4j搭建KG简单环境

发表于 2019-10-12 | 分类于 NLP
字数统计: 919

安装Anaconda

官网下载地址

安装时不勾选Add Anaconda to my PATH environment variable因为勾选将会影响其他程序的使用

勾选Register Anaconda as my default Python 3.6

常用命令

参考

在Anaconda Prompt中输入 conda list ,可以查看已经安装的包名和版本号

创建虚拟环境conda create -n <env_name> <package_names> 如 conda create -n KGQA python=3.5

激活环境activate <env_name> 退出deactivate

在当前环境中安装包 conda install <package_name> , 然鹅很多包都没法用conda渠道安装,还是要用pip才行。根据本项目安装了flask、py2neo、pyltp和bs4

还可以用requirement.txt文件来批量安装依赖包conda install --yes --file requirements.txt

pyltp包安装出错解决

期间报错

1
PackagesNotFoundError: The following packages are not available from current channels: - pyltp

换成 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyltp 命令进行安装 ,仍然不行, 说是找不到wheels

找到了一个py3.5版本wheels源码链接, 参看

将下载好的文件放在此时Prompt命令行对应的文件夹中,如我的是 (KGQA) C:\Users\18771 然后执行pip install pyltp-0.2.1-cp35-cp35m-win_amd64.whl 即可安装成功wheels文件

输入conda list 发现有了pyltp安装包

阅读全文 »

Java前四章笔记

发表于 2019-10-11 | 分类于 Java
字数统计: 4,092

CH1

文档

参考书:Java编程思想(英文版第 4版) Java 核心技术(英文版第 9版)

补充知识:JavaEE 数据库 软件设计 Java虚拟机原理 Leetcode刷题

.java -> (编译器) -> .class -> (Java虚拟机) -> 机器码程序

编译:javac HelloWorldApp.java

运行:java HelloWorldApp arg1 arg2

JRE 只包含虚拟机,没有编译器

文档型注释:/* documentation /

main方法

public static void main(String[] args)

  • 以上写法只是通常用的:public和static的位置可以交换;args 可以任意命名,如argv;
  • 作为程序入口,必须是public 才能在任意地方被访问到
  • 由于在启动程序时还没有任何对象,所以只能static方法——无需使用对象就可以调用静态方法
  • 每个类可以有一个main方法,这是一个常用于对类进行单元测试的技巧。当该类所属的应用程序的main方法被执行时,该类本身的main将不会被执行
阅读全文 »
1…8910…13
Liana_Wang

Liana_Wang

虚己以游世,乘物以游心

125 日志
22 分类
94 标签
GitHub E-Mail
友链
  • 瑞哥上班又开始划水看书了
© 2018 — 2020 Liana_Wang
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4