用 C# 为信息检索应用程序编写倒排索引

2024-04-01

我正在编写一个内部应用程序,其中包含多条文本信息以及有关这些文本的大量数据。这些数据将按照输入顺序保存在数据库(SQL Server,尽管这可能会改变)中。

我希望能够搜索这些信息中最相关的信息,并将最相关的信息放在顶部。我最初考虑使用 SQL Server 全文搜索,但它对于我的其他需求并不像我希望的那样灵活,所以看来我需要为此开发自己的解决方案。

据我了解,需要的是倒排索引 http://www.itl.nist.gov/div897/sqg/dads/HTML/invertedIndex.html,然后根据所保存的附加信息的结果恢复和修改所述倒排索引的内容(尽管现在这可以留到以后,因为我只想倒排索引从数据库中索引主要文本提供的表/字符串)。

我曾尝试使用哈希表在 Java 中编写此代码,其中键作为单词,值作为单词出现的列表,但老实说,我对 C# 仍然相当陌生,并且只真正使用过处理信息时,例如数据集和数据表。如果需要,我会在清除这台笔记本电脑上的病毒后立即上传 Java 代码。

如果给定表或字符串列表中的一组条目,如何在 C# 中创建倒排索引,最好将其保存到 DataSet/DataTable 中?

EDIT:我忘了提及,我已经尝试过 Lucene 和 Nutch,但需要我自己的解决方案,因为修改 Lucene 来满足我的需求比编写倒排索引花费的时间要长得多。我将处理大量元数据,一旦基本倒排索引完成,这些元数据也需要处理,因此我现在需要的只是使用倒排索引在一个区域上进行基本全文搜索。最后,处理倒排索引并不是我每天都要做的事情,所以尝试一下它会很棒。


以下是我过去在 C# 中成功使用的方法的粗略概述:

 struct WordInfo
 {
     public int position;
     public int fieldID;
 }

 Dictionary<string,List<WordInfo>> invertedIndex=new Dictionary<string,List<WordInfo>>();

       public void BuildIndex()
       {
            foreach (int  fieldID in GetDatabaseFieldIDS())
            {    
                string textField=GetDatabaseTextFieldForID(fieldID);

                string word;

                int position=0;

                while(GetNextWord(textField,out word,ref position)==true)
                {
                     WordInfo wi=new WordInfo();

                     if (invertedIndex.TryGetValue(word,out wi)==false)
                     {
                         invertedIndex.Add(word,new List<WordInfo>());
                     }

                     wi.Position=position;
                     wi.fieldID=fieldID;
                     invertedIndex[word].Add(wi);

                }

            }
        }

Notes:

GetNextWord() 迭代该字段并返回下一个单词和位置。要实现它,请使用 string.IndexOf() 和 char 字符类型检查方法(IsAlpha 等)。

GetDatabaseTextFieldForID() 和 GetDatabaseFieldIDS() 是不言自明的,根据需要实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C# 为信息检索应用程序编写倒排索引 的相关文章

