Java简单句子解析器

时间:2010-01-20 17:47:17

标签: java parsing nlp

有没有简单的方法在普通Java中创建句子解析器 没有添加任何libs和jar。

Parser不应该只关心单词之间的空白, 但要更聪明和解析:。 ! ?, 识别句子何时结束等。

解析后,只有真实的单词可以全部存储在db或文件中,而不是任何特殊的字符。

非常感谢你提前:)

5 个答案:

答案 0 :(得分:8)

您可能希望从查看BreakIterator类开始。

来自JavaDoc。

  

BreakIterator类实现   查找位置的方法   文本中的边界。实例   BreakIterator保持最新状态   位置和扫描文本返回   字符索引在哪里   边界发生。在内部,   BreakIterator使用a扫描文本   CharacterIterator,因此能够   扫描任何对象持有的文本   实施该协议。一个   StringCharacterIterator用于   scan传递给setText的String对象。

     

您使用提供的工厂方法   通过这个类来创建实例   各种类型的break迭代器。在   特别是,使用getWordIterator,   getLineIterator,getSentenceIterator,   和getCharacterIterator来创建   执行单词的BreakIterators,   线,句子和字符边界   分析。单身   BreakIterator只能在一个上工作   单位(单词,行,句子等)   上)。您必须使用不同的迭代器   对于每个单位边界分析你   希望表演。

     

线边界分析确定   在哪里可以破坏文本字符串   换行。机制正确   处理标点符号和连字符   词语的

     

句子边界分析允许   选择正确的解释   数字和数字的句号   缩写和尾随   引号等标点符号   标记和括号。

     

使用词边界分析   搜索和替换功能   在文本编辑应用程序中   允许用户选择单词   双击。单词选择   提供正确的解释   内部和后面的标点符号   话。不属于的角色   一个单词,如符号或标点符号   标记,双方都有断字。

     

字符边界分析允许   用户与角色互动   他们期望,例如,什么时候   将光标移动到文本中   串。字符边界分析   提供正确的通过导航   字符串,无论如何   角色被存储。例如,   可以存储带重音的字符   作为基本角色和变音符号   标记。用户认为是什么   人物可以有所不同   语言。

     

BreakIterator适用于   仅限自然语言。不使用   这个类来标记编程   语言。

参见演示BreakIteratorDemo.java

答案 1 :(得分:4)

基于@Jarrod Roberson's answer,我创建了一个使用BreakIterator并返回句子列表的util方法。

public static List<String> tokenize(String text, String language, String country){
    List<String> sentences = new ArrayList<String>();
    Locale currentLocale = new Locale(language, country);
    BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(currentLocale);      
    sentenceIterator.setText(text);
    int boundary = sentenceIterator.first();
    int lastBoundary = 0;
    while (boundary != BreakIterator.DONE) {
        boundary = sentenceIterator.next();         
        if(boundary != BreakIterator.DONE){
            sentences.add(text.substring(lastBoundary, boundary));
        }
        lastBoundary = boundary;            
    }
    return sentences;
}

答案 2 :(得分:1)

只需使用正则表达式(\s+ - 它将应用于一个或多个空格(空格,制表符等))将String拆分为数组。

然后你可以迭代那个数组并检查单词是否以.?!String.endsWith()结尾来查找句子的结尾。

在保存任何单词之前,再次使用正则表达式删除每个非字母数字字符。

答案 3 :(得分:0)

当然,请使用StringTokenizer

import java.util.StringTokenizer;

public class Token {
    public static void main(String[] args) {

        String sentence = "Java! simple ?sentence parser.";
        String separator = "!?.";

        StringTokenizer st = new StringTokenizer( sentence, separator, true );

        while ( st.hasMoreTokens() ) {
            String token = st.nextToken();
            if ( token.length() == 1 && separator.indexOf( token.charAt( 0 ) ) >= 0 ) {
                System.out.println( "special char:" + token );
            }
            else {
                System.out.println( "word :" + token );
            }

        }
    }
}

答案 4 :(得分:-1)

String Tokenizer

Scanner

实施例

StringTokenizer tokenizer = new StringTokenizer(input, " !?.");