【问题标题】:How to compare the already existing file with new file haskell如何将现有文件与新文件haskell进行比较
【发布时间】:2016-09-02 14:07:34
【问题描述】:

我正在 Haskell 中实现倒排索引。 我已经证明了我的代码会为我提供的文档列表中的每个单词创建倒排索引。然后将此索引写入名为 inv.txt 的文件,类似于:

("这个",[d1,d2,d5])

("是",[d3,d4,d16])

("你好",[d1])

但是,我想添加一个额外的案例,如果我将一个新文档添加到我的文件夹并调用该函数,“inv.txt”会根据新添加的文档进行更新。 所以它现在变成了类似

("this",[d1,d2,d5,new Doc])

("是",[d3,d4,d16])

("你好",[d1])

("get",[新文档])

但我想不出一种方法来解决它。这在haskell中有可能吗? (无需重写整个文件,例如使用 seekg 或 peekg 函数之类的)?

【问题讨论】:

    标签: file haskell io


    【解决方案1】:

    由于您的主要用例是将文档添加到索引中,这样怎么样:

    1. 您的索引文件由文本行组成,每个键一行。
    2. 在读取索引时,如果您第一次看到该键,则将键值对插入到您的 Map(或您用作倒排索引的任何内容)中。否则,如果键已经存在,则将值附加/附加到 Map 中的现有值。
    3. 要添加新文档,只需查找文件末尾并写出新文档的配对即可。

    例如,假设您的索引文件包含以下行:

    ("this",[d1,d2,d5])
    ...
    ("this", [d6])
    

    当您遇到第一个“this”对时,您将在 Map 中创建该对,当您遇到第二个“this”对时,您会将 d6 附加/前置到与键关联的当前列表中。

    【讨论】:

    • 这是一个不错的方法,但唯一的问题是,我想在 [d1,d2,d5] 之后将 [d6] 添加到同一个列表中......因为之后,我要搜索term "this" ,这将返回包含单词 "this" 的所有文档的列表。
    • 我假设您将在使用索引之前将其加载到内存中。如果不是这种情况,只需将数据存储在 sqlite 数据库文件 - 或 dbm / gdbm / BerkeleyDB 文件中。查看您当前的查找代码会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多