【问题标题】:How to store an inverted index in to binary file?如何将倒排索引存储到二进制文件中?
【发布时间】:2017-10-02 01:02:40
【问题描述】:

我有一个术语的 HashMap,其中包含单词出现的页面、页面中单词的频率以及它们的位置的数据。

例如:单词 - [页码、页面中的词频、页面中的位置]

cat [1, 3, 1, 2, 5 ], [2, 2, 2, 5 ]
dog [2, 2, 1, 7 ]

如何将这些信息存储在易于读取的二进制文件中?

我做了以下尝试:

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(baos);

        for(String word: invertedIndex.keySet()) {
            out.writeUTF(word);  // Write the word
            for(Entry entry: invertedIndex.get(word)) {  // Info for a page
                out.writeInt(entry.pageNum); // Write its page number
                out.writeInt(entry.wordFrequency); // Write its freq in that page

                for(int position: entry.positions) {
                    out.writeInt(position); // Write the positions
                }
            }
        }

        byte[] bytes = baos.toByteArray();

        FileOutputStream fos = new FileOutputStream(PATH);
        fos.write(bytes);
        fos.close();

不确定这是否正确...在此先感谢。

编辑:谢谢,原来我的问题更多是关于如何解码这个相当严格的编码。

【问题讨论】:

  • 为什么不直接序列化Map,即使用ObjectOutputStream
  • @Andreas 这是一个任务,并被告知“不要简单地将序列化的 java 对象写入磁盘”。有没有办法以二进制形式保存这种数据结构?
  • “有没有办法保存这个数据结构?” 是的……你写代码。你已经编写了代码。您的实际问题是什么?
  • 可能是你的老师在你连载之前找你compress
  • @StephenC - 如何将这些数据写入二进制文件,以便轻松读取数据?像 [猫 1 3 1 2 5 2 2 2 5 狗 2 2 1 7]。如何将其存储在我读取它并知道某些字节(?)是字符串的二进制文件中?

标签: java binary binaryfiles binary-data


【解决方案1】:

有没有办法保留这个数据结构?

是的。很多方法。

提示:您尝试的解决方案是一个好的开始。

但是,完整的解决方案需要相应的方法来读回数据。而当你尝试编写一个与你的写代码对应的读方法时,你会发现存在系统性问题。例如,没有简单的方法可以确定一个int 值列表的结束位置和下一个值的开始位置。

有办法解决这个问题。 考虑一下。你怎么能一个接一个地写两个列表,以便知道一个结束和下一个开始?

注意:您不需要使用ByteArrayOutputStream。您可以直接写信给包裹在BufferedOutputStream 中的FileOutputStream

【讨论】:

  • 更准确地说:他可以知道当前列表在哪里结束,但他无法判断是下一个列表还是下一个词。
  • 考虑一个单词出现在多个页面上的情况。
  • 当有一个字符串时列表结束,也就是下一个条目开始的时候。但我不太熟悉它是如何以二进制形式存储的。就像我将一个单词写入二进制文件一样:out.writeUTF(word);和其他的东西 out.writeInt(entry.pageNum); out.writeInt(entry.wordFrequency);。它是否以类似的方式存储:String int int String int int.所以当我第一次阅读二进制文件时,我知道这些字节是字符串,而这些字节是 int?
  • 我想让你想想如何编写 2 个整数列表。一旦你弄清楚了,你可以在这里概括/应用解决方案。
  • @Baikol 因为您预先知道列表中有多少条目,所以先写计数。然后读者可以读取该计数,并确切知道后面有多少个值。
猜你喜欢
  • 2014-11-12
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多