1

我正在尝试用 Java 编写一个程序来标记文本文件中的句子。每个标签都有一个相关的关键字数组。当且仅当句子包含一个或多个属于标签数组的关键字时,标签才会应用于句子。

例如,我有两个标签:故障和适应。在这些标签的数组中,我有诸如 Bugs、Fail 等用于故障的词,以及波兰语、清理以适应。其中一个句子是“BUG found and fixed”,它将进入故障类别,因此它将在标题故障之后输入句子,因为它包含单词“bug”。我在网上搜索了它的方法,但似乎找不到任何东西。

这是我制作的数组列表:

String[] faults = {
            "Misspelled",
            "Error",
            "Fixed",
            "Change",};

String[] adaption = {"Fixed comments",
        "Filters", "Polish","Adjust"};

任何帮助表示赞赏。谢谢你。:)

4

4 回答 4

1

我不确定我是否正确理解了您的问题,但如果是这样,您可能想尝试使用 Hashmap。您将拥有一对,并且在特定对象上使用 .get() 方法可以检索其值。

于 2013-01-22T15:24:42.963 回答
1

您可能想查阅有关java.lang.String的文档,以了解如何查看字符串是否包含某个子字符串(或如何将其拆分为单词)……并查看java.lang.HashMap

于 2013-01-22T15:27:57.377 回答
1

我认为使用正则表达式可以做得更好。对于每个类别,定义一个正则表达式模式,然后尝试将模式与文件的每一行匹配(我假设您的短语逐行出现):

import java.util.regex.*;
// ...    

Pattern faults = Pattern.compile("Misspelled|Error|Fixed|Change");
Pattern adaption = Pattern.compile("Fixed Comments|Filters|Polish|Adjust");

// I assume I can read from BufferedReader 'in'.

for ( String line = in.readLine() ; line != null ; line = in.readLine() ) {
    if ( faults.matcher(line).find() ) {
        // Classify as fault
    }
    if ( adaption.matcher(line).find() ) {
         // Classify as adaption
    }
}

请注意,该find()方法返回truefalse取决于是否找到匹配项。我建议您查看该包的Java 文档java.util.regex和/或 Jeffrey Friedl 的书“掌握正则表达式”。也许Java Tutorial Regular Expressions Trail也会有所帮助。

于 2013-01-22T15:55:49.377 回答
1

得到你想要的东西并不容易:)但我想我明白了......

由于您的两个组,您有两个数组列表。adaption并且fault将是两组...

  1. 首先,您应该从输入中读取整个文本到字符串。
  2. 其次你应该找到String[] sentences = split()句子,你应该分成'.',',','!' 和所有句子的结束标记。您应该使用正则表达式,因为split(.|?|!|)它可以为原型做。
  3. 然后您应该将这些句子拆分为单词,您现在应该拆分--)String[] words=split(\\s+)所以查找空格\\s+代表您所有的空格(\t \r \n等等)
  4. 最后,您应该使用 for 循环遍历您的 words 数组,并找到与您的两个或多个组中的成员匹配(适应、故障)(使用 indexOf() 或 equals() 字符串方法)......显然,如果你有单词中的完全匹配,您可以使用 HashMap 并且像这样Group1.get("the word you present itareted"),这可以大大加快您的应用程序的速度;)

我也可以为您编写源代码,但我认为最好只是给您一些提示,如何做到这一点。如果需要任何帮助,请写 GL!

于 2013-01-22T15:30:53.843 回答