Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

CA——术语和专有名词总结

Posted on 2019-10-23

本文主要总结计算广告(computational advertising)中的术语和专有名词

*<<计算广告>>中后面附录有很多计算广告相关的专有名词相关记录*
本文将长期持续更新,记录平时遇到计算广告专有名词


英文简写

  • IOE计算架构: IBM, Oracle, EMC(适用于规模不大但对于一致性和实时性要求较高的场景)
  • BI: Business Intelligence(商业智能)
  • DM: Direct Marketing(直接营销)
  • ROI: Return on Investment(投入产出比 = 总产出/总投入)
  • EDM: Email Direct Marketing(邮件营销广告)
  • GD: Guaranteed Delivery(担保式投送)
  • CPM: Cost per Mille(按千次展示付费)
  • CPC: Cost per Click
  • CPS: Cost per Sale

常见中英文对照

  • 付费内容: sponsored content
  • 商业化: monetization
  • 个性化推荐: personalized recommendation
  • 直接效果广告: direct response
  • 品牌广告: brand awareness
  • 横幅广告: banner ad
  • 交互式广告: playalble ad
  • 激励广告: incentive ad
  • 展示广告: display advertising
  • 合约广告: agreement-based advertising
  • 定向广告: targeted advertising
  • 受众定向: audience targeting
  • 在线分配: online allocation
  • 带约束优化: constrained optimization

NLP——UNILM论文阅读笔记

Posted on 2019-10-17

本文介绍了MSRA今年的一篇文章: UNILM: Unified Language Model Pre-training for Natural Language Understanding and Generation


UNILM基于三个预训练目标

  • Unidirectional LM:
  • Bidirectional LM:
  • Sequence2Sequence LM:

贡献

和BERT对比

  • BERT是双向模型,所以自然语言的生成(NLG)任务上不适用
  • UNILM采用三种(无监督的)LM目标,其中的Sequence2Sequence LM能够解决文本生成问题

其他一些优点

  • 仅使用一个LM(由Transformer构成), 在三个不同的预训练任务上共享参数, 泛化能力强
    • 参数共享: 不需要在不同的语言模型(对应不同的预训练任务)上使用不同的模型参数
    • 泛化能力强: 多个训练目标同时优化模型,使得模型能够避开因为训练目标引起的过拟合问题

模型结构介绍

结构图

  • 输入向量为 \(\vec{x} = (x_1, x_2,,,x_{|x|}\))
  • 输入向量表征与BERT相同,由Embedding层(三个Embedding层之和, 和BERT一样):
    • Token Embedding, WordPiece
    • Position Embedding
    • Segment Embedding, 由于UNILM会使用多个LM任务训练,所以Segment Embedding在模型中也扮演着LM标识的作用(对不同的LM目标使用不同的Segment Embeddings)
  • 主要网络(Backbone Network)为多层Transformer:
    • 每两个Transformer Blocks之间的Self-Attention Masks: For Each Transformer Block, 使用多头Self-Attention来聚合之前层出现的输入向量.(这里的Self-Attention使用了)
    • Transformer之间的Self-Attention机制决定了模型什么语言模型(任务)
    • 如图所示:
      • Bidirectional LM 对应的 Self-Attention Masks为全0的矩阵, 表示所有的Attention都不屏蔽 (attend to all tokens)
      • Left-to-Right LM 对应的 Self-Attention Masks为拼屏蔽右上三角的矩阵(左下三角全为0)
      • Right-to-Left LM 对应的 Self-Attention Masks为拼屏蔽左下三角的矩阵(右上三角全为0)
      • Seq-to-Seq LM 对应的 Self-Attention为
        • \(S_1\)-\(S_1\) 为全0(0表示开放), 对应为Bidirectional
        • \(S_1\)-\(S_2\) 为负无穷(负无穷表示屏蔽)
        • \(S_2\)-\(S_1\) 为全0
        • \(S_2\)-\(S_2\) 为屏蔽右上三角的矩阵(这里与Left-to-Right的情况相同)

