开源书屋

问渠那得清如许?为有源头活水来。


  • 首页

  • 分类

  • 归档

  • 标签

知识图谱

发表于 2017-03-29 | 分类于 自然语言处理

知识图谱是一种结构化数据的处理方法,它涉及知识的提取、表示、存储、检索等一系列技术。从渊源上讲,它是知识表示与推理、数据库、信息检索、自然语言处理等多种技术发展的融合。

知识提取

知识提取是要解决结构化数据生成的问题。但是广义上讲,知识提取是数据质量提升中的一环,各种提升数据质量的方法,都可以视为某种知识提取。学术上一般是用自然语言处理的方法,但在实践中通常是利用规则。

正则表达式

中文分词和词性标注

命名实体识别

知识表示

知识存储

知识检索

参考文献

  • 什么是知识图谱
  • Google 的伟大征程之二:知识图谱
  • 知识图谱学习小组学习大纲

Maven 简明教程

发表于 2017-03-22 | 分类于 Java

安装

查看版本号

check maven version
1
2
3
4
5
6
7
$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /opt/apache-maven-3.3.9
Java version: 1.8.0_92, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.3", arch: "x86_64", family: "mac"

常用命令

  • mvn clean 清除编译生成的 .class 文件, 对于 maven 项目, 本质是删除项目下的 target 目录.
  • mvn test 执行 JUnit 单元测试
  • mvn -DskipTests 不执行单元测试
  • mvn package 打包构建
  • mvn install 将 jar 包安装到本地 maven 仓库
  • mvn dependency:tree 查看依赖树
  • mvn dependency:tree -Dverbose 深度查看依赖树

命令建议组合使用, 比如 mvn -DskipTests clean package 表示跳过单元测试, 清除之前的编译结果, 重新打包构建.

mvn report
mvn checkstyle:checkstyle
mvn checkstyle:check
mvn site

Git 命令行简明教程

发表于 2017-03-12
  • git init 初始化代码仓库
  • git add <dir|file> 把目录/文件加入版本控制
  • git status 查看版本控制的状态
  • vim .gitignore 加入忽略文件列表
  • git reset 重置版本控制状态
  • git commit -a -m 'msg' 提交文件到本地仓库
  • git log 查看提交的历史版本
  • git push 将本地仓库提交到远程仓库
  • git pull 将远程仓库拉到本地仓库
  • git checkout -f [logid] 本地仓库检出

数据清洗

发表于 2017-03-08

数据清洗是件很重要的事情, 相信每个做数据分析、数据挖掘的同学都认同这一点, 然而数据清洗的方法和策略很少有介绍, 课本上更是只字不提.

用户画像实践

发表于 2017-03-07

用户画像 (User Profile) 是对一个用户的信息抽象, 是大数据的一个典型应用, 也是个性化、精准投放的基石.

什么是用户画像

10001, 男, 31岁, 已婚, 年薪50万以上, 吃货, 喜欢红酒, 喜欢香烟……

为什么需要用户画像

用户画像的核心工作是为用户打标签, 而打标签的重要目的之一是为了让人能够理解并方便计算机处理.

如何构建用户画像

目标

用户画像的目标是为每个用户打上标签, 以及该标签的权重.

  • 标签: 表征了内容, 用户对该内容有兴趣、偏好、需求等等.
  • 权重: 表征了指数, 用户的兴趣、偏好指数, 也可能是用户的需求度, 可以简单理解为可信度、概率等.

构建标签体系

标签是人为规定的高度精炼的特征标识, 它具有以下特征:

  • 语义化. 人能很方便的理解每个标签的含义.
  • 封闭性. 所有子分类将构成类目空间的全部集合.
  • 树形分类. 全面考虑各个维度, 完美抽象用户信息.

下面构建一个用户画像的标签体系.

  • 用户标签
    • 静态信息
      • 用户标识
        • 姓名
        • 照片
      • 人口属性
        • 性别: 男, 女
        • 年龄: 0~100
        • 地域: 上海、北京、广州……
        • 居住地
        • 工作地点
        • 公司
        • 职业: 程序员、公务员……
        • 婚姻状况: 单身、恋爱中、已婚
        • 小孩数量: 0, 1, 2, …
        • 爱好
        • 性格
      • 商业属性
        • 消费等级
        • 消费周期
    • 动态信息
      • 行为类型
        • 浏览
        • 搜索
        • 评论
        • 加入购物车
        • 购买
        • 点赞
        • 收藏

