Stanford CoreNLP
Stanford CoreNLP
The Stanford Natural Language Processing Group
Stanford Log-linear Part-Of-Speech Tagger
Stanford Named Entity Recognizer (NER)
The Stanford Parser: A statistical parser
DBpedia是一項從維基百科裡萃取結構化內容的專案計畫。這些計畫所得的結構化資訊,也將放在網際網路中公開讓人取閱。[1]DBpedia允許使用者查詢跟維基百科相關資源之間的關係與性質,甚至也可查詢從維基百科外連到其他資料組的內容。
維基百科的條目大部分都是沒有固定格式的文字,不過也有部分的資料是屬於結構化的資訊並且被鑲嵌在條目中,像是資訊框的表格內容(也就是預設在桌機版維基百科瀏覽格式,出現在條目右上角出現的欄位,或是行動版維基百科的條目一開始就顯示的欄位。)、分類、圖像、地理座標、以及外部網頁連結。這些結構化的資訊會在此計畫案被提取出來並且將其統一的放在一個資料集裡頭以方便查詢。
2013年9月,DBpedia發佈了第3.9版的更新。[5]如同之前版本的加強,這次也新增了維基百科更多資訊框的比對,同時也新增了維基數據的連結。(透過 owl:sameAs 的連結)。[5]此版的資料組描述了四百萬筆實體(entities),其中有322萬筆實體是在一個連貫的知識本體中進行分類,這些實體包含了832,000位人物、639,000個地景、116,000份音樂專輯、78,000部影片、18,500個電動遊戲、209,000個組織、226,000個物種以及5,600種疾病。[6]。DBpedia資料集提供了最多有119個不同語言的特色標籤以及資料摘要;現總共有2460萬個圖片連結以及2760萬筆連到外部網頁的連結資料、4500萬筆連結到其他RDF格式的資料集、6700萬筆連結到維基百科的分類頁,以及4120萬筆YAGO2分類的資料[6]。DBpedia計畫使用資源描述框架(Resource Description Framework,簡稱RDF)來呈現擷取的資料,目前包含了24.6億筆的RDF triple資料、4700萬從英文版本維基百科上擷取的資料、19.8億則來自其他的語言版本,同時有大約4,500萬的資料連往外部的資料集。[6]
從本資料集,多個頁面之間傳播的資訊可以被擷取,例如某書籍的作者資料,能夠被放在關於此書或關於作者的頁面中。
從維基百科擷取資料其中的一個重大挑戰是,相同概念可能會在資訊框以及其他的模版中被用不同的參數表示,例如|birthplace=以及|placeofbirth=意義相同。在這樣的情況下,查詢人物出生地點就必須要在這兩個參數下都有查詢才能夠得到完整的結果。於是,DBpedia的映對語言就被開發了出來,以幫助映對知識本體裡頭這些定義的異同,進而減少同義詞的重疊。有鑑於維基百科中使用資訊框以及其他數值非常的多元,開發以及改善映對語言的機制是以開源的方式徵求大眾參與[7]。
DBpedia摘取維基百科頁面上的事實資訊,讓使用者可以不用在多個維基百科條目之間瀏覽便找到問題的答案。查詢資料的方式是利用叫做SPARQL(像是SQL一類的查詢語言)來對資源描述框架(RDF)進行查詢。舉例而言,假如你對日本少女漫畫系列東京喵喵感興趣,想要找這位漫畫的繪者所創作的其他作品。DBpedia結合了維基百科上東京喵喵、征海未亞這些條目,以及相關作品諸如麗佳公主以及恋きゅー的資訊。因為DBpedia把這些資料都標準化到單一的資料庫裡頭,下列查詢就能夠在不需具體清楚哪一個條目有包含了哪一部分的片段資訊,就能夠完整的列出相關作品類型:
1 | PREFIX dbprop: <http://dbpedia.org/property/> |
参考:
DBpedia Home page
DBpedia Wiki
W3C RDF Primer中文版
RDF Schema
YAGO wiki)
SPARQL wiki
2010年6月,來自Web Based Systems Group以及柏林自由大學的研究人員開始了一個叫做「DBpedia Spotlight」的計畫,開發工具來將文字資料中使用DBpedia資源的部份加上註解。這個工具解決了過去透過DBpedia連結非結構化資訊來源到開放連結資料雲的問題。DBpedia Spotlight可展示已命名實體擷取(named entity extraction)、包含實體偵測(entity detection)以及命名衝突化解(name resolution)(也就是消歧義(disambiguation))。此工具也能在其他資訊擷取(information extraction)任務中,用來進行命名實體辨識(named entity recognition)。DBpedia Spotlight聚焦在多種不同用途的客製應用。不去聚焦於少部分的實體類型,此計畫試圖支援全部DBpedia上來自超過320個不同分類裡,共約三百五十萬個實體與概念。
DBpedia Spotlight可公開獲取,是以一個為了測試用途而提供的網路服務,或者也可以從Apache授權的Java/Scala API。DBpedia Spotlight分配也包含了一jQuery插件,此插件允許開發人員在網路上的任何一頁加上註解,只要在他們的頁面上增加一行文字即可[18]用戶端也有Java或PHP的支援應用[19]。此工具可從其展示頁(demo page)裡,處理多種的英語資料[20]以及網路服務。國際化的支援部分,只要此語言有開維基百科即可支援[21]。
redis中的事务(transaction)和传统关系型数据库中的事务一样,是一组命令的集合。事务同命令一样都是redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。
1 | MULTI |
在执行到EXEC之前,前面的命令并不会马上执行,而是添加到等待执行的事务队列中。如果在EXEC之前事务中断,则事务的所有命令都不会被执行,一旦发送了EXEC命令,所有命令都一定会被执行。
另外redis事务还保证一个事务内的命令依次执行而不被其他命令插入,也就是在多个客户端的情况下,一旦某个客户端开始执行某个事务,到结束之前,其他客户端的命令都不会被执行。
语法错误
事务所有命令都不会被执行。
运行错误。比如使用散列类型的命令操作集合类型的键。这种错误在事务中会被接受并继续执行,也就是即使某条命令出现允许错误,其后面的命令还是会被执行,整个事务会被完成。
需要注意的是,redis不支持rollback。
很多情况下我们需要保证在我们获得某个键值后,该键值不能被其他客户端修改,直到当前客户端执行事务完成,这时我们可以使用WATCH。WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会被执行(与事务的最后一条性质相违背?没有!!)。监控一直持续到EXEC命令(监控可以在MULTI之前进行,从那时就开始监控,事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控,也就是WATCH作用是,从WATCH开始,到MULTI中间,如果被watch的键被修改,那么这个事务不会被执行)。
1 | SET key 1 |
执行EXEC命令后会取消对所有键的监控,也可以 用UNWATCH命令来取消监控。
在redis可以使用EXPIRE命令设置一个键的生存时间,到时间后redis会自动删除。
1 | EXPIRE key seconds # 返回1表示设置成功,0表示失败 |
除了PRESIST外,使用SET或GETSET命令赋值也同时回清除键的生存时间(恢复为永久)。其他命令只对键值进行操作的命令(INCR,LPUSH,HSET,ZREM)都不会影响键的生存时间。
1 | PEXPIRE key 1000 # 毫秒位单位 |
为了提高性能和负载能力,我们通常需要将一些访问频率较高或者计算密集的数据结果缓存起来,并希望这些数据能根据具体访问情况自动更新或过期(性能和有效的内存利用)。由于内存有限,我们不可能无限的将所有数据缓存在内存中,需要按照一定的规则淘汰不需要的缓存键,通过配置文件的maxmemory参数我们可以设置redis最大可用内存大小,超出这个限制时redis回根据maxmemory-policy参数指定的策略删除一些键以空出空间。
rule | explaination |
---|---|
volatile-lru | 使用LRU算法删除一个键(只对设置了生存时间的键) |
allkeys-lru | 使用LRU算法删除一个键 |
volatile-random | 随见删除一个键(只对设置了生存时间的键) |
allkeys-lru | 随机删除一个键 |
valatile-ttl | 删除生存时间最近的一个键 |
noeviction | 不删除键,返回错误 |
SORT可以对集合,列表和有序集合类型进行排序(在对有序集合排序时会忽略元素的分数,只针对元素自身的值进行排序,如数字是根据数字大小,还可以通过ALPHA参数实现按照字典顺序排列非数字元素),使用DESC可以实现将元素从大到小排序。
1 | SORT tag:ruby:posts |
另外SORT还支持LIMIT offset count的用法SORT tag:ruby:posts DESC LIMIT 1 2
很多时候列表,集合等中存储的元素值代表的是对象ID,单纯对这些ID排序意义不大,我们需要根据ID对于的对象的某个属性进行排序,这时我们可以使用BY参数。BY 参考键
,其中参考键可以是字符串类型键或者是散列类型的某个字段
(表示为键名->字段名
)。如果提供了BY参数,SORT命令不在根据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*
并获取其值,用以进行排序。
1 | SORT tag:ruby:posts BY post:*->time DESC |
除散列类型外,参考键还可以是字符串类型:
1 | SORT list my itemscore:* DESC |
当某个元素的参考键不存在时,会默认参考键值为0.
GET参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。GET参数的规则和BY参数一样,也支持字符串类型和散列类型的键,并同样使用*
作为占位符。另外在一个SORT 命令中可以有多个GET参数(而BY参数只能有一个)。
SORT tag:ruby:posts BY post:*->time DESC GET post:*title GET post:*->time GET #
有N个GET参数,每个元素返回的结果就有N行。使用#作为参数可以返回键值本身。
可以将排序结果使用STORE保存,返回结果为保存结果个数。
SORT tag:ruby:posts BY post:*->time DESC GET post:*title GET post:*->time GET # STORE stor.result
两类实体:生产者和消费者,生产者会将需要处理的任务放入任务队列中,而消费者不断地从任务队列中读入任务信息并执行。使用任务队列可以实现松耦合,使得生产者和消费者都可伸缩,并且在访问量急剧增加的情况下可以根据系统资源情况削峰,降低负载。
最基本使用redis的列表类型,生产者使用LPUSH加入任务,消费者使用RPOP取出任务并执行(while不断循环,可设置间隔时间)。
上面的一个确定是消费者需要不断调用RPOP查看是否存在新任务,带了额外的负载压力。我们可以通过BRPOP实现一旦有新任务就通知消费者,消费者在调用BRPOP之后,如果没有任务则会阻塞,知道有新任务加入。
1 | BRPOP queue 0 # 0表示一直阻塞,其他表示只会阻塞一定时间 |
有时一个消费者可能能处理相同类型的不同任务,但优先级不同。如VIP客户的订单处理和普通客户的订单处理,可以将不同类型的客户的订单存在不同队列中。BRPOP命令可以同时接收多个键,并处理第一个存在任务的队列的任务。
除了任务队列以外,redis还提供了一组命令可以让开发者实现”发布/订阅”模式。”发布/订阅”模式同样可以实现进程间的消息传递:订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定频道发送消息,所有订阅此频道都会收到该消息。
发布者发布消息:
1 | PUBLIC channel.1 hi |
订阅频道的命令是SUBSCRIBE,可以同时订阅多个频道。
1 | SUBSCRIBE channel.1 |
进入订阅状态后客户端可能会收到三种类型的回复。每种类型的回复都包含三个值。第一个值是消息的类型,根据消息类型的不同,第二、第三个值的含义也不同。
三种类型:
使用UNSUBSCRIBE命令可以取消订阅指定的频道,如果不指定参数则会取消所有订阅频道。
1 | UNSUBSCRIBE channel1 channel2 ... |
PSUBSCRIBE支持通配符匹配:
1 | PSUBSCRIBE channel.?* |
PUNSUBSCRIBE可以退订指定的规则。
Redis是一个key-value数据库,区别与传统的关系型数据库。
比如一篇文章在redis存储如下:
1 | # var["key"] = "value" |
这些都是key-value数据库的优势,在处理互联网上海量但是非结构化的数据具有很大的优势。key-value数据库对于不同应用和需求也有很多种,如MongoDB,Cassandra,Dynamo等。
Redis数据库种所有数据都存储在内存种,所以速度非常快,另外redis同时也提供了对持久化的支持,可以将内存的数据异步写到磁盘中。
另外redis虽然是作为数据库开发的,但是由于其基于内存且提供了很多强大的功能,可以很容易将其用于缓存,队列系统等。
1 | $ tar xzf redis-3.0.7.tar.gz |
$ src/redis-server
也可以将redis-server
命令直接加入到系统路径里,或者将redis-server
复制到/usr/bin/
下,这样后面启动redis server就不需要切换到redis目录中。
1 | # /usr/local/redis-3.0.7 redis安装目录 |
redis默认使用6379端口监听,可以通过--port
参数设置。
redis-server --port 6000
另外一种方式是使用初始化脚本启动redis。redis目录下utils目录下有一个redis_init_script的默认初始化脚本,我们可以对其修改以满足我们的需要。
1 | #!/bin/sh |
之后可以启动如下:
redis_6000 start # redis_6000 即是上面脚本文件的文件名
另外如果需要更多的配置,如端口号,持久化文件存放地址等,最好的方式是启动时指定配置文件。
1 | redis-server /path/to/redis/conf |
通过启动参数传递同名的配置选项会覆盖配置文件中相应的参数。
之后可以通过命令行终端或者编程语言接口与server交互。
1 | $ redis-cli |
redis-cli SHUTDOWN
一个redis实例以默认的配置启动后,提供了多个字典(数据库),客户端可以指定将数据存在哪个数据库中。每个数据库使用一个数字来表示(不支持数据库命名,不同数据库没有不同的访问密码,另外数据库并不是完全隔离的,所以redis里的数据库更像是一种命名空间,所以一个redis实例不适合存储不同应用程序的数据),默认有16个数据库,可以通过配置参数databases来修改。默认会直接进入0号数据库,可以通过SELECT更换数据库。
1 | SELECT 1 |
KEYS pattern # 不区分大小写,可以使用正则表达式
一些简单的通配符规则:
sign | meaning |
---|---|
? | 任意一个字符 |
? | 任意个字符 |
[] | 匹配括号内的任意一个字符,可以使用”-“表示区间,如[a-zA-z] |
\x | 转义通配符 |
判断键是否存在EXISTS key
如果存在则返回整数类型1,否则返回0
删除键DEL key1 key2 key3 ... # 可以一次删除多个键
del命令参数不支持通配符,但是可以结合linux管道和xargs命令实现删除所有符合规则的键,如:redis-cli KEYS "*"
| xargs redis-cli DEL
或者以符合规则的键作为参数:
redis-cli DEL `redis-cli’ KEYS “*” ` # 注意这个一个linux嵌入命令,不是单引号。
TYPE key
1 | SET key value |
1 | INCR key # 必须为整数类型 |
1 | SET key hello |
STRLEN key
1 | MGET key1 key2 ... |
1 | GETBIT key offset # 可以对字符串操作 |
散列类型适合存储对象,使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值(除了散列类型,redis的其他数据类型同样不支持数据类型嵌套,如集合类型的每个元素都只能是字符串,不能是另一个集合或散列)。
1 | HSET key field value |
redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列类型,通过SET命令建立的键是字符串类型等。
1 | HEXISTS key field |
1 | HSETNX key field value |
1 | HINCRBY key field increment |
1 | HDEL key field1 field2 ... |
1 | HKEYS key |
列表类型list可以存储一个有序的字符串列表,常用操作是向列表两段添加元素,或者获得列表的一个片段。redis中列表是使用双向链表实现,头尾添加删除很快,注意索引访问速度会比较慢,特别是访问中间的元素。
1 | LPUSH key value1 value2 ... |
1 | LPOP key |
LLEN key # O(1)
1 | LRANGE key start stop # first element 0 |
1 | LREM key count value # 删除列表中前count个值为value的元素 |
集合使用hashset实现。
1 | SADD key member1 member2 ... # 返回新增成功的个数 |
获得所有元素SMEMBERS key
判断是否存在SISMEMBER key member
集合间运算
1 | SDIFF key1 key2 ... |
元素个数SCARD key
随机获得集合元素SRANDMEMBER key [count]
随机弹出一个元素SPOP key
sorted set,每个元素具有分数(权值)的set,如果将当分数设为index大小,则可以实现list的功能。
增加元素ZADD key score1 member1 score2 ...
获得元素的分数ZSCORE key member
获得排名在某个范围内的元素列表ZRANGE key start stop [WITHSCORES]
# 分数从小到大Zrevrange key start stop [WITHSCORES]
# 分数从大到小
获得指定分数范围
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZINCRBY key increment member
一个很好的编辑器及语法简明手册,不过并不是所有都兼容其他编辑器或博客。这里对参考Cmd Markdown对常用及兼容的子集进行了总结,完整内容请参考Cmd Markdown。
Mac下另一个强大的编辑器是MacDown,支持PDF导出。
使用 和 * 表示斜体和粗体。也可以使用HTML标签属性修改颜色。
*斜体*,**粗体**。
斜体,粗体。
在行的开头加#号表示标题,数量表示标题级别, 如:# H1, ## H2, ### H3,#### H4。
或者在行的下方使用 === 表示一级标题,使用 —- 表示二级标题。
使用 [描述](链接地址) 为文字增加外链接。
[leetcode](https://leetcode.com/problemset/algorithms/)
leetcode
使用 *,+,- 表示无序列表。
1 | - hello1 |
使用数字和点表示有序列表。
1 | 1. hello1 |
使用 > 表示文字引用。
> 野火烧不尽,春风吹又生。
野火烧不尽,春风吹又生。
使用 `代码` 表示行内代码块。
1 | Hello, `word`。 |
Hello, word
。
使用 ![描述](图片链接地址) 插入图像。
示例:![hello](http://plusaber.net/images/plusaber.jpg)
在段落中填写 [TOC]
以显示全文内容的目录结构。NextT似乎是不支持,无法展示。
[TOC]
标签格式在各个编辑器是有些不兼容的。
Cmd编辑器为:Tags: 数学 英语 Markdown
对于NextT为:tags: [leetcode, dynamic programming, unique paths]
目录也存在兼容问题,cmd貌似不兼容
NexT为:categories: Blogging
使用 ~~ 表示删除线。
~~这是一段错误的文本。~~
这是一段错误的文本。
使用 keyword 表示注脚。NextT似乎是不支持,无法展示。
注脚[^footnote]的样例。
注脚footnote的样例。
$ 表示行内公式:
质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。
一个不错的介绍Mathjax与LaTex公式简介。
或者参考MathJax。
非代码示例:
1 | $ sudo apt-get install vim-gnome |
Python 示例:
1 | @requires_authorization |
1 | | 项目 | 价格 | 数量 | |
项目 | 价格 | 数量 |
---|---|---|
计算机 | $1600 | 5 |
手机 | $12 | 12 |
管线 | $1 | 234 |
1 | <table> |
值班人员 | 星期一 | 星期二 | 星期三 |
---|---|---|---|
李强 | 张明 | 王平 |
footnote. 这是一个 注脚 的 文本。 ↩