2014-11-02 3 views
1
String x=" i am going to the party at 6.00 in the evening. are you coming with me?"; 

, если у меня есть выше строки, мне нужно, что быть сломанным к предложениям, используя предложение boundry пунктуацию (например. И?)как определить конец предложения

, но он не должен расколоть предложение в 6 из-за наличия там указателя. есть ли способ определить, каково правильное место ограниченности предложения в java? Я попытался использовать stringTokenizer в java.util pakage, но он всегда прерывает предложение всякий раз, когда находит указатель. Может ли кто-нибудь предложить мне способ сделать это правильно?

Это метод, который я попытался использовать для обозначения текста в предложениях.

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 предложения на фразы, но и здесь, когда программа нашла запятую (,) он разбивает текст. но мне не нужно разделить его, когда есть число, например, 60 000 с запятой в середине. Ниже приведен метод, который я использую для сегментации фраз.

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; 
} 
+2

Для этого вам необходимо использовать разделители предложений. См. Соответствующий вопрос: http://stackoverflow.com/questions/9492707/how-can-i-split-a-text-into-sentences-using-the-stanford-parser –

ответ

1

Из documentation of StringTokenizer:

StringTokenizer является наследием класс, который сохраняется в целях совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы любой, кто ищет эту функциональность, использовал метод split для String или пакет java.util.regex.

Если вы используете split, вы можете использовать любое регулярное выражение для разделения текста на предложения. Вы, вероятно, хотите что-то вроде любых из ?!. и пробела или конца текста:

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

, но как определить правильное место для разделения sentect. если в середине предложения есть десятичное число. то период, который там не может быть принят, как конец предложения. Мне нужно знать, как обращаться с этими ситуациями @fejese – Chirath

+1

Вот скрипач регулярных выражений: http://regex101.com/r/vB7gU9/1 Обратите внимание, что я удалил двойное экранирование символа пробела пробела ('\ s') и добавили '. *?' в начале, чтобы сделать его более заметным, что будет возвращено в качестве первого элемента после разделения. – fejese

+0

Еще не получил ответа. @fejese ваше регулярное выражение не работает – Chirath

0

Вот мое решение этой проблемы.

/** 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; 
} 
Смежные вопросы