数据建模

  • 什么用户
    • 注册 ID
    • Email
    • 第三方 ID
    • 手机号
    • 身份证
  • 什么时间
    • 时间戳 (精确到秒) => 衰减因子
    • 时间长度 (标识用户在某一页面的停留时间) => 权重
  • 什么地点 用户接触点 (Toch Point)
    • 网址 => 权重
    • 内容 => 标签
  • 做了什么事 用户行为类型 => 权重

注意事项

  • 在用户画像的过程中有一个很重要的概念叫做颗粒度

内容画像

内容和用户是互联网企业核心的两个东西, 而用户行为则将内容和用户连接了起来.

Java 正则表达式

发表于 2017-03-07

Java 正则表达式, 可以用 “简洁而强大” 来形容!

Java 正则表达式, 存在于 java.util.regex 包中, 是到 JDK 1.4 才引入的, 仅包含上面两个类, 和一个异常类.

  • Pattern (模式类) 正则表达式的编译形式, 用来表达和陈述所要搜索模式的对象.
  • Matcher (匹配器类) 通过解释正则模式, 在字符串上执行模式匹配的引擎, 是真正影响搜索的对象.

Pattern

生成 Pattern 对象

生成 Pattern 对象只有一种方法, 就是调用其静态方法 compile.

1
2
static Pattern compile(String regex)
static Pattern compile(String regex, int flags)

Matcher

生成 Matcher 对象

生成 Matcher 对象只有一种方法, 就是调用 Pattern 对象的成员方法 matcher.

1
Matcher matcher(CharSequence input)

Java 正则表达式

