我有一组巨大的(但有限的)自然语言字符串.
我需要一种方法将每个字符串转换为数字值.对于任何给定的字符串,每次的值必须相同.
两个给定字符串越"不同",两个对应的值应该越不同.它们越"相似",值就越少.
我还不知道我需要的字符串之间的区别是什么.无论如何都没有自然语言解析.它可能应该像Levenstein一样(但是Levenstein是相对的,我需要绝对的度量).让我们从简单的事情开始.
我很乐意满足于多维(3d是最好的)向量而不是单个数值.
正如在此处和此处正确指出的那样,从一个字符串到另一个字符串的距离是具有MAX(firstStringLength, secondStringLength)
维度的向量.通常,在不丢失信息的情况下不可能减少维数.
但是我不需要绝对的解决方案.我会满足于从N维字符串空间到我的3D空间的任何"足够好"的转换.
另请注意,我有一定数量的有限长度的字符串.(虽然字符串数量相当大,约为8000万(10 GB),所以我最好选择一些单通道无状态算法.)
从扫描参考资料来看,我的印象是希尔伯特空间填充曲线可能对我有所帮助.看起来分析Hilbert空间填充曲线的聚类属性文章讨论了一些接近我的问题...
我们将每个字符串映射到N维空间中的一个点,其中N是集合中字符串的最大长度.顺便说一下,字符串中的第i个字符代码可以用作第i个坐标值吗?
我们通过N维空间绘制希尔伯特曲线.
对于每个字符串,我们在曲线上取点,最接近字符串的坐标.该点的希尔伯特值(从曲线起点开始的长度)是我寻求的一维值.
如果我们需要3D值,我们在3D中绘制希尔伯特曲线并选取匹配希尔伯特值的拾取点,如上所述.
这看起来不错吗?这里的计算费用是多少?
我不认为这是可能的.从一个简单的字符串开始,并将其指定为零(这个数字并不重要)
"Hello World"= 0
以下字符串距离它的距离为2:
"XXllo World"= a
"HeXXo World"= b
"你好XXrld"= c
"Hello WorXX"= d
然而,这些字符串中的每一个彼此为4.对于以下实例,无法对数字进行排序以使其正常工作:
a = 1,b = -1,c = 2,d = -2
考虑到c到0是2,但c到a是1,但是0比a更接近.
这只是一个简单的案例.