textract 添加在不同文件类型之间指定自定义提取方法的能力,

x759pob2  于 4个月前  发布在  其他
关注(0)|答案(7)|浏览(74)

在遍历大量文件时,很难为不同的文件类型指定非标准的 method 参数。例如,目前 method 用于 PDF 文件,engine 用于音频文件:

for filename in dir:
   txt = textract.process(filename, method='tesseract', engine='sphinx' )
   print(txt)

我个人喜欢始终为 textract.process 函数提供一个 method 参数的简单性,但如果我们给用户提供了在处理文件之前测试文件扩展名的能力,他们就可以轻松地处理 PDF 文件和音频文件等。我在想这样的实现:

for filename in filenames:
    ext = textract.get_extension(filename)
    if ext == 'pdf':
        kwargs = {'method': 'tesseract'}
    elif ext.is_audio:
        kwargs = {'method': 'sphinx'}
    txt = textract.process(filename, **kwargs)
    print(txt)

另一种方法是将 method 参数也接受一个字典:

methods = {
    'pdf': 'tesseract',
    'audio': 'sphinx',
}
for filename in filenames:
    txt = textract.process(filename, method=methods)
    print(txt)
dxpyg8gm

dxpyg8gm1#

另一个问题是考虑如何在命令行上处理这个问题...

nsc4cvqm

nsc4cvqm2#

将它变成逗号分隔的列表怎么样?每个具有多个提取方法的函数都需要处理分割,但这可以解决CLI问题。

for filename in filenames:
    txt = textract.process(filename, method='tesseract,sphinx')
    print(txt)

我猜想CLI要求不同方法之间不能有空格。
我也喜欢其他提出的建议,但不确定它们如何与CLI一起工作。获取扩展名的想法很好!

t2a7ltrp

t2a7ltrp3#

以下是一些关于命令行界面(CLI)的想法。可能还有其他的想法(如果你有的话,请分享!),但我认为我稍微偏爱配置文件的方法。这给textract提供了同时指定许多kwargs的选项。然后,我们不仅可以使用method重载kwarg,还可以使用配置对象覆盖默认值。
欢迎大家提供想法和反馈!这绝对是UI的重大变化,应该为2.0.0带来重大版本更新,所以我想确保我们做对了。

带连字符的命令行参数

for f in directory/*; do
    textract --method-pdf tesseract --method-audio sphinx $f
done

用冒号分隔的命令行值

for f in directory/*; do
    textract --method pdf:tesseract --method audio:sphinx $f
done

json格式的命令行值

for f in directory/*; do
    textract --method '{"pdf":"tesseract","audio":"sphinx"}' $f
done

配置文件

for f in directory/*; do
    textract --conf textract.conf $f
done
bmp9r5qi

bmp9r5qi4#

我喜欢配置文件选项,比必须形成有效的json更好!其他两个选项的冒号或连字符都是好的,但我认为配置文件更有可能在未来具有更好的兼容性。

a8jjtwal

a8jjtwal5#

感谢@barrust的输入
INI格式?YAML?
我想我对YAML有一点偏好,但我欢迎其他人的观点。
如果我有时间,我可能会在周五飞回芝加哥的路上尝试模拟这个。听起来很有趣:)

jmo0nnb3

jmo0nnb36#

我倾向于使用INI格式,这样人们就可以将其设置到他们项目中的setup.cfg。我也认为我们可以同时解决#96问题,这将非常好。

zpqajqem

zpqajqem7#

这是一段很长的时间,但目前这对大家来说是有效的:

from os.path import splitext
from textract import process

switcher = {
	"pdf": "pdfminer",
	"mp3": "SpeechRecognition"
}

filenames=["hoho.txt", "asdf.pdf", "example.mp3"]
for filename in filenames:
	ext = splitext(filename)[1][1:]
	method = switcher.get(ext, "")
	text = process(filename, method=method)

相关问题