4

作为一个更大项目的一部分,我需要阅读文本并将每个单词表示为一个数字。例如,如果程序读取“每个好男孩都应该得到水果”,那么我会得到一个表格,将 ' every ' 转换为 ' 1742 ',' good ' 转换为 ' 977513 ',等等。

现在,显然我可以使用散列算法来获得这些数字。但是,如果意思相近的词的数值相近,那么“ good ”变成“ 6827 ”,“ great ”变成“ 6835 ”等等,会更有用。

作为另一种选择,而不是表示每个数字的简单整数,最好有一个由多个数字组成的向量,例如(lexical_category时态分类特定字词)其中lexical_category是名词/动词/形容词/等,时态是未来/过去/现在,分类定义了广泛的一般主题,而specific_word与上一段中描述的大致相同。

是否存在这样的算法?如果没有,你能给我一些关于如何开始自己开发的提示吗?我用 C++ 编写代码。

4

4 回答 4

1

如果你的想法有点天真,你的想法很有趣(但不用担心,天真的问题在 NLP 领域很有用)。

撇开其他实际问题不谈(例如解析、词性标注、词干提取,当然还有识别/映射给定单词的问题……之后我会非常简短地讨论它们),这个原则有几个困难你的建议[关于语义上接近的词被编码的数字尺度]:

  • 多义词(花哨的词,表明某些词可以具有多个不相关的含义)
  • 语义是多维的。例如,名词“进取心”既传达了“能量”的概念,也传达了“热情”的概念
  • 有些概念与其他概念完全无关,例如说“茶”和“地毯”属于两组不同的词,但试图将它们放在线性尺度上会隐含地消除这个尺度上的距离的想法(除了可能非常小距离)与语义有任何联系。
  • 表达式:在一个句子中,一个特定的概念有时由一个表达式而不是单个单词来承载。例如“文艺复兴时期的人”或“目录”。
  • 语义有时(通常)来自上下文。例如“老板”通常是指某人的主管,也是布鲁斯斯普林斯汀的昵称。

简而言之
  ,a)含义(或问题中所称的“定义”,或语言学家所称的“语义”)是一件棘手的事情,它不适合映射到一条线甚至一棵树上。可以使用其他图表,例如网络,但即便如此,当应用到相对受限的域之外时,事情也会变得有点棘手。
b) 由于多义词、表达方式等,
  将单词与含义联系起来也很棘手。

无论如何,如果您想尝试问题中建议的那种映射,也许在特定领域的背景下(比如运动评论或机械维修)和/或理解某些词只需要任意映射,在“潜入”之前,您可能想熟悉以下 NLP(自然语言处理)学科和资源

关于您对使用用 C++ 编写的工具的兴趣,您可能会发现其中的几个,用于各种目的(以及各种质量!)。您可能还会发现,尽管出于性能原因它们有时会绑定到用 C/C++ 编写的原语,但 NLP 的许多现代框架和工具倾向于使用 Java 甚至像 Python 这样的脚本语言。我没有使用基于 C++ 的 NLP 软件的直接经验。如果你没有找到你需要的东西(在 C++ 中),我强烈不鼓励你尝试自己实现一些东西,至少在你之前已经广泛审查过现有技术并且对潜在的困难有很好的理解之前。

于 2010-03-22T04:11:04.737 回答
1

要将单词映射到数字,您可能应该只使用index。使用哈希码只是自找麻烦,因为完全不相关的词最终可能会使用相同的值。

有许多方法可以对单词的语义相关程度进行数值测量,例如潜在语义分析 (LSA)或在WordNet等词汇资源(例如LinResnikJiang-Conrath )中使用某种相关性测量 。

要获得您所谓的词汇类别,您需要使用词性 (POS) 标记器。POS 标签也会给你时态信息(例如,VBP 表示这个词是过去时态动词)。

要将单词分配给主题,您可以使用 WordNet 中的上位词信息。这会给你像“红色”是“颜色”这样的东西。或者,您可以使用潜在狄利克雷分配 (LDA),如果您希望将词更柔和地分配给主题,以便每个词可以不同程度地分配给多个主题。

于 2010-03-22T02:18:02.000 回答
0

自然语言处理是一个广泛而复杂的领域。那里有一些工具(请参阅链接文章的软件工具部分),主要的工具可能是 NLTK。

我不知道一个简单的答案,但这是一个开始的地方。

于 2010-03-22T01:53:17.907 回答
0

这是一个更普遍的问题的一部分,称为“意义表示”。我对这个问题很感兴趣,但事实是单词通常太含糊而无法表示为数字。我认为句子可能是更好的候选者,因为至少存在一些上下文。即便如此,将文本表示为数字更像是一个研究问题,而不是编码问题。

对于单词,正如 dmcer 指出的那样,如果您真的想将单词映射到数字,LSA/PLSA/LDA 将是您的最佳选择。但是,在这种情况下,您将得到实数,而不是整数。关于主题模型以及如何将语义相关的词组合在一个主题下(主题模型只不过是词的概率聚类)有大量工作。值得注意的是,LSA 表示过去曾被用于对语义记忆进行建模(请参考 google-scholar “Lemaire and Denhiere”)。但是,正如 mjv 所指出的,必须限制/专门化域,以便您可以确保问题大小不会失控。

最后,我个人认为可能有一些词的基本结构可以用来将它们表示为数字。句子的显式表示,例如谓词,在词性、从句等方面有其自身的问题。但单词不一定要处理这些问题,因此可能仍有一些希望。您可能对以下指针感兴趣:

1> 表示理论 2> 通用网络语言(语言作为单词的超图,其中句子是超边) 3> Kolmogorov 复杂性和表示失真 4> 群论和图论(可能使用许多有趣的表示) 5> 评论数论(查看特定类别的数字是否可以与特定类别的单词相关联)

Risi Kondor 的论文也很有趣。

于 2010-05-26T10:55:23.880 回答