【问题标题】:Why does Tika 2.1 app ignore text in a .txt file?为什么 Tika 2.1 应用程序会忽略 .txt 文件中的文本?
【发布时间】:2021-10-31 06:22:13
【问题描述】:

我正在使用以下命令在 Ubuntu 20.04 下的命令行中使用 Tika 2.1 处理文件:

java -jar tika-app-2.1.0.jar -t test.txt

该文件是纯文本 ANSI 文件(所有字符都是 0x0 到 0x7f)。令人难以置信的是,当文本文件中存在特定字符串时,Tika 2.1 应用程序会忽略所有字符。

这是文本文件:

From:
Sent:
text

this is a test
testing 

next
last

这是输出:

this is a test
testing

next
last

为了表明这是一个没有格式化、没有 Unicode 2 字节序列等的纯 ANSI 文本文件,这里是 'od' 命令的输出:

0000000 7246 6d6f 0d3a 530a 6e65 3a74 0a0d 6574
0000020 7478 0a0d 0a0d 6874 7369 6920 2073 2061
0000040 6574 7473 0a0d 6574 7473 6e69 2067 0a0d
0000060 0a0d 656e 7478 0a0d 616c 7473

但是,如果我只是将“已发送:”更改为“已发送:”,则输出为:

From:
sent:
text

this is a test
testing

next
last

我一直在解决此问题,但没有看到连接。如果我将“已发送:”附加到第一行:

From: Sent:
Sent:
text

this is a test
testing 

next
last

结果是:

this is a test
testing

next
last

但如果我在第二行将“Sent:”更改为“\Sent”,我会得到以下输出:

From: Sent:
\Sent:
text

this is a test
testing

next
last

还有这个文件:

From: Sent:
Sent:
Sent:
text

this is a test
testing 

next
last

这个输出的结果:

this is a test
testing

next
last

但如果我将“Sent:”放在第一行或一个简单的 (0d 0a) 作为前两个字节,输出就可以了。为什么第二行的开头似乎很重要,以及大写或小写工作但不是“已发送:”?为什么在“已发送”前面加上“\”会使其工作?我还在另一台机器上尝试过这个 - 一台运行 Ubuntu 18.04 并在 Windows 10 系统上运行 jar - 两者都得到相同的结果。

Tika 对一个非常简单的文本文件的基本响应是怎么回事?我没有以任何方式改变罐子。这是从 Apache Tika 站点下载的 jar 文件。我错过了什么?

非常感谢任何信息。

【问题讨论】:

  • 看起来 Tika 可能会将其解释为一封电子邮件 - 如果您获取元数据,您会在那里找到其余信息吗?
  • @Gagravarr:当我运行检测时,它显示它是消息/rfc822 类型的电子邮件。但我拥有的所有文件都是包含 OCR 操作内容的文本文件。我只想对文本进行操作并将元数据单独存储。所以我只想让 TIKA 提供文件中的文本,然后我可以翻译和分析。如果 Tika 只允许它自己的解释而不是使用 .txt 扩展名,那么它将不适用于我的应用程序。有没有办法强制检测到文件扩展名(即txt)?
  • 这很有趣,因为如果我将 0d 0a 添加到文件的开头,它会检测到一个文本文件并且工作正常。
  • 如果知道是文本文件,可以跳过AutoDetectParser,直接调用文本解析器。或者,在元数据上设置内容类型属性,然后调用DefaultParser,它会为您调用文本解析器
  • @Gagravarr - 听起来不错。我一直在使用服务器模式,将按照您的建议使用 API。 Tx 寻求帮助。

标签: apache-tika


【解决方案1】:

Tika 将文本解释为电子邮件。此特定示例是电子邮件的文本提取,并包含某些关键字(例如,特定位置的“发件人:”和“发件人:”)。这就是为什么在文件开头添加其他字符时,它默认将其解释为纯文本文件。

我原以为解释顺序首先基于“.txt”扩展名,然后分析内容(在这种情况下,该文本文件没有任何元数据)。但这里的情况似乎并非如此。在考虑“.txt”扩展名之前,分析似乎是第一顺序。

该示例通过作为服务器运行的 Tika 运行。展望未来,我将使用 Tika API 并遵循评论者 (@Gagravarr) 提供的建议,跳过对 AutoDetectParser 的调用,在元数据上设置内容类型属性并通过 API 调用 DefaultParser。

发送给@Gagravarr 以寻求解决方案。

【讨论】:

  • 您也可以通过 Tika Server 执行此操作,方法是在 HTTP 请求中添加内容类型以达到相同的结果:curl -T test.txt http://localhost:9998/tika --header "Content-Type: text/plain"
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 2014-06-15
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2017-09-20
  • 2014-07-10
相关资源
最近更新 更多