分享最近解决的小众需求:如何在浏览器里检测代码文本是什么语言

33 天前
 songray

仓库: https://github.com/ray-d-song/guesslang-js
效果展示: https://ray-d-song.github.io/guesslang-js/

最近我正在完成一个叫 EchoRSS 的阅读器项目,有一个我非常想要的功能,就是拦截订阅中的外链跳转(阅读全文、引用啥的),直接在当前页内显示。

有一个问题是返回的 HTML 代码块失去了语言标注(或者原先在 pre 和 code 标签上就没有标注语言),这样没法用 shiki 或者 prism.js 之类的工具进行代码高亮。

我找到了三个检测代码语言的方案:

1. linguist

这是一个部署在服务器上的 Ruby 项目,Github 用它来检测仓库的语言构成,如果你需要极高的准确度且可以在服务端运算的话,这是最优解。

2. hljs

highlight.js 是一个非常知名的网页代码高亮库,也是唯一一个提供自动代码检测的高亮库。
原理很简单,就是枚举语言的关键词,用这些关键词去一个个匹配文本,最后看哪个的匹配度最高。

hljs 有四个问题。

3. guesslang

guesslang 是一个基于 tensorflow.js 的机器学习项目。
Microsoft 在 2021 年用 tensorflow.js 将这个项目移植到 node.js 上,为 vscode 增加了自动语言检测的功能。

一个越南小哥hieplpvip三年前又将这个项目移植到了浏览器上,不过也有三个问题:

而且这位小哥已经不再维护这个项目,3 月份有个支持 esm 的 feat request 一直没有回复。

所以我提取了 hljs 中的检测模块,又 fork guesslang-js 修复了上面那些问题,对比了一下两种方案,最终 guesslang 胜出,产物就是这个: https://github.com/ray-d-song/guesslang-js

貌似叨太多了,也许未来会有人需要这个,所以 po 一下。

如果有人了解 tensorflow.js 的话,希望可以推荐一些学习材料,我想进一步改为 web gpu 计算来提升效率。

4744 次点击
所在节点    程序员
49 条回复
zhmouV2
33 天前
拿 llm 当解决手段疑似有点幽默了,属实是大炮打蚊子,感觉是不是对 1b 参数量模型有啥误解? stable diffusion v1.5 的参数量差不多也就这个数。如果这也算解决方案,我找 1000 个印度外包去人工识别好不好。。。

正经方法不外乎提取关键字做匹配或者依赖一个小的文本分类模型做检测,或者二者结合。就跟二维码定位差不多,要么依赖 cv 传统算法提取线段/点/矩形,要么搞个小的 mobilenet 去做 detection 。
ResidualSoils
33 天前
我觉得楼主的分享很不错
songray
33 天前
@zhmouV2 是的,我觉得现在很多人形成路径依赖了... 一言不合大模型。
大多数任务依赖传统 cv 就可以了,大模型的速度和大小在很多场景下都是不可接受的。
songray
33 天前
@june4 guesslang 打包出来是 1000k ,zip 之后 200k ,还算可以接受的大小
june4
33 天前
@songray 确实 200K 的话也不算太过份,你做的是 rss reader 吧,很可能整个 reader 的前端代码 zip 后也没有 200K ,这个小功能就超过整个 app 了。
yggd
33 天前
magika 怎么样,模型大小也是 1M 左右,主要就是检测文件类型的
songray
33 天前
@yggd 好东西,我试一下!
kebyn
33 天前
可以看一下 vscode 的解决方案的
@vscode/vscode-languagedetection
hafuhafu
33 天前
长见识了,原来 VSC 的自动语言模式是用机器学习实现的,怪不得偶尔结果是错的
Alliot
33 天前
百度有语言检测 API 参考 openai-translator
weiwenhao
32 天前
@yggd 收藏了,看起来很高级
Ocean810975
32 天前
好文,mark 了,要是用大模型的人少说两句就更好了……
zoharSoul
32 天前
用大模型也太幽默了
liuzhaowei55
32 天前
不错,最近关注 Monaco editor ,也很需要语言自动判断
NoOneNoBody
32 天前
@songray #10
@musi #11
两位正经讨论技术,跑偏了,跑偏了,没必要变为讨论立场和态度,回到可行性上面吧
ooTwToo
32 天前
magika
lllllliu
32 天前
(随便说的)本质上是一个分类问题,用传统机器学习也是可以做的应该~ 各个语言的特征应该是都比较明显的,最好理解的算法应该是决策树了~
zhangkui
32 天前
@songray #10 有用配上我的浏览器插件直接起飞。。。牛逼 op
Plumbiu
32 天前
代码高亮的成本太高了,就算有一些小模型,shiki 或者 prism.js 的体积都已经很大了,建议不搞
Plumbiu
32 天前
@Plumbiu 或者转移到服务端,可以减少一下客户端体积

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1091666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX