2

给定一个单词,我想获得该单词在英语中最常见的前辈和后继者的列表。我开发了一个代码,可以对任何语料库进行二元组分析(我使用过安然电子邮件语料库),并且可以预测下一个最常见的可能单词,但我想要一些其他解决方案,因为 a)我想检查我的预测的工作/准确性 b ) 基于语料库或数据集的解决方案因看不见的单词而失败

例如,给定“优秀”这个词,我想得到最有可能出现在优秀之前和优秀之后的词

我的问题是是否存在任何特定的服务或 api 用于此目的?

4

3 回答 3

3

任何解决这个问题的方法都必然是基于语料库的方法;你只需要一个更大的语料库。我不知道有任何网络服务或图书馆可以为您执行此操作,但有一些方法可以获得更大的语料库:

  • 谷歌发布了一个庞大的n- gram 语料库,该语料库是从网络的英文部分收集的。它可以通过语言数据联盟 (LDC) 获得,但我相信您必须是 LDC 成员才能获得它。(很多大学都是。)
  • 如果您不是 LDC 成员,请尝试下载Wikipedia 数据库转储(get enwiki) 并在此基础上训练您的预测器。
  • 如果您碰巧使用 Python,请查看NLTK提供的一组不错的语料库(和工具) 。

至于看不见的单词问题,有一些方法可以解决它,例如,将所有出现频率低于某个阈值的单词替换<unseen>为训练之前的特殊标记。这将使您的评估更加困难。

于 2012-01-07T12:37:17.530 回答
2

您必须提供更多“看不见”单词的实例或上下文,以便算法可以做出一些推断。一种间接的方法可以是阅读句子中的其余单词..并在字典中查找遇到这些单词的单词。一般来说,你不能指望算法在第一时间学习和理解推理。想想你自己..如果给你一个新词..你能在多大程度上理解它的含义(可能是通过研究它在句子中的使用方式以及你的理解程度)但是你做出有根据的猜测和在你理解含义的时间段内。

于 2012-01-08T23:24:50.733 回答
2

我只是重新阅读了原始问题,我意识到答案,包括我的答案。我认为最初的人只是想解决一个简单的编程问题,而不是寻找数据集。

如果您列出所有不同的单词对并计算它们,那么您可以用该列表上的简单数学来回答您的问题。

当然,您必须进行大量处理才能生成列表。虽然确实,如果不同单词的总数达到 30,000 之多,那么可能有十亿对,但我怀疑在实践中会有这么多。因此,您可能可以在内存(或磁盘)中创建一个具有巨大哈希表的程序,然后将它们全部计算在内。如果您不需要无关紧要的对,您可以编写一个程序,在扫描时定期清除不太重要的对。您还可以分割单词列表并生成一百个单词与其余单词的对,然后是下一个一百个单词,依此类推,并进行计算。

我的原始答案在这里,我将离开它,因为这是我自己的相关问题:

我对类似的东西感兴趣(我正在编写一个建议单词完成和标点符号的输入系统,我希望它是多语言的)。

我找到了 google 的 ngram 文件的下载页面,但它们不是那么好,它们充满了扫描错误。'i's become '1's, words run together etc. 希望谷歌从那时起改进了他们的扫描技术。

just-download-wikipedia-unpack=it-and-strip-the-xml 的想法对我来说是个失败,我没有一台快速的计算机(嘿,我可以在 atom 上网本和 android 设备之间进行选择) . 想象一下,我需要多长时间才能将 3 GB 的 bz2 文件解压缩成什么?100 个 xml,然后用漂亮的汤和过滤器对其进行处理,他承认在每个文件中都崩溃了,需要重新启动。

出于您的目的(之前和之后的单词),您可以创建一个真实单词字典并过滤 ngram 列表以排除错误扫描的单词。人们可能希望扫描足够好,以便您可以通过仅获取最流行的单词来排除错误扫描......但我看到了一些不断出错的迹象。

顺便说一下,ngram 数据集在这里http://books.google.com/ngrams/datasets

这个网站可能有你想要的http://www.wordfrequency.info/

于 2012-01-08T22:42:27.197 回答