基于 fastText 的自然语言语种识别工具,支持浏览器和 Node.js 环境 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
theprimone
V2EX    程序员

基于 fastText 的自然语言语种识别工具,支持浏览器和 Node.js 环境

  •  
  •   theprimone
    yunsii 2023-09-17 18:19:25 +08:00 1929 次点击
    这是一个创建于 802 天前的主题,其中的信息可能已经有所发展或是发生改变。

    偶然看到 Google 官方在 B 站发的视频 https://www.bilibili.com/video/BV1Gp4y1A7RA?t=344.8 发现 WebAssembly 真好玩,特别提到了 fastText 这个基于 AI 模型的工具,一上头就打算试试把它搬到浏览器会怎样。

    先在 npm 搜索了一下,基本都是只支持 Node 环境使用的,有一个包 fasttext.wasm 说是支持浏览器环境的,结果在 Next.js 中一试直接裂开,各种报错

    兴致上来了就一心想着搬到浏览器上,先在原仓库上各种魔改,始终解决不了问题,最后确定应该是要分离浏览器和 Node 环境的实现的,从而能方便的避免各种问题。

    各种踩坑之后终于搞定了,现在已部署两个环境,欢迎体验:

    这次实现涉及到的技术点汇总一下

    • WebAssembly
    • Git Submodules
    • Xmake
    • 分环境开发打包 wasm 和库代码(最大问题)

    按照 fastText 官方的流程无法编译,所幸 fasttext.wasm 有个基于 Xmake 的编译,刚安装怎么也编译不了,最后稀里糊涂把 Xmake 的路走通了

    能编译之后就是另一个问题,如何分环境编译,找 emcc 和 Xmake 各种文档研究怎么分环境打包,所幸官方对此早已实现,注入 xmake.lua 的参数也是连蒙带猜可算是注入进去了。

    这一路都是靠玄学通关的,如果编译 wasm 的第一步失败的话,我大概就直接弃坑了。最后写了个简单的 benchmark 测试了一下,效果是真不错。

    搞完之后就一个想法,关于 Xmake 如果要深入 WebAssembly 大概得入个门才行,现在全靠玄学想想都有点搞 最后 fastText 的核心封装搞定了,应该可以方便扩展 fastText 支持的各种模型功能了,有时间逐步加上,未来可期

    第 1 条附言    2023-09-17 20:45:12 +08:00
    其实不分环境编译 wasm 在 Vite 环境下已经能够正常使用了,在 Next.js 总是会弹出 wasm 的 JS 绑定文件使用 Node.js 的 module 包的异常,所以不得不研究分环境编译 wasm 了。
    第 2 条附言    2023-09-17 20:46:30 +08:00

    另外还有个 Vite 库打包的问题,由于 wasm 文件的编译会带上一个对应的 JS 绑定文件,这不太可能自己去写,所以需要保留代码的原始形式。Vite 库打包死活要把 wasm 文件变成内联的 base64 格式……也有人反馈了这个问题:

    看起来这个问题也有些年头了,至今都不支持,也是不懂为啥……最后决定通过骚操作绕过这个问题,将对应的 JS 绑定文件添加到 external 中,再用静态资源复制的 Vite 插件把相关的资源复制过去 一切又正常了。

    第 3 条附言    2024-01-05 23:40:01 +08:00
    今天完成了 fasttext.wams.js 对于浏览器插件环境的支持,芜湖起飞。
    3 条回复    2023-09-18 13:53:58 +08:00
    nolhr0909
        1
    nolhr0909  
       2023-09-18 10:37:23 +08:00 via iPhone
    最近有一个很小的语言识别模型叫做 whichlang ,准确率非常高,基于 onnx-wasm 做的,可以直接用。

    我前几年给 lingua-rs 项目推过一点代码,目前基于 lingua 做了一个翻译机器人放到了 slack 上
    theprimone
        2
    theprimone  
    OP
       2023-09-18 12:47:35 +08:00
    @nolhr0909 摸索了一下,whichlang 目前只有 rust 生态吧,没有对应的 wasm 可用,也没有 Node 支持?
    theprimone
        3
    theprimone  
    OP
       2023-09-18 13:53:58 +08:00
    @nolhr0909 另外 whichlang 给我的感觉没有用到 onnx 吧,不过 onnx 看起来更专业,有机会找个合适的模型来试试。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 14:06 PVG 22:06 LAX 06:06 JFK 09:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86