【问题标题】:There is a isSomething() lib for Java? [closed]Java 有一个 isSomething() 库吗? [关闭]
【发布时间】:2011-07-30 13:23:47
【问题描述】:

我想知道是否有用于 Java 的库,其实现如下:isTemperature()isPercentual()isDistanceUnit()isWeightUnit()isProperName()isDate()isYear()isPhone()isLocation(),还有什么可以定义的。

我感兴趣的不仅是单位,还有所有可能的分类类型,数字或单词。

这将用于对文本中的单词进行分类。

【问题讨论】:

  • 您能更具体地说明您想做什么吗?很模糊
  • @Nishant 我想获取文本的所有单词并将其分类到尽可能多的类别中。
  • 您期望什么输入?例如,它是否只是一个数字或一个包含单位的字符串:100"100 °C""100 °F""100 K" 之一的温度?
  • @Bruno 第二种情况,带单位的数字。输入可以是相同类型的两个或多个事物,如果不同类型的度量单位相等,则没有问题。

标签: java definition


【解决方案1】:

我不知道。但是,您仍然可以自己创建执行相同操作的方法...

isTemperature()

boolean isTemperature(String check) {
    char[] letters = check.toCharArray();
    if (check.indexOf("°").equals((letters.length - 1)) {
        return true;
    }
    return false;
}

isPercentual()

boolean isPercentual(String check) {
    try {
        double verify = Double.parseDouble(check);
    } catch (NumberFormatException e) {
        return false;
    }
    char[] numbers = check.toCharArray();
    if (check.indexOf("%").equals(numbers.length) {
        return true;
    }
    return false;
}

isDistanceUnit()

boolean isDistanceUnit(String check, boolean customary) {
    String[] customaryUnits = {"mi","yd","ft","in"};
    String[] metricUnits = {"mm","cm","dm","m","km"};
    if (customary) {
        for (int i = 0; i <= customaryUnits.length; i++) {
            if (check.toLowerCase().contains(customaryUnits[i])) {
                return true;
            }
        }
        return false;
    } else {
        for (int i = 0; i <= metricUnits.length; i++) {
            if (check.toLowerCase().contains(metricUnits[i])) {
                return true;
            }
        }
        return false;
    }
}

isWeightUnit()

boolean isWeightUnit(String check, boolean customary) {
    String[] customaryUnits = {"lb","oz","T"};
    String[] metricUnits = {"kg"}; //I'm sorry that's all I know :(
    if (customary) {
        for (int i = 0; i <= customaryUnits.length; i++) {
            if (check.toLowerCase().contains(customaryUnits[i])) {
                return true;
            }
        }
        return false;
    } else {
        for (int i = 0; i <= metricUnits.length; i++) {
            if (check.toLowerCase().contains(metricUnits[i])) {
                return true;
            }
        }
        return false;
    }
}

isProperName()

boolean isProperName(String check) {
    char[] letters = check.toCharArray();
    String[] capLetters = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    for (int i = 0; i <= capLetters.length; i++) {
        if (letters[0].equals(capLetters[i])) {
            return true;
        }
    }
    return false;
}

isDate()

更新:现在我可以给你这个。不过,在我做之前先做一个简短的说明。在代码开头添加这些行,否则此方法将不起作用。

import java.text.SimpleDateFormat;
import java.text.ParseException;
//--------------------------------------------------------------------------------
boolean isDate(String check) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    if (check.trim().length != dateFormat.toPattern().length) {
        return false;
    }
    dateFormat.setLenient(false);
    try {  
        dateFormat.parse(check.trim());
    } catch (ParseException pe) {
        return false;
    }
    return true;
}

isYear()

boolean isYear(String check) {
    try {
        int verify = Integer.parseInt(check);
    } catch (NumberFormatException e) {
        return false;
    }
    char[] verify2 = check.toCharArray();
    if ((verify2.length).equals(4)) {
        return true;
    }
    return false;
}

isPhone()

您还没有真正说明要检查哪种电话号码。我猜你想要一个这种形式的 (865-867-5309)。

boolean isPhone(String check) {
    float firstHyphen = check.indexOf("-");
    char[] numbers = check.toCharArray();
    float check2 = numbers.length / 3;
    if (firstHypen.equals(check2)) {
        return true;
    }
    return false;
}

isLocation()

抱歉,我现在不能给你这个。 :(

isEmail()

boolean isEmail(String check) {
    String[] emailDomains = {".com",".net",".org"};
    String[] emailProviders = {"gmail","yahoo","hotmail","aol","tds","comcast","charter","peoplepc"}; //add more if you want
    char[] check2 = check.toCharArray();
    for (int i = 0; i <= emailProviders.length; i++) {
        for (int x = 0; x <= emailDomains.length; x++) {
            if ((check.indexOf(emailDomains[x]).equals(check2.length)) && (check.indexOf(emailProviders[i]).equals(check2.length - emailDomains[x].toCharArray().length)) {
            return true;
            }
        }
    }
    return false;
}

如果您愿意,可以为 isDistanceUnit()isWeightUnit() 方法添加更多单位。如果您需要更多方法或有任何疑问,请提出。 :)

【讨论】:

  • 那里……即使没有这样的图书馆,现在也有了。 :)
  • 是的,这是我打算做的。非常令人印象深刻。
  • @fireshadow52 Chris answer 向我展示了我可能会在我的软件中使用的东西,所以它给我的答案对我的项目很有用。你的回答是我问的一个例子(我问的可能不是正确的选择),对大多数需要使用它的人来说很有价值,所以是的,我会接受你的回答。
  • @fireshadow52 如果您有兴趣做更多这项工作,请执行 isIniatilism/Acronym()、isEmail()、isWebProtocol() 以及您猜想您想做的更多事情。
  • 很公平。还可以查看 Apple 的 LSI 分类代码,这是 iPhone 和 OS X 上的邮件应用程序挑选地址、电话号码等的方式。
【解决方案2】:

是否有您已经使用过的语言的等效库?

我想不出有多少应用程序需要检查单个数据源中是否存在所有这些格式,但我会使用正则表达式来完成这项工作。

编辑:

如果您的数据是异构的,并且您只想弄清楚它是什么,您可能需要某种分类器。试试jBNCclassifier4j

【讨论】:

  • 我用 Java 开发。我对 RegEx 进行了测试,但会进行大量验证,所以在编写我的 regex 之前,最好先尝试找到已完成的工作。
  • 其中一些方法非常特定于位置。例如,您想知道来自英国或美国的电话号码是否有效?
  • 是的,有些是非常具体的,所以只能验证一些,而不是世界上所有的。其他物品也是如此。例如,温度,只有最常见的(摄氏度、华氏度、开尔文)
  • 我将在这些贝叶斯分类器上大显身手。也许他们可以解决我的问题,但这两个例子很久没有更新了(2004 年和 2005 年)。他们很好?有更新的吗?
  • 有很多分类器库可供选择,很多是跨平台的。尝试谷歌搜索更多。如果不查看原始数据,我猜想某种朴素贝叶斯或 LSI 分类器会满足您的要求,前提是您有足够的示例数据来训练它。无论您决定使用哪一种,都由您自己决定,而且它可能是您认为最容易使用的一种。
【解决方案3】:

试试上面显示的前两个链接之一:

http://www.google.com/search?q=java+units+library&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

您真正需要的是一些本体来添加大量上下文。查看ProtegeCyc。您所要求的远远超出了验证和正则表达式。重新阅读您的问题后,听起来您想阅读文档并以某种方式让您的解析器挑选出与这些单位匹配的标记并从上下文中辨别它们是什么。如果这达到了目标,那么你手上就有一个非常困难的问题。它更接近自然语言处理。

【讨论】:

  • 在我之上?我没有看到这些链接,但谢谢,我会看看。但重要的不仅仅是我感兴趣的单位,尽管单词比数字更难分类。
  • 是的,您的链接是 Google 返回的第三个链接。引文涉及单位;你可能需要别的东西来补充。我的观点是,一个简单的谷歌搜索会让你有一些事情继续下去,而且比在这里阅读和否决回复更快。
  • 几乎不值得花时间去看。我不担心投反对票。
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2017-04-08
相关资源
最近更新 更多