Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Douban-linguist
Search
liluo
December 21, 2013
Programming
1
83
Douban-linguist
Douban Linguist
liluo
December 21, 2013
Tweet
Share
Other Decks in Programming
See All in Programming
AHC051解法紹介
eijirou
0
420
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
460
プロダクトという一杯を作る - プロダクトチームが味の責任を持つまでの煮込み奮闘記
hiliteeternal
0
450
ワープロって実は計算機で
pepepper
2
1.3k
Nuances on Kubernetes - RubyConf Taiwan 2025
envek
0
140
Infer入門
riru
4
1.4k
SwiftでMCPサーバーを作ろう!
giginet
PRO
2
230
202507_ADKで始めるエージェント開発の基本 〜デモを通じて紹介〜(奥田りさ)The Basics of Agent Development with ADK — A Demo-Focused Introduction
risatube
PRO
6
1.4k
実践 Dev Containers × Claude Code
touyu
1
170
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2.1k
あのころの iPod を どうにか再生させたい
orumin
2
2.4k
バイブコーディング超えてバイブデプロイ〜CloudflareMCPで実現する、未来のアプリケーションデリバリー〜
azukiazusa1
3
810
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
73
5k
Fireside Chat
paigeccino
38
3.6k
Become a Pro
speakerdeck
PRO
29
5.5k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
The Language of Interfaces
destraynor
158
25k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Agile that works and the tools we love
rasmusluckow
329
21k
Why Our Code Smells
bkeepers
PRO
337
57k
Gamification - CAS2011
davidbonilla
81
5.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Transcript
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 进⾏行⽐比 较, 将概率最⼤大编程语⾔言判定为结果
根据 samples/ ⺫⽬目录下的⽂文件统计(训练) 得来的 编程语⾔言的 Tokens
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)
• 和 @xtao 讨论是 Python 正则性能问题 • 需要⼀一个⾼高性能的 Python 版本的
StringScanner 捉⿁鬼(5)
于是, 有了 scanner Like 不只是说说, 正则引擎使⽤用 oniguruma. (Ruby 正则引擎就是它)
Scanner 带来的性能提升 Travis-ci 中使⽤用 Scanner 前后对⽐比 github-linguist 与使⽤用 Scanner 后的douban-linguist
对⽐比 注: 减少的 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 交互实现 ! !
• 问我 Python 版有没⽐比 Ruby 快 ! • 告诉他提了个 pull request PUSH > HOOK > QUEUE > (PULL) > CALCULATE > CALLBACK
提 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.