在没有获得信息检索学位的情况下,我想知道是否存在任何算法来计算给定文本正文中单词出现的频率。目标是对人们在一组文本评论中所说的话有一个“总体感觉”。沿着 沃德尔.

我想要什么:

  • 忽略冠词、代词等(“a”、“an”、“the”、“him”、“them”等)
  • 保留专有名词
  • 忽略连字符,软类型除外

伸手摘星,这些将是桃色的:

  • 处理词干和复数(例如喜欢、喜欢、喜欢、喜欢匹配相同的结果)
  • 形容词(副词等)与其主语的分组(“great service”而不是“great”、“service”)

我已经尝试使用 Wordnet 进行一些基本的操作,但我只是盲目地进行调整,并希望它适用于我的特定数据。更通用的东西会很棒。

有帮助吗?

解决方案

您需要的不是一种,而是几种不错的算法,如下所示。

  • 忽略代词是通过 非索引字表.
  • 保留专有名词?你的意思是,检测命名实体,比如 胡佛 并说“这是一个词”或复合名词,例如 编程 语言?我给你一个提示:这很难,但是两者都有库。寻找 NER(命名实体识别)和词汇分块。 开放式自然语言处理 是一个兼具这两种功能的 Java 工具包。
  • 忽略连字符?你的意思是,比如换行符?使用正则表达式并通过字典查找验证结果单词。
  • 处理复数/词干:你可以看看 雪球词干分析器. 。它很好地发挥了作用。
  • 将形容词与其名词“分组”通常是一项任务 浅层解析. 。但如果您专门寻找定性形容词(好、坏、糟糕、惊人......),您可能会感兴趣 情绪分析. 灵管 这样做,以及更多。

对不起,我知道你说你想KISS,但不幸的是,你的要求没那么容易满足。尽管如此,所有这一切都存在工具,并且您应该能够将它们捆绑在一起,而不必自己执行任何任务(如果您不想)。如果你想自己执行一项任务,我建议你看看词干,这是最简单的。

如果您使用 Java,请结合 卢塞恩开放式自然语言处理 工具包。你会得到非常好的结果,因为 Lucene 已经内置了一个词干分析器和很多教程。另一方面,OpenNLP 工具包的文档很少,但您不需要太多。你也可能对此有兴趣 NLTK, ,用Python编写。

我想说你放弃最后一个要求,因为它涉及浅层解析,并且绝对不会改善你的结果。

啊,顺便说一句。您正在寻找的文档术语频率事物的确切术语称为 tf-idf. 。这几乎是查找术语文档频率的最佳方法。为了正确地做到这一点,您将无法回避使用多维向量矩阵。

...是的,我知道。参加完关于 IR 的研讨会后,我对 Google 的敬意更加深了。不过,在 IR 做了一些工作之后,我对他们的尊重也很快消失了。

其他提示

欢迎来到NLP的世界^_^

您所需要的只是一点基础知识和一些工具。

已经有一些工具可以告诉您句子中的单词是名词、形容词还是动词。他们叫 词性标注器. 。通常,它们采用纯文本英语作为输入,并输出单词、其基本形式和词性。以下是流行的 UNIX 词性标注器对您帖子第一句的输出:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

如您所见,它将“算法”确定为“算法”和“存在”的复数形式(nns)是“存在”的共轭(vbz)。它还确定了“ a”和“ as”为“确定词(dt)”,这是文章的另一个词。正如您所看到的,词性标注器还对标点符号进行了标记。

要完成列表中除最后一点之外的所有操作,您只需通过 POS 标记器运行文本,过滤掉您不感兴趣的类别(限定词、代词等)并计算基本形式的频率的话。

以下是一些流行的词性标注器:

树标记者 (仅限二进制:Linux、Solaris、OS-X)
吉尼亚标记者 (C++:自行编译)
斯坦福 POS 标记器 (爪哇)