按照结构图分析数据流

  • 对于一组输入向量 \(\{\vec{x}\}_{i=1}^{|x|} \), 初始编码为 \(\mathbf{H}^0 = [\vec{x}_1, \vec{x}_2,,,\vec{x}_{|\vec{x}|}]\)
  • 第一层后编码为上下文表征\(\mathbf{H}^1 = [\vec{h}_1^1, \vec{h}_2^1,,,\vec{h}_{|\vec{x}|}^1]\)
  • 第 \(l\) 层后编码为上下文表征\(\mathbf{H}^l = [\vec{h}_1^l, \vec{h}_2^l,,,\vec{h}_{|\vec{x}|}^l]\)
  • 每一层的 Transformer Block, 使用 multiple self-attention heads去聚合上一层的输出: L-layer的 Transformer对应的数学表达式为 \(\mathbf{H}^l = Transformer_l(\mathbf{H}^{l-1}), l \in [1, L]\)
  • Self-Attention Head \(\mathbf{A}_l\)的详细计算公式如下:
    $$
    \begin{align}
    \mathbf{H} = \mathbf{H}^{l-1}\mathbf{W}_l^Q \\
    \mathbf{K} = \mathbf{H}^{l-1}\mathbf{W}_l^K \\
    \mathbf{V} = \mathbf{H}^{l-1}\mathbf{W}_l^V \\
    \mathbf{A} = softmax(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}} + \mathbf{M})\mathbf{V}_l \\
    where, \quad \mathbf{M}_{ij} = 0 \ or \ -\infty
    \end{align}
    $$
    • \(\mathbf{M}\)中的值
      • \(-\infty\) 表示屏蔽Attention (prevent from Attention)
      • 0 表示允许 Attention (allow to Attention)

ML——样本不均衡问题

Posted on 2019-07-29

关于样本不均衡的解决

  • 相关实践: 某次比赛中, 训练集中正负样本数量分别为20663和569877,占比分别为3.499%和96.501%, 差别很大

基于数据的解决方案

过采样
  • 增加负样本的数量
    • 简单复制样本多次: 容易过拟合,模型变得复杂
    • 使用SMOTE算法采样: 对少数样本集\(S_{min}\)中的每一个样本 \(x\),从他的K近邻中随机选取一个样本\(y\), 然后在 \(x, y\) 之间随机选取一个新的点作为新合成的样本
      • 能降低过拟合风险
      • 需要一个样本间距离定义的函数,且对于少数样本多时选取最近邻的复杂度太大
      • 由于为每个样本都采样了,所以可能会增大类间重叠度(生成的样本可能是符合多数样本类别的,很容易造成生成没有意义甚至是噪声)
    • 使用Borderline-SMOTE算法优化SMOTE算法:
      • 只在分类边界上的少数样本进行采样
    • 使用ADASYN算法优化SMOTE算法:
      • 给不同的少数类样本合成不同个数的新样本
负采样
  • 减少正样本数量,让分类器更重视负样本
    • Easy Ensemble算法: 每次从 \(S_{maj}\) 中随机抽取子集 \(E\), 然后用 \(E + S_{min}\), 最后融合多个分类模型的结果
      • 融合模型时简单的可以对模型输出做均值(评估方式为AUC分数)或者投票(评估方式为分类精度)
    • Balance Cascade算法: 级联结构, 在每一级中从 \(S_{maj}\) 中随机抽取子集 \(E\), 然后用 \(E + S_{min}\) 训练当前级的分类其,然后将 \(S_{maj}\) 能正确被当前分类器正确分类的样本剔除, 剩下不能正确分类的样本进行下一级操作,重复若干次后得到级联结构,最终的输出结果是各级分类器结果的融合
      • 这里有点像是Boosting方法,对样本权重进行修改,使得模型更重视上次分类错误的样本

基于算法的解决方案

  • 修改模型的训练目标函数
    • 比如使用 AUC_ROC 的负数作为损失函数
    • 深度学习中可以使用Focal Loss代替传统的SGD
  • 也可以将问题转化为基于单类学习的异常检测问题
  • 单类学习(One Class Learning), 异常检测(Anomaly Detection) *
    • 单类学习(One Class Learning): 训练数据只有一个类别,学习一个能够远离这个类别样本的Boundary,比如
      • 单类别SVM(One Class SVM)
      • K近邻非参数方法

一个重要的特殊说明

  • 在深度神经网络中,如果样本类别不平衡,不要使用BN, 否则会出现问题

KG——图嵌入综述

Posted on 2019-06-18

本文主要介绍图嵌入(Graph Embedding)的发展和方法


图(Graph)

  • 结点和边的集合
  • 经典图论中的图, 知识图谱, 概率图模型中的图等
  • 传统的图算法包括(图论中的):
    • 最小生成树算法: Prim算法, Kruskal算法等
    • 最短路径算法: Dijkstra算法, Floyed算法等
  • 图神经网络算法包括
    • 图嵌入(Graph Embedding): 基于随机游走(Random Walk)生成路径
    • 图卷积神经网络(Graph CNN, GCN): 基于邻居汇聚实现

图嵌入

  • 用低维的向量来表示结点, 同时要求任意在图中相似的节点在向量空间中也接近.
  • 得到的节点的向量表示可以用来解决节点分类等下游任务

