首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配两个列表

匹配两个列表
EN

Stack Overflow用户
提问于 2010-12-25 06:59:34
回答 3查看 312关注 0票数 3

我有一个包含人类输入的观察数据的表。有一列应该对应于另一个列表;人工输入的值应该与某种可能性的主列表中的值完全一致。

然而,问题是人类数据被缩写、拼写错误等等。有没有一种机制可以进行某种相似性搜索,以找出人类输入的数据实际上应该是什么?

示例

代码语言:javascript
复制
**Human Entered**         **Should Be**
Carbon-12                 Carbon(12)
South Korea               Republic of Korea
farenheit                 Fahrenheit

我唯一的想法是将人类输入的数据分成类似3个字符的部分,看看它们是否包含在应该是列表中。它只会选择评分最高的条目。作为以后的补充,它可以为用户提供前10个选项或其他选项。

我也不一定对一个绝对完美的解决方案感兴趣,但如果它像70%的正确工作,它将节省大量的时间通过列表。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-25 16:16:39

您可以尝试使用计算两个字符串的相似度

代码语言:javascript
复制
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];
}

现在计算两个字符串之间的相似度,单位为%

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2010-12-25 07:02:05

一种选择是在两个字符串之间寻找一个小的Levenshtein distance,而不是要求完全匹配。这将有助于找到存在微小拼写差异或拼写错误的匹配。

另一种选择是在比较字符串之前对其进行标准化。有意义的标准化技术取决于您的特定应用程序,但例如,它可能涉及:

将所有的punctuation.

  • Converting UK拼写改为US spellings.

  • Using物质的科学名称而不是其常见的names.

  • etc.

  • 将其删除

然后,您可以比较每个列表成员的规范化形式,而不是原始形式。您可能还希望考虑使用不区分大小写的比较,而不是区分大小写的比较。

票数 3
EN

Stack Overflow用户

发布于 2010-12-25 07:09:09

您是否考虑过使用(...or several)下拉列表来强制执行正确的输入?在我看来,在大多数情况下,当考虑可用性和用户友好性时,这将是一个更好的方法。这也将使这种输入的处理变得容易得多。当仅仅使用自由文本输入时,你可能会有很多不同的方法来写一件事情,而且你“永远”无法弄清楚写任何复杂东西的每一种方法。

示例:如您所写:"carbon- 12“,"Carbon - 12","Carbon ( 12 )","Carbon (12 )","Carbon -12”等。就为了这个,可能性几乎是无穷无尽的。当你也考虑“韩国”和“韩国”这样的事情时,映射不是"1:1“(朝鲜呢?或者仅仅是“韩国”?),这变得更加困难。

当然,我对您的应用程序一无所知,而且可能是完全错误的。但通常情况下,当您期望某个格式的复杂值时,在许多情况下,下拉列表将使您作为开发人员的工作变得更容易,并为最终用户提供更好的体验。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4528622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档