要完成清单上的最后一件事,您需要的不仅仅是单词级信息。一个简单的开始方法是计数 序列 而不仅仅是言语本身。这些被称为 n 元语法. 。一个好的起点是 诗人的 UNIX. 。如果你愿意投资一本关于 NLP 的书,我会推荐 统计自然语言处理基础.

以下是如何在 Python 中执行此操作的示例,这些概念在任何语言中都是类似的。

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

第一行只是获取有助于解决部分问题的库,如第二行所示,urllib2 下载了 Ambrose Bierce 的“魔鬼词典”的副本。接下来的几行列出了文本中所有单词的列表,不带标点符号。然后创建一个哈希表,在本例中它就像与数字关联的唯一单词的列表。for 循环遍历 Bierce 书中的每个单词,如果表中已经存在该单词的记录,则每个新出现的记录都会为表中与该单词关联的值加一;如果该单词尚未出现,则会将其添加到表中,值为 1(表示出现一次。)对于您正在讨论的情况,您需要更加注意细节,例如使用大写仅帮助识别句子中间的专有名词等,这很粗糙,但表达了概念。

为了深入研究词干和复数化的东西,进行实验,然后研究第 3 方的工作,我喜欢 NLTK 的一部分,这是一个学术开源项目,也是用 Python 编写的。

我不久前编写了一个完整的程序来做到这一点。稍后我回家后可以上传演示。

这是代码(asp.net/c#):Http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

你问题的第一部分听起来没那么糟糕。您基本上需要做的就是从文件(或流)中读取每个单词并将其放入前缀树中,每次遇到已经存在的单词时,您都会增加与其关联的值。当然,您还会有一个忽略列表,其中包含您希望在计算中排除的所有内容。

如果您使用前缀树,您可以确保找到任何单词的时间复杂度为 O(N),其中 N 是数据集中单词的最大长度。在这种情况下,前缀树的优点是,如果您想查找复数和词干,您可以检查 O(M+1)(如果单词可能这样做),其中 M 是没有词干或复数的单词的长度(这是一个词吗?呵呵)。一旦你构建了前缀树,我就会重新分析它的词干等,并将其压缩,以便根词保存结果。

在搜索时,您可以制定一些简单的规则,以使匹配在根或茎或您拥有的情况下返回正值。

第二部分似乎极具挑战性。我天真的倾向是为形容词-主语分组保留单独的结果。使用与上面相同的原则,但将其分开。

语义分析的另一种选择可以是将每个句子建模为主语、动词等关系的树(句子有主​​语和动词,主语有名词和形容词等)。一旦您以这种方式分解了所有文本,似乎就很容易浏览并快速计算所发生的不同的适当配对。

只是一些漫谈,我确信有更好的想法,但我喜欢思考这些东西。

你刚才描述的算法。一个开箱即用的程序,带有一个大按钮,上面写着“Do it”......我不知道。

但让我说点建设性的。我向你推荐这本书 集体智慧编程. 。第 3 章和第 4 章包含非常实用的示例(实际上,没有复杂的理论,只是示例)。

您可以使用世界网词典来获取问题关键字的基本信息,例如其过去的言论,提取同义词,您也可以对您的文档执行相同的操作,为其创建索引。然后您可以轻松地将关键字与索引文件匹配并对文档进行排名。然后对其进行总结。

您列出的所有内容都得到了很好的处理 稀疏的.

  1. 忽略一些单词 - 使用停用词
  2. 提取主题 - 使用词性标记来识别它(开箱即用)。解析句子后,找到“ROOT”——句子的主要动词。经过 导航解析树 你会找到一个与这个动词相关的名词。这将是主题。
  3. 忽略连字符 - 他们的分词器在大多数情况下处理连字符。它可以轻松扩展以处理更多特殊情况。

如果主题列表是预先确定的并且不是很大,您甚至可以进一步:建立一个预测主题的分类模型。假设您有 10 个科目。您收集例句或文本。您将它们加载到另一个产品中: 神童. 。使用它出色的界面,您可以快速将主题分配给样本。最后,使用分类样本训练 spacy 模型来预测文本或句子的主题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top