【问题标题】:how to perform query expansion如何执行查询扩展
【发布时间】:2013-03-09 17:26:18
【问题描述】:

我正在开发一个 C# 应用程序,其中用户提供一组单词(通常少于 10 个),我需要检索这些单词的所有同义词。这是我第一次使用字典和这些东西。我需要知道要遵循的步骤,以及是否有提供同义词的现有字典可以与我的应用程序集成,或者是否有我可以使用的开源应用程序或代码。

【问题讨论】:

  • 你有字典吗?它必须是本地字典,还是允许使用 API?
  • 谷歌搜索“dictionary api”会返回很多结果。这里是其中之一:dictionaryapi.com
  • 亲爱的 TheGreatCO,我还没有字典可以使用,字典应该是本地的,我不需要完全字典,我需要一种词库来为给定的同义词提供同义词word,某种查询扩展。亲爱的 FredrickRedin,我做了一些研究,发现的只是 API,我不需要。
  • @user1905455 回复评论时,一定要@回复用户,让他们收到通知。
  • @user1905455 您需要迈出第一步,找到要下载的词库。我怀疑您需要找到字典并对其进行解析以启用交叉引用。有几个选项,包括普林斯顿 wordnet 和古腾堡项目。

标签: c# thesaurus


【解决方案1】:

回答你的第一个问题。您可以在此处找到词库下载:http://wordpresscloaker.com/blog/download-free-english-thesaurus-format-txt.html

我对该文件的质量、准确性、合法性、使用许可或完整性不作任何承诺。但是,这将使您上路。您需要提取 mthesaur.txt 并将其添加到您的项目文件夹中。

接下来,您需要通过执行以下操作来读取文本文件:

var reader = new StreamReader(File.OpenRead(@"C:\mthesaur.txt"));
var dict = new Dictionary<string, string>();
while (!reader.EndOfStream)
{
    // Read the file line by line.
    var line = reader.ReadLine();

    // If the line isn't null, we can use it.  This shouldn't happen but it is a good sanity check.
    if (line == null) continue;
    // Split the line by the delimiter (a comma) so we can get the main word, the first one on the line.
    var splitLine = line.Split(',');
    var mainWord = splitLine[0];
    // To save us from having to loop through and only get the indexes above 0 (eg, skip the main word) we will just simply remove it from the line so we have just synonyms.
    line = line.Replace(mainWord + ",", string.Empty);
    // Now we make use of the dictionary type in C# and add the mainword as the key and the synonyms as the value.
    try
    {
        dict.Add(mainWord, line);
    }
    catch (ArgumentException argEx)
    {
        Console.WriteLine("Attempted to add {0} to the dictionary but it already exists.", mainWord);
    }
}

现在我们在 C# 中的键/值字典中拥有所有内容,您可以使用 LINQ 查询输入单词的同义词。这可以通过使用包含字典中所有键值的下拉列表(不推荐,因为这将是一个非常大的下拉列表并且用户难以导航)、ListBox(更好,更易于导航)来完成,或纯文本搜索框。虽然这并不能完全回答您的问题,因为这里没有为用户处理 GUI,但这应该会让您顺利进行。

【讨论】:

  • 我已经尝试过你的代码,但是当我编译它时,我在最后一行得到一个 ArgumentException,它说“已经添加了具有相同键的项目。”知道出了什么问题吗?
  • @user1905455 我已经更新了答案以在不使程序崩溃的情况下捕获此异常。但是,我建议您在Console.WriteLine 上设置一个断点,以查看哪些键特别会导致问题。那我建议你检查一下实际的词库文件,看看这是编程错误还是代码有问题。
  • 谢谢这段代码运行良好,我找到了重复的键
【解决方案2】:

如果您使用SQL full text search 或底层技术——Microsoft Search Server(有一个免费的Express SKU),您会发现多种语言的词库和其他自然语言处理工具。我当然假设你正在做一个实际的项目,而不是做家庭作业......

如果您更喜欢开源,请查看Lucene.net - 它提供了一个搜索引擎,我很确定它有词库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多