我正在尝试使用NLTK https://www.nltk.org/在浏览器中,感谢pyodide https://pyodide.org/en/stable/。
Pyodide 启动良好,成功加载 NLTK,打印其版本。
尽管如此,虽然包下载看起来不错,但在调用时nltk.sent_tokenize(str)
,NLTK 引发错误,无法找到包“punkt”。
我想说下载的资源在某个地方丢失了,但我不太明白 Pyodide / WebAssembly 如何管理文件。有什么见解吗?
简单版本:
import nltk
nltk.download(pkg)
for sent in nltk.sent_tokenize("Test string"):
print(sent)
包含更多详细信息的版本,指定下载目录和服务器 URL。
import nltk
pkg = "punkt"
downloader = nltk.downloader.Downloader(server_index_url="https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml")
downloader.download(pkg, download_dir='/nltk_data')
downloader.status(pkg)
for sent in nltk.sent_tokenize("Test string"):
print(sent)
完整示例代码:
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript" src="https://cdn.jsdelivr.net/pyodide/v0.18.0/full/pyodide.js"></script>
<script type="text/javascript">
// init Pyodide
async function pyodide_loader() {
let pyodide_premise = loadPyodide({
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.18.0/full/",
});
let pyodide = await pyodide_premise;
await pyodide.loadPackage("micropip");
await pyodide.loadPackage("nltk");
return pyodide_premise;
}
let pyodideReadyPromise = pyodide_loader();
// run Python code and load NLTK
async function load_packages() {
let pyodide = await pyodideReadyPromise;
let output = pyodide.runPython(`
print(f"*** import nltk")
import nltk
print(f"*** NLTK version {nltk.__version__=} imported, downloading resources now")
pkg = "punkt"
nltk.download(pkg)
str = "Just for testing"
for sent in nltk.sent_tokenize(str):
print(sent)
`);
}
load_packages()
</script>
</body>
</html>
简短的回答是,目前在 Pyodide 中无法使用 Python 下载文件,因为http.client
, requests
等需要浏览器虚拟机不支持的 POSIX 套接字。
令人好奇的是nltk.download
但没有错误——它应该有。
解决方法是手动下载所需的资源,例如使用 JavaScript获取API https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API如图所示这条评论 https://github.com/pyodide/pyodide/issues/400#issuecomment-882101102;
from js import fetch
response = await fetch("<url>")
js_buffer = await response.arrayBuffer()
py_buffer = js_buffer.to_py() # this is a memoryview
stream = py_buffer.tobytes() # now we have a bytes object
# that we can finally write under the appropriate path
with open("<file_path>", "wb") as fh:
fh.write(stream)
我不太了解 Pyodide / WebAssembly 如何管理文件。
默认情况下它是虚拟文件系统(MEMFS https://emscripten.org/docs/api_reference/Filesystem-API.html#memfs)在每次页面加载时都会重置。您可以使用标准 python 工具访问它(open
、“操作系统”等)。如果有需要你也可以挂载持久文件系统 https://github.com/pyodide/pyodide/pull/1596.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)