algorithm - 找到基本单词并估计它们的难度

标签 algorithm language-agnostic nlp heuristics

我正在寻找以下问题的可能简单的解决方案:

给定一个句子的输入 喜欢

"Absence makes the heart grow fonder."

列出基本单词及其难度/复杂度
[["absence", 0.5], ["make", 0.05], ["the", 0.01"], ["grow", 0.1"], ["fond", 0.5]]

假设 那:
  • 句子中的所有单词都是有效的英语单词
  • 受欢迎程度是衡量难度/复杂性的可接受指标
  • 基本词可以以任何 build 性方式理解(见下文)
  • 难度/复杂度从 0 分到 1 分 - 令人难以置信
  • 难度偏差是可以的,虽然比其他方式更容易被误认为是
  • 工作简单的解决方案优于完美但复杂的东西
  • [编辑] 没有与用户
  • 的交互
  • [编辑] 我们可以处理任何正确的英文输入
  • [编辑] 一个词并不比它的基本形式更难(因为作为聪明的人,如果我们知道快乐,我们就可以不快乐地创造),除非它创造了一个新词(不太可能和like难度不一样)

  • 总体思路:

    我考虑过使用 Google 搜索或 Wordcount 之类的网站估计可能表明其难度的单词流行度。但是,两种解决方案都会根据输入单词的形式给出不同的结果。 Google 给出了 3.16 亿个喜欢的结果,而 1100 万个喜欢的结果,而 Wordcount 给出了 6k 和 54k 的排名。

    将单词转换为其基本形式不是必须的,但可以解决歧义问题(并使创建字典链接变得容易),但这不是一项简单的任务,我觉得它的意义值得商榷。显然,应该用喜欢而不是喜欢,但是调查相信而不是难以置信似乎是一种矫枉过正( [编辑] 这可能不是最好的例子,但是有一个时刻在修改基本词时我们会创建一个新的喜欢 -> 可能)和门卫之类的词不应该被一分为二。

    关于什么应该被认为是基本词的一些想法可以找到here on Wikipedia但也许更简单的确定方法是使用字典。例如根据dictionary.reference.com unbelievable is a basic wordfonder comes from fond但后来 grow is not the same as growing

    解决方案的想法:

    在我看来,处理该问题的最佳方法是使用字典查找基本单词,应用一些 Wikipedia 规则,然后使用 Wordcount(可能与 Google 搜索次数相结合)来估计难度。

    尽管如此,可能(可能是更简单和更好的)方法或准备使用算法。我将不胜感激任何解决此问题且易于实现的解决方案。也许我只是想重新发明轮子(或者你知道我的方法会很好用,我在浪费时间思考而不是编写我所拥有的东西)。但是,我宁愿避免实现频率分析算法或准备文本语料库。

    最佳答案

    一些术语:

  • 单词的核心部分称为词干或词根。稍后将详细介绍这种区别。您可以将词根/词干视为承载单词主要含义并将出现在字典中的部分。
  • (英文)大多数单词由一个词根(异常(exception):像“windshield”这样的复合词)/一个词干和零个或多个词缀组成:词根/词干之后的词缀称为后缀,词根/之前的词缀词干称为前缀。示例:“驱动程序”=“驱动器”(根/词干)+后缀“-er”; “unkind”=“kind”(根/词干)+“un-”(前缀)。
  • 后缀/前缀(=词缀)可以是屈折的或派生的。例如,在英语中,第三人称单数动词有 s最后:“我开车”但“他开车”。这些一致的后缀不会改变单词的类别:“drive”是动词,与屈折的“s”无关。另一方面,像“-er”这样的后缀是派生的:它接受一个动词(例如“drive”)并将其变成一个名词(例如“driver”)
  • 词干是没有任何屈折词缀的单词片段,而词根是没有任何派生词缀的单词片段。例如,复数名词“drivers”可分解为“drive”(词根)+“er”(派生词缀,形成新词干“driver”)+“s”(复数)。
  • 派生单词“基本”形式的过程称为“词干”。

  • 所以,有了这个术语,对于你的任务来说,最有用的事情似乎是阻止你遇到的每一种形式,即删除所有的屈折词缀,并保留派生词缀,因为派生词缀可以改变这个词的常见程度被认为是。这样想:如果我用英语告诉你一个新单词,你会always know how to make it plural ,第三人称单数,但是,您可能不知道可以从中派生出的其他一些词)。英语是一种缺乏屈折变化的语言,不需要担心很多屈折变化后缀(谷歌搜索很好地去除了它们,所以也许你可以通过谷歌搜索运行你的词表来使用谷歌的词干引擎得到突出显示的结果):
  • 第三单数动词-s :“我开车”/“他开车”
  • 名词复数 `-s':“One wug”/“Two wug-s”。注意这里有一些不规则的形式,比如“ child ”、“牛”、“鹅”等,我想我不会担心这些。
  • 动词过去时形式和分词形式。常规的很简单:过去时有 -ed对于过去式和过去分词(“I walk”/“I walk-ed”/“I had walk-ed”),但有很多不规则的(fall/fell/fallen、dive/dove/dived? , 等等)。也许列出这些?
  • 口头 -ing形式:“步行”/“步行”
  • 形容词比较 -er和最高级-est .有一些不规则的/补充的(“好”/“更好”/“最好”),但这些不应该是一个大问题。

  • 这些是英语中主要的屈折词缀:我可能忘记了一些你可以通过阅读语言学入门书籍来发现的。还有一些边缘情况,例如“un-”,它是如此混杂,以至于我们可能认为它是屈折的。有关这些类型的更多信息,请参阅 Level 1 vs. Level 2 affixation ,但出于您的目的,我会将这些案例视为衍生案例,而不是阻止它们。

    至于“分级”各种词干的常见程度,除了谷歌,您还可以免费获得各种 text corpora .链接到的维基百科文章有一些免费语料库的链接,您可以通过谷歌搜索找到更多链接。从这些语料库中,您可以构建每个词干的频率计数,并使用它来判断形式的常见程度。

    关于algorithm - 找到基本单词并估计它们的难度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988904/

    相关文章:

    algorithm - 最短路径树声明(图)

    arrays - 给定一个有序数组,其中有几个数字是颠倒的。如何排序?

    language-agnostic - 与语言无关的 API 生成

    tensorflow - 在自定义数据上微调 BERT

    algorithm - 使用情绪分析来检测矛盾的论点?

    java - Memozied Fibonacci 不运行与常规 Fibonacci 解决方案

    java - TreeSet 迭代的时间复杂度是多少?

    java - 以下语法正确吗?

    algorithm - 在有向树上计算 p 表兄弟

    python - 在 GPU 上结合使用 Flair 和 TensorFlow 会产生错误