DeepWalk

  • 论文链接: DeepWalk KDD 2014
  • 核心思想: 通过将游走路径(walks)当做句子(sentences), 用从截断随机游走(truncated random walks)中得到的局部信息来学习隐式表示
    • 类似于Word2Vec, node对应word, walks对应sentence
  • 核心方法:
    • 随机游走方法进行采样
    • 使用Skip-Gram方法训练采样的样本
  • 实验结果:
    • 论文中展示了DeepWalk在多个多标签网络分类任务中的隐式表示, 比如BlogCatalog, Flickr和YouTube
    • 在某些实验中,仅仅用60%的训练数据即可到达(超过)所有Baseline方法
    • 在稀疏标记数据上F1分数表现良好

随机游走

  • 随机游走方法: 一种可重复访问(有放回采样)的深度优先遍历算法(DFS)
    • 给定起始访问节点A
    • 从A的邻居中随机采样一个节点B作为下一个节点
    • 从B的邻居中随机采样一个节点C作为下一个节点
    • ….
    • 直到序列长度满足truncated条件, 得到一个walk

Skip-Gram 训练

  • 对随机游走采样到的数据进行Skip-Gram训练
  • 最终得到每个节点的表示向量

Node2Vec

  • 论文链接: Node2Vec KDD 2016
  • 核心思想: 综合考虑DFS和BFS的图嵌入方法, 可以视为DeepWalk的一种扩展(DeepWalk的随机游走仅仅是考虑DFS的,不考虑BFS)

优化目标

  • Node2Vec要解决的问题: 找到一种从节点到embedding向量的映射函数\(f\), 最大化整体后验概率(乘积). 每个节点的后验概率为: 给定某个节点, 相邻节点出现的概率 \(Pr(N_S(u)|f(u))\)
    $$
    \begin{align}
    \max_f\sum_{u \in V} log Pr(N_S(u)|f(u))
    \end{align}
    $$

  • 为了简化上述问题,作者引入两个假设

    • 条件独立性(Conditional independence):
      $$
      \begin{align}
      Pr(N_S(u)|f(u)) = \prod_{n_i \in N_S(u)} Pr(n_i|f(u))
      \end{align}
      $$
    • 特征空间中的对称性(Symmetry in feature space): 假设源节点和邻居节点在特征空间中有对称
      $$
      \begin{align}
      Pr(n_i|f(u)) = \frac{exp(f(n_i)\cdot f(u))}{\prod_{v\in V}exp(f(v)\cdot f(u))}
      \end{align}
      $$
      • 本质上表达的是: 一个节点作为源节点或者邻近节点时都使用同一个特征向量表示
      • 理解: 特征向量的点乘(内积)表示两个点之间的关联程度?

KG——Neo4j使用笔记

Posted on 2019-06-08

本文主要记录Neo4j使用过程中的遇到的问题和解决方案等


安装与启动

安装

  • 安装Neo4j前,一般需要安装Java环境, Ubuntu自带的版本不行的话需要重新下载安装新的版本并设置环境变量
自动安装
  • Ubuntu上安装和卸载命令
    1
    2
    sudo apt-get install neo4j
    sudo apt-get remove neo4j
手动安装
  • 下载neo4j已经编译好的文件, 官网为http://www.neo4j.com/
    • 不要直接点download neo4j, 从官网选中products->neo4j database->拉到最下面选择Community Edition_>选择对应的release版本(.tar文件)下载即可
  • 将下载到的.tar文件解压到安装目录中(一般选择/usr/local/neo4j/)
  • 现已经安装成功,直接进入安装目录即可使用./bin/neo4j console启动neo4j数据库
  • 初始的账户和密码都是neo4j, 第一次登录需要重新设置密码

启动

  • 使用console启动

    1
    ./bin/neo4j console
    • terminal将输出实时运行log信息,关闭terminal,neo4j数据库随之关闭
    • 此时用其他电脑不能访问,只能本地电脑localhost:7474/browser访问
  • 查看启动状态

    1
    ./bin/neo4j status
  • 启动

    1
    ./bin/neo4j start
  • 停止

    1
    ./bin/neo4j stop
  • 默认访问端口: 7474, 比如本地访问网址为: localhost:7474/browser


Neo4J导入Turtle文件

Turtle简介

参考博客: https://blog.csdn.net/u011801161/article/details/78833958

  • Turtle是最常用的RDF序列化方式, 比RDF/XML更紧凑, 可读性比N-Triples更好
  • 其他序列化方式包括:
    • RDF/XML: 用XML格式来表示RDF数据
    • N-Triples: 用多个三元组来表示RDF数据集合,是最直观的表示方法,每一行表示一个三元组,方便机器解析和处理,DBpedia 是按照这个方式来发布数据的
    • RDFa: (The Resource Description Framework in Attributes)
    • JSON-LD

