【问题标题】:How to find relevant fields from a document text? [closed]如何从文档文本中查找相关字段? [关闭]
【发布时间】:2019-02-18 21:39:12
【问题描述】:

我从账单的 pdf 中提取了文本,看起来像这样(账单可能不同)

___________________________________________________ |发票编号 |项目 ID |项目名称 |数量 |金额 | |___________|________|_____________|_______|________| |12323133 | 1 |惠普笔记本电脑 | 1 | 180000| |1234534H | 1 |惠普笔记本电脑 | 1 | 180000| |SW323133 | 1 |惠普笔记本电脑 | 1 | 180000| |FGF323133 | 1 |惠普笔记本电脑 | 1 | 180000| |___________|________|_____________|_______|________|

现在,我需要一种算法来查找所有相关信息,例如发票编号/项目名称等。文本可以短于或超过 2-3 页

【问题讨论】:

  • 文本是否有任何格式,例如 CSV 或类似格式?你能给我们举个例子吗?到目前为止,您在 java 中尝试过什么?
  • 你的源文件是pdf吗?
  • 是的,这是使用pdftools从pdf/image中提取的文本。
  • 提取后是什么格式或数据结构?任何List<String> 行或Map<Integer, String> 行及其编号?
  • 我建议您在使用 pdftools 提取数据时将此数据转换为 jsonobject。在 jsonobject 中获取数据后,您将对数据有更多的控制权。否则,由于不需要的间距或其他一些特殊字符,以文本格式处理这些数据将非常关键

标签: java nlp text-processing


【解决方案1】:

似乎空格是分隔符,如“;”在 .csv 中,因此您可以使用 String.split(Pattern.quote(" ")); 创建一个数组并在每 5 个元素之后跳到下一行。

试试这样的:

File f = new File("example.pdf");
        BufferedReader br = new BufferedReader(new FileReader(f));
        ArrayList<String> Data = new ArrayList<String>();
        while((line = br.readLine()) != null) {
            String[] a = line.split(Pattern.quote(" "));
            for(int i = 0; i < a.length; i++) {
                if(!(a[i] == null || a[i] == "")) {
                    Data.add(a[i]);
                }
            }
        }

【讨论】:

  • 但是账单可以是不同的格式。所以我不能依赖列位置
  • 嗯,你是对的.. 但后来我认为你需要为每张不同的账单使用不同的算法
【解决方案2】:

某些值可能包含空格的事实在这里是一个问题,因为这些值是由空格分隔的。如果您可以控制提取此信息的程序,我建议您尝试转义其输出中的值,例如“Hp 笔记本电脑”。在输入像这样格式化之后,正常的 csv 解析方法应该允许您提取映射到标题的信息。这个库可能会对此有所帮助:

https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVParser.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2015-01-28
    • 2020-12-29
    相关资源
    最近更新 更多