Java简单句子解析器

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

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

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

非常感谢你提前:)

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

来自JavaDoc。

BreakIterator类实现了在文本中查找边界位置的方法。 BreakIterator的实例维护当前位置并扫描文本,返回出现边界的字符索引。 在内部,BreakIterator使用CharacterIterator扫描文本,因此能够扫描实现该协议的任何对象所持有的文本。 StringCharacterIterator用于扫描传递给setText的String对象。

您可以使用此类提供的工厂方法来创建各种类型的break迭代器的实例。 特别是,使用getWordIterator,getLineIterator,getSentenceIterator和getCharacterIterator来创建分别执行单词,行,句子和字符边界分析的BreakIterator。 单个BreakIterator只能在一个单元(单词,行,句子等)上工作。 必须为要执行的每个单元边界分析使用不同的迭代器。

行边界分析确定换行时文本字符串可以断开的位置。 该机制正确处理标点符号和带连字符的单词。

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

字边界分析由搜索和替换function以及文本编辑应用程序使用,允许用户通过双击选择单词。 单词选择可以正确解释单词内和单词后面的标点符号。 不属于单词的字符(如符号或标点符号)在两侧都有单词分隔符。

字符边界分析允许用户按照他们期望的方式与字符交互,例如,当通过文本字符串移动光标时。 无论字符的存储方式如何,字符边界分析都能提供正确的字符串导航。 例如,重音字符可以存储为基本字符和变音符号。 用户认为角色的用语可能因语言而异。

BreakIterator仅适用于自然语言。 不要使用此类来标记编程语言。

请参阅演示 : BreakIteratorDemo.java

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

 public static List tokenize(String text, String language, String country){ List sentences = new ArrayList(); 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; } 

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

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

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

当然,使用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 ); } } } } 

字符串标记符

扫描器

防爆。

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