安装neosemantics插件

注意,这里要求neo4j安装方式是手动安装的,(自动安装的neo4j本人找不到/plugins目录),手动安装方式参考前面的安装流程

  • 下载插件release版本, 项目地址: https://github.com/neo4j-labs/neosemantics

    • 注意,下载时一定要查看版本与已经安装的neo4j数据库是否兼容,否则可能造成运行时异常,或者找不到方法名等
  • 按照项目中的README.md安装插件

    • 复制release版本到/plugins目录下

    • 修改/conf/neo4j.conf文件,添加一行

      1
      dbms.unmanaged_extension_classes=semantics.extension=/rdf
    • 重启neo4j服务器

    • 使用call dbms.procedures()测试是否安装成功

导入Turtle文件

  • 导入云端文件

    1
    CALL semantics.importRDF("https://raw.githubusercontent.com/jbarrasa/neosemantics/3.5/docs/rdf/nsmntx.ttl","Turtle")
  • 导入本地文件

    1
    CALL semantics.importRDF("file:///home/jiahong/neosemantics/3.5/docs/rdf/nsmntx.ttl","Turtle")

彻底清空Neo4J数据库

参考链接: https://blog.csdn.net/u012485480/article/details/83088818

使用Cypher语句

  • 直接使用下面的Cypher语句即可
    1
    match (n) detach delete n
特点
  • 无需操作文件
  • 无需停止和启动服务
  • 对于数据量大的情况下删除很慢(需要先查询再删除,内存可能会溢出)

删除数据库文件

  • 停止neo4j服务

    1
    sudo ./bin/neo4j stop
  • 删除./data/databases/graph.db目录

    1
    sudo rm -rf ./data/database/graph.db
  • 启动neo4j服务

    1
    sudo ./bin/neo4j start
特点
  • 需要删除文件操作
  • 需要停止和启动服务
  • 对于数据量大的情况下删除速度也非常快速

Neo4j约束

查看当前数据库中的所有约束

  • Cypher查询语句CQL
    1
    :schema

创建约束

1
create constraint on (p:Person) assert p.name is unique

删除约束

1
drop constraint on (p:Person) assert p.name is unique

节点的唯一性约束

  • 为某个标签在某个属性上创建唯一性约束

    1
    create constraint on (p:Person) assert p.name is unique
    • 创建唯一性约束后会自动为该标签对应的属性创建索引Index
    • 这里的索引为ON :Person(name) ONLINE (for uniqueness constraint)
    • 理解,因为要确保唯一性,所以需要索引加快每次插入节点前检索的效率
    • 手动创建索引(为了加快某个标签的某个属性的检索效率)的方法为:
      1
      create index on :Person(name)
  • 唯一性约束设置后,当写入重复的数据时,会报错

    Neo.ClientError.Schema.ConstraintValidationFailed
    Node(19718935) already exists with label Person and property name = ‘Joe’


节点操作

创建节点

  • 创建结点方式如下,其中p

    1
    create (p:Person{name:'Joe'})
    • 上面的句子创建了一个结点

    • 结点标签为: Person

      • 如果之前没有Person标签则新建Person标签
      • 如果没有添加索引,那么这个标签在所有Person标签的节点都被删除后也会自动消失
      • 如果添加了索引,则删除所有结点和相关索引后该标签会自动消失
    • 结点名称为: p

      • p本质上在这里是一个变量
      • 如果当前执行语句中对当前结点没有更多操作, 甚至可以省略节点名称p
        1
        create (:Person{name: 'Joe'})
    • 结点属性name的值为: ‘Joe’

      • 这个属性很有用, 可以在显示结点的时候直接在结点中显示出来”Joe”, 方便查看
      • 测试: 换成其他属性,比如属性a后, 在Neo4j可视化结点时是不显示的
      • name本身也可以省略
        1
        create (:Person)

删除结点

  • 删除标签为Person且名字为”Joe”的所有结点
    1
    match (p:Person{name:'Joe'}) delete p

标签操作

  • Neo4j中一般为节点创建一个标签即可,通常一些标准的知识图谱还会为同一个节点创建多个标签,说明这个节点属于多个标签
  • 节点的标签数量可以为0个,1个或多个
  • 没有标签的结点可通过id获取到
    1
    match (n) where id(n)=<node-id> return n

直接创建标签

  • 单个标签创建

    1
    create (<node-name>:<label-name>)
  • 多个标签创建

    1
    create (<node-name>:<label-name1>:<label-name2>:...:<label-nameN>)
    • 从很多知识图谱的例子来看,标签之间并不是完全的从属关系
    • 从属关系: Person:Student
    • 并列关系: Man:Student

