有没有什么简单的方法可以在纯Java中创建句子解析器,而不需要添加任何库和jars。
解析器不应该只关心单词之间的空格,而应该更加智能和解析:。!?,识别句子何时结束等。
解析后,只有真正的单词可以全部存储在数据库或文件中,而不是任何特殊字符。
首先非常感谢大家:)
发布于 2010-01-21 01:50:18
您可能希望从查看BreakIterator类开始。
来自JavaDoc的。
BreakIterator类实现用于查找文本中边界位置的方法。BreakIterator的实例维护当前位置并扫描文本,返回出现边界的字符索引。在内部,BreakIterator使用CharacterIterator扫描文本,因此能够扫描由实现该协议的任何对象持有的文本。StringCharacterIterator用于扫描传递给setText的字符串对象。
您可以使用此类提供的工厂方法创建各种类型的break迭代器的实例。特别地,使用getWordIterator、getLineIterator、getSentenceIterator和getCharacterIterator来创建分别执行词、行、句子和字符边界分析BreakIterators。单个BreakIterator只能处理一个单元(单词、行、句子等)。您必须为您希望执行的每个单元边界分析使用不同的迭代器。
行边界分析确定换行时文本字符串的换行位置。该机制可以正确处理标点符号和连字符的单词。
句子边界分析允许正确解释数字和缩写中的句号,以及引号和括号等尾随标点符号的选择。
词边界分析由搜索和替换功能使用,以及在允许用户通过双击选择词的文本编辑应用程序中使用。单词选择可以正确解释单词内和单词后面的标点符号。不是单词一部分的字符(如符号或标点符号)在两侧都有分词符。
字符边界分析允许用户像他们期望的那样与字符交互,例如,在文本字符串中移动光标时。字符边界分析提供了字符串的正确导航,而不管字符是如何存储的。例如,重音字符可能存储为基础字符和变音符号。用户认为的字符可以在不同的语言中有所不同。
BreakIterator仅用于自然语言。不要使用这个类来标记化编程语言。
查看演示:BreakIteratorDemo.java
发布于 2013-08-30 01:22:29
基于@Jarrod Roberson's answer,我创建了一个util方法,它使用BreakIterator并返回句子列表。
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;
}发布于 2010-01-21 01:55:41
只需使用正则表达式(\s+ -它将应用于一个或多个空格(空格、制表符等))将字符串拆分为数组。
然后,您可以遍历该数组,并检查单词是否以.?!结尾(使用String.endsWith()查找句子末尾。
在保存任何单词之前,再次使用正则表达式删除每个非字母数字字符。
https://stackoverflow.com/questions/2103598
复制相似问题