SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
Douban-Linguist
by liluo
关于我

• liluo@github	

• liluoliluo@douban	

• liluoliluo@twitter
Linguist 是什么?
从视觉上看是这样的

Github 现在的版本

Github 之前的版本 (⺫⽬目前⾖豆瓣在⽤用)
Douban-linguist 是这样描述的
Github-linguist README
Linguist 可以做什么

• 编程语⾔言检测	

• 语法⾼高亮	

• 代码仓库编程语⾔言统计
•
•

统计时忽略通⽤用第三⽅方库特定⺫⽬目录代码	

检测是否⽣生成⽂文件
Linguist 是如何检测语⾔言的?
当输⼊入路径是⺫⽬目录时
•
•

遍历⺫⽬目录下所有⽂文件	


•

对余下的⽂文件进⾏行分析并汇总

忽略以 . 开头的⺫⽬目录, 忽略⼆二进制⽂文件/⽣生成⽂文件(如 coffeescript ⽣生成的
js)/压缩⽂文件(如 jquery.min.js)/通⽤用的第三⽅方类库(如 bootstrap)	


当输⼊入路径是⽂文件时
•
•
•
•

根据⽂文件扩展名查找(数据源⾃自samples.json, languages.yml)	

未匹配到时返回空(None)	

匹配到⼀一个结果时将其返回	

匹配到多个结果时分析⽂文件内容
分析内容
算法: statistical classifier

•
•

(之前⽂文档中写的是 Bayesian classifier)

使⽤用 Tokenizer 将内容转为 tokens	

拿 tokens 分别与所有(根据扩展名)匹配到的编程语⾔言的 Tokens 进⾏行⽐比
较, 将概率最⼤大编程语⾔言判定为结果
编程语⾔言的 Tokens
根据 samples/ ⺫⽬目录下的⽂文件统计(训练) 得来的
languages.yml & samples.json
Douban-Linguist
因为 Code
2012年5⽉月	

!

@huanghuang: 	

!

我们需要两个库 grit 和 linguist
然后...
断篇了.
时光荏苒, 莺⻜飞草⻓长
到了	

	

2013年01⽉月
准备⼯工作
计划时对依赖处理是这样想的
Ruby

Python 替代

#

pygments.rb

pygments

!
前者是后者的 Ruby 封装实现

mime-types

mimetypes

Python 内置

escap_utils

urllib

毫⽆无鸭梨

charlock_holmes

?

先⾛走着
开始动⼿手

• git init	

• cp blabla	

• added blabla	

• unittest blabla
Code 来需求了!!!
判断是否⽣生成⽂文件
•
•

移动组: PR diff 中不需要显⽰示 .pbxproj, .mobileprovision 	

前端组: 统计时不计⼊入压缩版本以及 coffeescript ⽣生成⽂文件
先把这个弄了给它⽤用
继续~
遭遇 CharlockHolmes
• 尝试过 Chardet, 但是只能检测编码	

• 尝试过 mimetypes.guess_type(file) 检测
是否⼆二进制⽂文件, 不靠谱!!!	


• 还尝试过下⾯面这样:
好像是能解决?
但是好纠结...
要是有 ICU 的 Python 实现就美好了...
可是不会写 C 扩展 > . <

求给⼒力, 求

+1
@XTao 来了!!!
发布第⼀一个版本 v0.0.1
Python mimetypes 怪怪的

此恨绵绵⽆无绝期...
移植⼀一个 Python 版本吧
Github custom lexers(pygments.rb)
写个 Pygments 插件
某天发现性能好差!!!

• ⽐比 Github-linguist 慢了 2~4 倍多 (不太记
得具体数据了)	


• 跑 unittest 要 20s 左右
捉⿁鬼(1)
捉⿁鬼(2)
捉⿁鬼(3)
捉⿁鬼(4)
捉⿁鬼(5)

• 和 @xtao 讨论是 Python 正则性能问题	

• 需要⼀一个⾼高性能的 Python 版本的
StringScanner
于是, 有了 scanner

Like 不只是说说, 	

正则引擎使⽤用 oniguruma.	

(Ruby 正则引擎就是它)
Scanner 带来的性能提升
github-linguist 与使⽤用 Scanner 后的douban-linguist 对⽐比

Travis-ci 中使⽤用 Scanner 前后对⽐比

注: 减少的 22 个 test case ⻅见 https://github.com/douban/linguist/blob/eba200742c9f7ebd433b7aa73774381b80ddb0fa/tests/test_strscan.py
感谢 Scanner 的作者

赞美 Code Team, @XTao!!!
发布版本 v0.1.0
⻢马上就讲完了, 别捉鸡...
Douban-linguist 最新进展	

在等 Pygments release 新版本
与 Github-linguist 作者

• Drinkup	

• Pull Request
2013 Drinkup@北京

• 咨询 Linguist 与 Github 交互实现	

PUSH > HOOK > QUEUE > (PULL) > CALCULATE > CALLBACK
!

!

• 问我

Python 版有没⽐比 Ruby 快	


!

• 告诉他提了个 pull request
提 Pull Request (1)

Drinkup 当天晚上被 merge
提 Pull Request (2)
提 Pull Request (3)
就是这样了.
相关链接
•
•
•
•
•
•

https://github.com/douban/linguist	

https://github.com/douban/PyCharlockHolmes	

https://github.com/liluo/mime	

https://github.com/liluo/pygments-github-lexers	

https://github.com/cuteio/scanner	

https://github.com/github/linguist
End.

Weitere ähnliche Inhalte

Ähnlich wie Douban linguist

重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务LI Daobing
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuanWei-Yuan Chang
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Dahui Feng
 
Mercurial簡介與教學
Mercurial簡介與教學Mercurial簡介與教學
Mercurial簡介與教學芳本 林
 
如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱84zhu
 
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...Etu Solution
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选勇浩 赖
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介Bo-Yi Wu
 
香港中文開源軟件翻譯
香港中文開源軟件翻譯香港中文開源軟件翻譯
香港中文開源軟件翻譯Sammy Fung
 
從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docsimacat .
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學Duncan Chen
 
為自己學 Git
為自己學 Git為自己學 Git
為自己學 Git昀 李
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 

Ähnlich wie Douban linguist (15)

重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化
 
Mercurial簡介與教學
Mercurial簡介與教學Mercurial簡介與教學
Mercurial簡介與教學
 
如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱
 
Git介绍
Git介绍Git介绍
Git介绍
 
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...
Big Data Taiwan 2014 Track1-3: Big Data, Big Challenge — Splunk 幫你解決 Big Data...
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
 
香港中文開源軟件翻譯
香港中文開源軟件翻譯香港中文開源軟件翻譯
香港中文開源軟件翻譯
 
從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
 
為自己學 Git
為自己學 Git為自己學 Git
為自己學 Git
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 

Douban linguist