给已有的节点添加标签

  • 使用set关键字添加标签标签
    1
    match (p:Person{name:'Joe'}) set p:Student

移除已有结点的标签

  • 使用remove关键字删除标签
    1
    match (p:Person{name:'Joe'}) remove p:Student

属性操作

  • 属性操作与标签操作类似, 使用的也是REMOVE和SET指令

直接创建属性

  • 使用CREATE指令
    1
    create (p:Person{name:'Joe'})

添加属性

  • 使用SET指令
    1
    match (p:Person{name:"Joe"}) set p.sex="male"

移除属性

  • 使用REMOVE指令
    1
    match (p:Person{name:"Joe"}) remove p.sex

各种操作命令总结

  • DELETE和CREATE指令用于删除节点和关联关系
  • REMOVE和SET指令用于删除标签和属性

Neo4j同时创建多个数据库

  • Neo4j中无法同时创建多个数据库,但是我们可以通过硬性和软性的方法分别实现等价功能

硬件上实现多个数据库

  • Neo4j的数据库文件为./data/databases/graph.db
    • 我们可以手动修改该文件的名称,然后重新创建文件实现
  • Neo4j的数据库配置文件为./conf/neo4j.conf
    • 可以修改#dbms.active_database=graph.db
    • 修改方法为将注释取消并且修改数据库为对应的数据库名称

软件上实现多个数据库

  • 为不同数据库的每个结点分别指定同一个数据库名称对应的标签
    • 比如”Docker”和”School”分别对应Docker知识图谱和学校知识图谱

Py2neo中结点如何被图识别?

  • 每个Python结点对象都有个唯一的标识符ID
    • 对应属性为identity
    • 对于从Graph中读出的结点,该属性为一个唯一的数值,与图数据库中结点的数值一致
    • 对于Python直接初始化的结点对象,该属性是None
  • 只要identity属性指定了,其他属性与数据库中的结点不同也可以的
    • 使用Graph.push(local_node)可以把本地结点更新到远处数据库中

Neo4j和JVM版本兼容问题

报错:

1
sudo ./bin/neo4j start

ERROR! Neo4j cannot be started using java version 1.8.0_222.

  • Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.
  • Please see https://neo4j.com/docs/ for Neo4j installation instructions.

解决方案

  • 安装对应版本的Java虚拟机(这里不会修改操作系统中原来的JAVA_HOME)

    1
    2
    sudo yum search jdk
    sudo yum install java-11-openjdk
  • 将对应的JAVA_HONE配置到Neo4j中(不修改原来系统中的JAVA_HOME)

    1
    sudo vim ./conf/neo4j.conf
  • 在文件最后一行添加

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.5.10-0.el7_7.x86_64

  • 重新启动neo4j

    1
    sudo ./bin/neo4j start
  • 注意: 以上方法都不会影响系统的JAVA_HOME和JAVA环境


Neo4j服务器配置远程访问功能

  • 打开配置文件

    1
    sudo vim ./conf/neo4j.conf
  • 将下面的语句注释取消

dbms.connectors.default_listen_address=0.0.0.0

  • 注意: 如果是服务器有防火墙,则需要把以下端口打开
    • 7474: http
    • 7687: bolt

Neo4j dump数据

  • 参考链接:https://www.jianshu.com/p/8c501b49adb7
  • dump原始数据库为.dump文件
    bin/neo4j-admin dump --database graph.db --to [dir]
    • 将数据库graph.db中的数据dump为.dump文件,文件名字自动生成为对应的数据库名称.dump
  • 将.dump文件导入到库中,(库需要停掉,并且库名不能有相同的名字)
    bin/neo4j-admin load --from graph.db.dump
    • 相当于是dump的逆向操作,数据库文件名称自动生成为前缀(注意不能与已经存在的数据库产生冲突)
  • 当不同版本库相互倒数据时需要把该参数开启,在conf/neo4j.conf中
    dbms.allow_format_migration=true
  • 这个dump命令只有在3.2.0才有的

Neo4j 4.0.0以后

  • 数据库文件夹变化了,不能像之前一样修改文件夹名为graph.db来更改数据库

使用Cypher查询数据库时的效率问题

  • 应该把Cypher语句和MySQL的查询语句联系起来看
  • Cypher从第一句开始匹配,然后依次匹配相关的每一句
  • 如果存在两条匹配过程的路径,而又需要把这两个路径联系起来,那么需要使用WHERE子句
    • WHERE语句非常有用,能避免很多不必要的问题,还能加入与或非的逻辑
  • 但是一定要注意,WHERE语句使用方便,但是容易造成检索慢的问题

