我有一个包含人类输入的观察数据的表。有一列应该对应于另一个列表;人工输入的值应该与某种可能性的主列表中的值完全一致。
然而,问题是人类数据被缩写、拼写错误等等。有没有一种机制可以进行某种相似性搜索,以找出人类输入的数据实际上应该是什么?
示例
**Human Entered** **Should Be**
Carbon-12 Carbon(12)
South Korea Republic of Korea
farenheit Fahrenheit我唯一的想法是将人类输入的数据分成类似3个字符的部分,看看它们是否包含在应该是列表中。它只会选择评分最高的条目。作为以后的补充,它可以为用户提供前10个选项或其他选项。
我也不一定对一个绝对完美的解决方案感兴趣,但如果它像70%的正确工作,它将节省大量的时间通过列表。
发布于 2010-12-25 16:16:39
您可以尝试使用计算两个字符串的相似度
private static int CalcLevensteinDistance(string left, string right)
{
if (left == right)
return 0;
int[,] matrix = new int[left.Length + 1, right.Length + 1];
for (int i = 0; i <= left.Length; i++)
// delete
matrix[i, 0] = i;
for (int j = 0; j <= right.Length; j++)
// insert
matrix[0, j] = j;
for (int i = 0; i < left.Length; i++)
{
for (int j = 0; j < right.Length; j++)
{
if (left[i] == right[j])
matrix[i + 1, j + 1] = matrix[i, j];
else
{
// deletion or insertion
matrix[i + 1, j + 1] = System.Math.Min(matrix[i, j + 1] + 1, matrix[i + 1, j] + 1);
// substitution
matrix[i + 1, j + 1] = System.Math.Min(matrix[i + 1, j + 1], matrix[i, j] + 1);
}
}
}
return matrix[left.Length, right.Length];
}现在计算两个字符串之间的相似度,单位为%
public static double CalcSimilarity(string left, string right, bool ignoreCase)
{
if (ignoreCase)
{
left = left.ToLower();
right = right.ToLower();
}
double distance = CalcLevensteinDistance(left, right);
if (distance == 0.0f)
return 1.0f;
double longestStringSize = System.Math.Max(left.Length, right.Length);
double percent = distance / longestStringSize;
return 1.0f - percent;
}发布于 2010-12-25 07:02:05
一种选择是在两个字符串之间寻找一个小的Levenshtein distance,而不是要求完全匹配。这将有助于找到存在微小拼写差异或拼写错误的匹配。
另一种选择是在比较字符串之前对其进行标准化。有意义的标准化技术取决于您的特定应用程序,但例如,它可能涉及:
将所有的punctuation.
,
然后,您可以比较每个列表成员的规范化形式,而不是原始形式。您可能还希望考虑使用不区分大小写的比较,而不是区分大小写的比较。
发布于 2010-12-25 07:09:09
您是否考虑过使用(...or several)下拉列表来强制执行正确的输入?在我看来,在大多数情况下,当考虑可用性和用户友好性时,这将是一个更好的方法。这也将使这种输入的处理变得容易得多。当仅仅使用自由文本输入时,你可能会有很多不同的方法来写一件事情,而且你“永远”无法弄清楚写任何复杂东西的每一种方法。
示例:如您所写:"carbon- 12“,"Carbon - 12","Carbon ( 12 )","Carbon (12 )","Carbon -12”等。就为了这个,可能性几乎是无穷无尽的。当你也考虑“韩国”和“韩国”这样的事情时,映射不是"1:1“(朝鲜呢?或者仅仅是“韩国”?),这变得更加困难。
当然,我对您的应用程序一无所知,而且可能是完全错误的。但通常情况下,当您期望某个格式的复杂值时,在许多情况下,下拉列表将使您作为开发人员的工作变得更容易,并为最终用户提供更好的体验。
https://stackoverflow.com/questions/4528622
复制相似问题