随机推荐

  • 未知文件类型:basic archive.of(boost 和 emscripten)

    我正在尝试在浏览器内反序列化文件 使用 boost serialization 我用 emscripten 编译 boost 显然没有问题 当编译 实际上是链接 我的程序时 我收到错误 wasm ld error unknown file
  • 如何缩放 iframe 的内容?

    如何在我的网站页面中缩放 iframe 的内容 在我的示例中 它是 HTML 页面 而不是弹出窗口 例如 我想以原始大小的 80 显示 iframe 中出现的内容 基普的解决方案 https stackoverflow com questi
  • .htaccess 维护多个IP

    我在 htaccess 文件中使用以下代码将我的网站置于维护状态 本质上 它的作用是将非特定 IP 地址的任何人重定向到 maintenance 我有一个维护页面的子域 因此允许我在真实站点上执行测试 我的问题是 如何向该行添加第二个 IP
  • C# 只读二维数组

    在 C 中是否有返回只读二维数组的既定方法 I know ReadOnlyCollection是用于一维数组的正确选择 并且我很高兴编写我自己的包装类来实现this get 但如果这个轮子已经存在 我不想重新发明轮子 不幸的是 没有任何内置
  • Python 日志记录仅从脚本记录

    我正在我的一个简单脚本中使用 Python 日志记录模块 目前进行了以下设置 logging basicConfig format asctime s message s level logging INFO datefmt Y m d H
  • 如何打开机器人电子日志记录

    我需要一种非常简单的方法来让 Robolectric 3 0 打开日志记录 我想看到 robolectric 的输出 而不仅仅是我的测试 我在网上尝试的一切都不起作用 我把这个贴在哪里 robolectric logging enabled
  • 我如何自定义所有 UITextField 的 borderWidth 外观?

    我正在尝试自定义 borderWith 的所有 UITextField 外观 尝试这样的事情 只有前两行有影响 其余线路无法正常工作 UITextField appearance setBackgroundColor UIColor gre
  • 是否可以在

    这个问题在这里已经有答案了 我怎样才能添加 div or a span 标签内的 span div
  • Node-sass 未与 Node / Express 一起编译

    我试图让 node sass 与express一起工作 但我根本无法让它进行任何编译 这是我的 app js 文件 var express require express sass require node sass routes requ
  • 策略模式或函数指针[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在 C 中 当我有可以在运行时接受不同行为的算法时 我宁愿使用函数指针 例如 用于绘制图表的程序有一种绘制线条的算法 该算法可以接受任何函数
  • 同步jquery $.ajax而不锁定IE?

    花了一些时间尝试实现这一点 并找到了一个我认为在 Firefox 中效果很好的解决方案 但是在 IE 中测试时发现使用 async false 会导致浏览器被锁定 停止响应并似乎已冻结 通话时长 要求基本如下 我提供了一系列用户可以检查的复
  • UITableView reloadData EXC_BAD_ACESS 代码=2

    我有用于加载 UITableView 的代码 int numberOfSectionsInTableView UITableView tableView if tableView self peopleTableView return se
  • printf 不在 eclipse 的控制台上打印?

    include
  • Spark sql row_number 还是序列号?

    随机数生成器 SparkSQL 例如 Netezza 序列号 mysql 序列号 Thanks Spark sql 中的序列在 Spark 1 6 中 其 select monotonically increasing id from ta
  • “看过这个的人也看过”算法

    我正在尝试编写一种算法 其作用有点像亚马逊的 购买此产品的人也购买了 两者之间的区别在于 我的只是计算您在单个会话中观看的 产品 而亚马逊则计算每次购买 结账 我在实施和弄清楚算法应该是什么方面遇到了一些困难 到目前为止 我正在通过 Ses
  • 在 Cassandra 中选择列为空的行

    我在 Cassandra 中有下表 CQL 规范 3 3 0 Users
  • MIPS 中的影子寄存器是什么以及它们如何使用?

    当我了解 MIPS 架构时 我遇到了影子寄存器 据说它们是通用寄存器的副本 我无法理解以下内容 何时使用影子寄存器 MIPS 影子寄存器用于减少处理中断时的寄存器加载 存储开销 分配了影子寄存器组的中断不需要保存任何现有上下文来提供空闲寄存
  • 在 Java 桌面应用程序中保存数据的最佳方法是什么?

    我的桌面应用程序中有一个很大的 Java 对象树 我正在尝试确定将它们作为文件保存到文件系统的最佳方法 我的一些想法是 使用 DataOutputStream 滚动我自己的序列化器 这将使我能够最大程度地控制文件中的内容 但代价是对其进行微
  • 使用文件协议调用 Chrome 中 iframe 中定义的 JavaScript 函数

    这个问题与此处提出的问题的完全更新版本非常相似 如何使用文件协议在 Chrome Webkit 中从一帧调用 JavaScript 函数到另一帧 https stackoverflow com questions 2570718 how t
  • 用 C# 为信息检索应用程序编写倒排索引

    我正在编写一个内部应用程序 其中包含多条文本信息以及有关这些文本的大量数据 这些数据将按照输入顺序保存在数据库 SQL Server 尽管这可能会改变 中 我希望能够搜索这些信息中最相关的信息 并将最相关的信息放在顶部 我最初考虑使用 SQ