举例

  • 尽量不要写出如下语句

    1
    2
    3
    4
    MATCH (image:Image), (base_image:BaseImage) 
    WHERE image.name = "ubuntu:latest" and
    (image)-[:hasBaseImage]->(base_image)
    RETURN base_image
    • 上述语句将匹配所有的Image对象
    • 然后匹配所有BaseImage对象
    • 接着执行WHERE子句过滤
    • 最后再返回
  • 上面的句子可以换成如下语句

    1
    2
    MATCH (image:Image{name:"ubuntu:latest"), (image)-[:hasBaseImage]->(base_image)
    RETURN base_image
    • 上面的句子直接找到名称为”ubuntu:latest“的镜像
    • 然后直接从改对象开始搜索相关关系的BaseImage
    • 最后返回
  • 实验表明:后面一句比前一句速度快很多

Bash——Shell中的环境变量高级解析方法

Posted on 2019-06-08

参考链接:https://www.cnblogs.com/flintlovesam/p/6677037.html

Shell中的${}、##和%%使用范例

  • 假设我们定义了一个变量为:

    1
    file=/dir1/dir2/dir3/my.file.txt
  • 可以用${ }分别替换得到不同的值:

    1
    2
    3
    4
    5
    6
    7
    8
    ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个 . 及其左边的字符串:txt
    ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
  • 记忆的方法为:

    • %和#分别在$的右边和左边
    • #是去掉左边(键盘上#在 $ 的左边)
    • %是去掉右边(键盘上% 在$ 的右边)
    • 单一符号是最小匹配;两个符号是最大匹配
      1
      2
      ${file:0:5}:提取最左边的 5 个字节:/dir1
      ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
  • 也可以对变量值里的字符串作替换:

    1
    2
    ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
  • 利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理)
    ${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
    ${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
    ${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
    ${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作处理)
    ${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為my.file.txt 。 (非空值時不作处理)
    ${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理)
    ${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值時不作处理)
    ${#var} 可计算出变量值的长度:
    ${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节

CSDN——打印博客

Posted on 2019-06-05

本文描述了如何打印干净的CSDN博客
参考博客: https://blog.csdn.net/sinat_42483341/article/details/89354222


使用JavaScript脚本

本方法适用在Chrome中

  • 在Chrome的调试窗口中,Console处输入下面的脚本即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (function(){
    $("#side").remove();
    $("#comment_title, #comment_list, #comment_bar, #comment_form, .announce, #ad_cen, #ad_bot").remove();
    $(".nav_top_2011, #header, #navigator").remove();
    $(".p4course_target, .comment-box, .recommend-box, #csdn-toolbar, #tool-box").remove();
    $("aside").remove();
    $(".tool-box").remove();
    $("main").css('display','content');
    $("main").css('float','left');
    window.print();

    $("tool-box").remove();
    })();

使用油猴插件

没搜索到相关脚本,有时间的时候自己实现一份

  • 基本功能
    • 在CSDN网站访问时添加一个”打印博客”按钮,点击即可打印

DL——xDeepFM

Posted on 2019-05-18

文本介绍xDeepFM的理论介绍,包括阅读论文后自己的理解

  • 上篇博客参考: DeepFM
  • 原始论文: xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems, KDD 2018

xDeepFM结构图

  • 显然, 上图中除了 CIN 部分以外,其他跟 DeepFM 基本是相同的, 所以我们本文主要讲述 CIN 组件部分, 其他的嵌入层等可参考我之前的博客DeepFM

CIN组件

Compressed Interaction Network

  • 论文中首先提出的就是这个CIN网络(Compressed Interaction Network)
  • 结构图如下:
  • 理解
    • 每个隐藏层都与一个池化操作连接到一起
    • 特征阶数与网络层数相关
    • 可以与 RNN 对应着看, 当前网络层由上一个隐藏层和一个额外输入确定
    • 确切的说: CIN 中当前层输入是前一层的隐藏层 + 原来的特征向量

KG——知识图谱的描述

Posted on 2019-05-16

参考博客: https://blog.csdn.net/u011801161/article/details/78833958


RDF

  • Resource Description Framework
  • 资源描述框架
  • 本质是一个数据模型
  • 提供了统一的描述实体和资源的标准
  • 形式上表现为主谓宾(SPO, Subject-Predication-Object)三元组, 也称为一条语句(Statement), 知识图谱中称为一条知识

RDF的序列化方法

参考博客: https://blog.csdn.net/u011801161/article/details/78833958

  • RDF/XML: 用XML格式来表示RDF数据

  • N-Triples: 用多个三元组来表示RDF数据集合,是最直观的表示方法,每一行表示一个三元组,方便机器解析和处理,DBpedia 是按照这个方式来发布数据的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/career> "足球运动员"^^string.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/fullName> "Ronaldo Luís Nazário de Lima"^^string.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/birthDate> "1976-09-18"^^date.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/height> "180"^^int.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/weight> "98"^^int.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/nationality> "巴西"^^string.
    <http://www.kg.com/person/1> <http://www.kg.com/ontology/hasBirthPlace> <http://www.kg.com/place/10086>.
    <http://www.kg.com/place/10086> <http://www.kg.com/ontology/address> "里约热内卢"^^string.
    <http://www.kg.com/place/10086> <http://www.kg.com/ontology/coordinate> "-22.908333, -43.196389"^^string.
  • RDFa: (The Resource Description Framework in Attributes)

  • Turtle是最常用的RDF序列化方式, 比RDF/XML更紧凑, 可读性比N-Triples更好

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Example2 Turtle:

    @prefix person: <http://www.kg.com/person/> .
    @prefix place: <http://www.kg.com/place/> .
    @prefix : <http://www.kg.com/ontology/> .

    person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
    person:1 :career "足球运动员"^^string.
    person:1 :fullName "Ronaldo Luís Nazário de Lima"^^string.
    person:1 :birthDate "1976-09-18"^^date.
    person:1 :height "180"^^int.
    person:1 :weight "98"^^int.
    person:1 :nationality "巴西"^^string.
    person:1 :hasBirthPlace place:10086.
    place:10086 :address "里约热内卢"^^string.
    place:10086 :address "-22.908333, -43.196389"^^string.
    • 同一个实体拥有多个属性(数据属性)或关系(对象属性),我们可以只用一个subject来表示,使其更紧凑。我们可以将上面的Turtle改为
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      Example3 Turtle:

      @prefix person: <http://www.kg.com/person/> .
      @prefix place: <http://www.kg.com/place/> .
      @prefix : <http://www.kg.com/ontology/> .

      person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string;
      :career "足球运动员"^^string;
      :fullName "Ronaldo Luís Nazário de Lima"^^string;
      :birthDate "1976-09-18"^^date;
      :height "180"^^int;
      :weight "98"^^int;
      :nationality "巴西"^^string;
      :hasBirthPlace place:10086.
      place:10086 :address "里约热内卢"^^string;
      :address "-22.908333, -43.196389"^^string.
  • JSON-LD: 即“JSON for Linking Data”,用键值对的方式来存储RDF数据

    1
    2
    3
    4
    5
    6
    7
    {
    "@context": "https://json-ld.org/contexts/person.jsonld",
    "@id": "http://dbpedia.org/resource/John_Lennon",
    "name": "John Lennon",
    "born": "1940-10-09",
    "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
    }

RDF的缺点

  • 表达能力有限
    • 无法区分雷和对象
    • 无法定义和描述类的关系/属性

RDFS/OWL

  • 是RDF的一种扩展
  • 是用来描述RDF数据的
  • 本质上是一些预定义词汇(Vocabulary)构成的集合
  • 用于对RDF进行类似的类定义以及属性的定义

RDFS/OWL的序列化方法

  • RDFS/OWL序列化方式和RDF没什么不同,其实在表现形式上,它们就是RDF
  • 常用的方式主要是RDF/XML,Turtle

RDFS

  • Resource Description Framework Schema
  • 是RDF的一种扩展
  • RDFS几个比较重要,常用的词汇:
    • rdfs:Class. 用于定义类。
    • rdfs:domain. 用于表示该属性属于哪个类别。
    • rdfs:range. 用于描述该属性的取值类型。
    • rdfs:subClassOf. 用于描述该类的父类。比如,我们可以定义一个运动员类,声明该类是人的子类。
    • rdfs:subProperty. 用于描述该属性的父属性。比如,我们可以定义一个名称属性,声明中文名称和全名是名称的子类。
    • 其实rdf:Property和rdf:type也是RDFS的词汇,因为RDFS本质上就是RDF词汇的一个扩展。我们在这里不罗列进去,是不希望读者混淆, 更多RDFS词汇的用法参考W3C官方文档
  • 举例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix : <http://www.kg.com/ontology/> .

    ### 这里我们用词汇rdfs:Class定义了“人”和“地点”这两个类。
    :Person rdf:type rdfs:Class.
    :Place rdf:type rdfs:Class.

    ### rdfs当中不区分数据属性和对象属性,词汇rdf:Property定义了属性,即RDF的“边”。
    :chineseName rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :career rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :fullName rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :birthDate rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:date .

    :height rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:int .

    :weight rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:int .

    :nationality rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :hasBirthPlace rdf:type rdf:Property;
    rdfs:domain :Person;
    rdfs:range :Place .

    :address rdf:type rdf:Property;
    rdfs:domain :Place;
    rdfs:range xsd:string .

    :coordinate rdf:type rdf:Property;
    rdfs:domain :Place;
    rdfs:range xsd:string .

OWL

  • Web Ontology Language

  • 是对RDFS的一个扩展,添加了额外的预定义词汇

  • 提供快速,灵活的数据建模能力

  • 高效的自动推理能力

  • 描述属性特征的词汇

    • owl:TransitiveProperty. 表示该属性具有传递性质。例如,我们定义“位于”是具有传递性的属性,若A位于B,B位于C,那么A肯定位于C。
    • owl:SymmetricProperty. 表示该属性具有对称性。例如,我们定义“认识”是具有对称性的属性,若A认识B,那么B肯定认识A。
    • owl:FunctionalProperty. 表示该属性取值的唯一性。 例如,我们定义“母亲”是具有唯一性的属性,若A的母亲是B,在其他地方我们得知A的母亲是C,那么B和C指的是同一个人。
    • owl:inverseOf. 定义某个属性的相反关系。例如,定义“父母”的相反关系是“子女”,若A是B的父母,那么B肯定是A的子女。
  • 本体映射词汇(Ontology Mapping)

    • owl:equivalentClass. 表示某个类和另一个类是相同的。
    • owl:equivalentProperty. 表示某个属性和另一个属性是相同的。
    • owl:sameAs. 表示两个实体是同一个实体。
  • 举例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix : <http://www.kg.com/ontology/> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .

    ### 这里我们用词汇owl:Class定义了“人”和“地点”这两个类。
    :Person rdf:type owl:Class.
    :Place rdf:type owl:Class.

    ### owl区分数据属性和对象属性(对象属性表示实体和实体之间的关系)。词汇owl:DatatypeProperty定义了数据属性,owl:ObjectProperty定义了对象属性。
    :chineseName rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :career rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :fullName rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :birthDate rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:date .

    :height rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:int .

    :weight rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:int .

    :nationality rdf:type owl:DatatypeProperty;
    rdfs:domain :Person;
    rdfs:range xsd:string .

    :hasBirthPlace rdf:type owl:ObjectProperty;
    rdfs:domain :Person;
    rdfs:range :Place .

    :address rdf:type owl:DatatypeProperty;
    rdfs:domain :Place;
    rdfs:range xsd:string .

    :coordinate rdf:type owl:DatatypeProperty;
    rdfs:domain :Place;
    rdfs:range xsd:string .
  • 举个例子体现对两个不同知识图谱的融合

    1
    2
    3
    http://www.zhangsan.com/ontology/Person rdf:type owl:Class . 
    http://www.lisi.com/ontology/Human rdf:type owl:Class .
    http://www.zhangsan.com/ontology/Person owl:equivalentClass http://www.lisi.com/ontology/Human .

Python——类的__class__属性与isinstance函数的用法

Posted on 2019-05-16

不同文件为入口文件时

1
2
3
4
5
6
7
8
# file: fruit.py

class Apple:
def __init__(self):
name = "HongFuShi"

apple = Apple()
print apple.__class__
1
2
# file: run.py
import fruit
  • 考虑一个文件名为fruit.py的文件夹中定义了一个类Apple,同时初始化一个对象apple
    • 若执行python fruit.py: 输入”main.Apple”
    • 若将当前文件导入到另一个文件run.py中,然后执行python run.py: 输出”fruit.Apple”
    • 也就是说,执行不同文件,类Apple的前缀不同

isinstance的困境

1
2
3
4
5
6
7
8
9
10
11
12
# file: fruit.py
class Apple(object):
pass


if __name__ == "__main__":
from run import get_apple
apple1 = Apple()
print apple1.__class__
apple2 = get_apple()
print apple2.__class__
print isinstance(apple2, Apple)
1
2
3
4
5
6
7
8
# file: run.py
from fruit import Apple


def get_apple():
apple = Apple()
print apple.__class__
return apple
  • 此时执行python run.py, 无任何输出

  • 若执行python fruit.py, 则输出如下:

    1
    2
    3
    4
    <class '__main__.Apple'>
    <class 'fruit.Apple'>
    <class 'fruit.Apple'>
    False
    • 此时fruit.py是程序的入口文件
    • 在入口文件中执行apple1 = Apple()后得到的类将是__main__.Apple
    • 在入口文件被导入到run.py文件中后,执行apple2 = Apple()后得到的类将是fruit.Apple
    • 此时,由于apple2的类别是fruit.Apple且Apple在fruit.py中是__main__.Apple,造成isinstance(apple2, Apple)返回False
    • isinstance的困境: 看起来是同一个类,但执行isinstance后返回False
123…20
Joe Zhou

Joe Zhou

世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活。 ——罗曼·罗兰

195 posts
38 tags
GitHub E-Mail
© 2024 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4