预定义字符集

  • \p{Lower}=[a-z]
  • \p{Upper}=[A-Z]
  • \p{ASCII}=[\x00-\x7F]
  • \p{Alpha}=[\{Lower}\p{Upper}]
  • \p{Digit}=[0-9]
  • \p{Alnum}=[\p{Alpha}\p{Digit}]
  • \p{Punct}=[!"#$%&'()*+,-./:;<=>?@[\]^_{|}~]`
  • \p{Graph}=[\p{Alnum}\p{Punct}]
  • \p{Print}=[\p{Graph}\x20]
  • \p{Blank}=[\t\x20]
  • \p{Space}=[\t\n\v\f\r\x20]
  • \p{Cntrl}=[\x00-\x1F\x7F]
  • \p{XDigit}=[0-9a-fA-F]
  • \p{javaLowerCase} 各种语言的小写字母, 远远比 \p{Lower} 多
  • \p{javaUpperCase} 各种语言的大写字母, 远远比 \p{Upper} 多
  • \p{javaWhitespace} 各种空白字符, 远远比 \p{Space} 多, 还包括中文的空白
  • \p{P} 各种语言的标点符号, 远远比 \p{Punct} 多
  • \p{Ps} 开始括号
  • \p{Pe} 结束括号
  • \p{Pi} 开始引号
  • \p{Pf} 结束引号
  • \p{Pc} 连接字符
  • \p{Pd} 虚线字符
  • \p{Po} 其他字符
  • \p{S} 符号
  • \p{Z} 分隔符

这里附上字符集检查代码

filterByPattern
1
2
3
4
5
6
7
8
private void filterByPattern(Pattern p) {
for (int i = 0; i < 65536; i++) {
char c = (char) i;
if (p.matcher(c + "").matches()) {
System.out.println(String.format("%d\t%s", i, c));
}
}
}

常用工具方法

提取符合 Pattern 模式的字符串

用于提取符合模式的字符串, 或者说, 提取有用信息.

extract
1
2
3
4
5
6
7
8
public static List<String> extract(Pattern p, String str) {
List<String> rs = new ArrayList<String>();
Matcher m = p.matcher(str);
while (m.find()) {
rs.add(m.group());
}
return rs;
}

判断字符串是否包含 Pattern 模式

用于字符串模式查找.

hasMatch
1
2
3
public static boolean hasMatch(Pattern p, String str) {
return p.matcher(str).find();
}

判断字符串是否符合 Pattern 模式

用于字符串模式校验

isMatch
1
2
3
public static boolean isMatch(Pattern p, String str) {
return p.matcher(str).matches();
}

参考文献

  • regexper 可视化工具

字符串标准化

发表于 2017-03-06

最近做的项目涉及到文本处理, 初一看数据, 很 “脏”, 简体繁体、错别字、英文大小写、全角半角、标点符号等等. 每种情形都需要对应的处理方法, 本文介绍的字符串标准化, 或者称为归一化处理, 主要解决全角半角, 以及特殊符号的情形.

比如这些符号: !~。•﹖, 它们的存在就像 “魔鬼”, 对接下来的正则表达式处理也带来了麻烦, 有时候, 真想不到用户怎么把这些字符输进来的?

言归正传, 这里就要用到字符串标准化. 我很早就想要这样一个工具函数了, 最近阅读 Ansj 的源码时, 发现了这样一个工具, 略加改造就变成我想要的啦^^

基本思路如下:

StringAlert.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private static final char[] CHARCOVER = new char[65536];
static {
for (int i = 0; i < CHARCOVER.length; i++) {
if (i >= '!' && i <= '~') {
CHARCOVER[i] = (char) (i - '!' + '!');
}
}
}
public static String alert(String str) {
if (str == null) {
return null;
}
char[] chars = new char[str.length()];
for (int i = 0; i < chars.length; i++) {
char c = CHARCOVER[str.charAt(i)];
chars[i] = c > 0 ? c : str.charAt(i);
}
return new String(chars);
}

由于应用场景需要, 对于有些字符的转换会做一定特殊化处理, 列表如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CHARCOVER['。'] = '.';
CHARCOVER['•'] = '·';
CHARCOVER['〖'] = '[';
CHARCOVER['〗'] = ']';
CHARCOVER['【'] = '[';
CHARCOVER['】'] = ']';
CHARCOVER['﹔'] = ';';
CHARCOVER['﹕'] = ':';
CHARCOVER['﹖'] = '?';
CHARCOVER['﹗'] = '!';
CHARCOVER['﹟'] = '#';
CHARCOVER['﹠'] = '&';
CHARCOVER['﹡'] = '*';
CHARCOVER['﹢'] = '+';
CHARCOVER['﹣'] = '-';
CHARCOVER['﹤'] = '<';
CHARCOVER['﹥'] = '>';
CHARCOVER['﹩'] = '$';
CHARCOVER['﹪'] = '%';
CHARCOVER['﹫'] = '@';

Java 最佳实践

发表于 2017-03-02
  • 不要使用 new String() 初始化字符串对象, 直接使用 "".
  • 不要使用 == 进行对象比较, 尤其是字符串对象, 使用 equals 方法, 比如 "publish".equals(status).

Hexo 博客进阶教程

发表于 2017-03-02 | 分类于 工具

设置个性主题

推荐 Next 主题, 它是目前 Github 上 Star 最高的 Hexo 主题, 支持几种不同的风格 (Scheme). 我的网站就是采用这个主题, 简洁美观. 作者提供了非常完善的配置说明.

Hexo + Github 搭建个人博客

发表于 2017-03-01 | 分类于 工具

环境准备

先决条件

  • 安装 node
  • 安装 git
  • 注册 github 账号, 并添加 SSH key.

注意: 我的 Github 账号的用户名是 henryhyn, 那么博客的默认域名就是 https://henryhyn.github.io, 因此我把博客的项目命名为 henryhyn.github.io, 你需要根据个人情况而定, 以下不再赘述.

安装 Hexo 客户端

1
$ sudo npm install hexo-cli -g

创建博客

初始化博客

1
2
$ cd workspace
$ hexo init henryhyn.github.io

加入版本控制

1
2
3
4
$ cd henryhyn.github.io
$ git init
$ git add .
$ git commit -a -m '初始化'

完成安装, 并启动服务

1
2
$ npm install
$ hexo server

一键发布

在 Github 上新建项目 henryhyn.github.io.

安装插件

1
$ npm install hexo-deployer-git --save

修改配置文件 _config.yml

1
2
3
4
deploy:
type: git
repo: git@github.com:henryhyn/henryhyn.github.io.git
branch: master

一键发布

1
$ hexo deploy

打开浏览器, 转到 https://henryhyn.github.io

123
Henry

Henry

23 日志
5 分类
22 标签
GitHub Weibo
© 2017 Henry
由 Hexo 强力驱动
主题 - NexT.Pisces