根据定义将单词映射到数字

时间:2010-03-22 01:48:02

标签: c++ nlp hash semantic-markup

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

现在,显然我可以使用散列算法来获取这些数字。但是,如果具有相似含义的单词具有彼此接近的数值,那么“ 良好 ”变为“ 6827 ”会更有用并且“ 伟大的 ”变为“ 6835 ”等。

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

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

4 个答案:

答案 0 :(得分:1)

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

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

要获得您所谓的词汇类别,您需要使用a part-of-speech (POS) tagger。 POS标签还会给你紧张的信息(例如,VBP意味着这个词是过去时动词)。

要为主题分配单词,您可以使用WordNet中的hypernym information。这会给你像'红色'这样的'颜色'。或者,您可以使用Latent Dirichlet allocation (LDA),如果您希望对主题进行更简单的单词分配,以便可以在不同程度上将每个单词分配给多个主题。

答案 1 :(得分:1)

如果只是有点天真(但没有担心,天真的问题在NLP领域有用),你的想法很有意思。

抛开其他实际问题(例如解析,POS标记,词干,当然还有识别/映射给定单词的问题......此后我会非常简短地讨论它们),有几个你的建议的原则的困难 [一个数字刻度,其中语义上接近的单词被编码在附近]:

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

简而言之 a)意义(或“定义”,如问题所述,或“语义”,由语言学家调用)是一个棘手的事情,它不适合存在映射到一条线,甚至一棵树上。可以使用其他图形,例如网络,但即使这样,当应用于相对受限制的域之外时,事情会变得有点棘手。

b)将词语与意义联系起来也很棘手,因为多义词,表达等等。

从不如此,如果您想尝试在问题中提出的那种映射,可能是在特定领域的背景下(比如运动评论或机械修复)和/或理解某些单词将只是必须被任意映射,在“潜入”之前,您可能希望熟悉以下NLP(自然语言处理)学科和资源

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

答案 2 :(得分:0)

Natural Language Processing是一个广泛而复杂的领域。有一些工具(参见链接文章的软件工具部分),主要的工具可能是NLTK。

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

答案 3 :(得分:0)

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

正如dmcer指出的那样,如果你真的想将单词映射到数字,LSA / PLSA / LDA将是你最好的选择。但在这种情况下,您将得到实数,而不是整数。关于主题模型的大量工作以及如何将语义相关的单词组合在一个主题下(主题模型只不过是单词的概率聚类)。值得注意的是,LSA表示过去曾用于模拟语义记忆(请谷歌学者“Lemaire和Denhiere”作为参考)。但是,正如mjv所指出的那样,域名必须受到限制/专门化,这样才能确保问题规模不会失控。

最后,我个人认为可能存在可用于将其表示为数字的单词的基础结构。句子的明确表示,例如谓词有自己的问题,与POS,条款等的排序有关。但是,单词不一定要处理这些问题,所以可能还有一些希望。您可能对以下指针感兴趣:

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

Risi Kondor的论文也很有趣。