如何识别一个句子的末尾(how to identify a end of a sentence)

2019-10-21 05:26发布

String x=" i am going to the party at 6.00 in the evening. are you coming with me?";

如果我有上面的字符串,我需要的是通过使用句子boundry标点符号被打破的句子(如,和?)

但它不应该在6拆分因为有有一个指针的句子。 有没有办法找出什么是Java中正确的句子boundry的地方吗? 我已经在java.util中使用PAKAGE StringTokenizer的尝试,但它总是打破句子只要找到一个指针。 有人建议我这样做正确的方法?

这是我在令牌化文本成句子都试过的方法。

public static ArrayList<String> sentence_segmenter(String text) {
    ArrayList<String> Sentences = new ArrayList<String>();

    StringTokenizer st = new StringTokenizer(text, ".?!");
    while (st.hasMoreTokens()) {

        Sentences.add(st.nextToken());
    }
    return Sentences;
}

我也有segement句子翻译成短语的方法,但这里也当程序发现的逗号(,)它将该文本。 但我不需要的时候有一个数字,如60000,在中间的逗号分割的。 下面是我使用的部分短语的方法。

   public static ArrayList<String> phrasesSegmenter(String text) {
    ArrayList<String> phrases = new ArrayList<String>();
    StringTokenizer st = new StringTokenizer(text, ",");
    while (st.hasMoreTokens()) {
        phrases.add(st.nextToken());
    }
    return phrases;
}

Answer 1:

从的文档StringTokenizer

StringTokenizer的是保持兼容性的原因,虽然它的使用是在新代码气馁的遗留类。 建议任何寻求此功能使用字符串的split方法或java.util.regex包来代替。

如果你使用的拆分,可以使用任何正则表达式将文本分割成句子。 你可能想要的东西就像任何的?!. 和空格或文本的结束:

text.split("[?!.]($|\\s)")


Answer 2:

下面是我解决这个问题。

/** tries to decide if a there's a sentence-end in index i of a given text

 * @param text
 * @param i
 * @return
 */
public static boolean isSentenceEnd(String text, int i) {
    char c = text.charAt(i);
    return isSentenceEndChar(c) && !isPeriodWord(text, i);
} 
/**
 * PeriodWords are words such as 'Dr.' or 'Mr.'
 *
 * @param text - the text to examoine.
 * @param i - index of the priod '.' character
 * @return
 */
private static String[] periodWords = { "Mr.", "Mrs.", "Ms.", "Prof.", "Dr.", "Gen.", "Rep.", "Sen.", "St.",
                "Sr.", "Jr.", "Ph.", "Ph.D.", "M.D.", "B.A.", "M.A.", "D.D.", "D.D.S.",
                "B.C.", "b.c.", "a.m.", "A.M.", "p.m.", "P.M.", "A.D.", "a.d.", "B.C.E.", "C.E.",
                "i.e.", "etc.", "e.g.", "al."};
private static boolean isPeriodWord(String text, int i) {
    if (i < 4) return true;
    if (text.charAt(i-2) == ' ') return true; // one char words are definetly priodWords
    String txt = text.substring(0, i);
    for (String pword: periodWords) {
        if (txt.endsWith(pword)) return true;
    }
    if (txt.matches("^.*\\d\\.$")) return true; // dates seperated with "." or numbers with fraction
    return false;
}

private static final char[] sentenceEndChars = {'.', '?', '−'};
private static boolean isSentenceEndChar(char c) {
    for (char sec : sentenceEndChars) {
        if (c == sec) return true;
    }
    return false;
}


文章来源: how to identify a end of a sentence