首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java简单句法分析器

Java简单句法分析器
EN

Stack Overflow用户
提问于 2010-01-21 01:47:17
回答 5查看 13K关注 0票数 3

有没有什么简单的方法可以在纯Java中创建句子解析器,而不需要添加任何库和jars。

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

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

首先非常感谢大家:)

EN

回答 5

Stack Overflow用户

发布于 2010-01-21 01:50:18

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

来自JavaDoc的。

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

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

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

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

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

字符边界分析允许用户像他们期望的那样与字符交互,例如,在文本字符串中移动光标时。字符边界分析提供了字符串的正确导航,而不管字符是如何存储的。例如,重音字符可能存储为基础字符和变音符号。用户认为的字符可以在不同的语言中有所不同。

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

查看演示BreakIteratorDemo.java

票数 8
EN

Stack Overflow用户

发布于 2013-08-30 01:22:29

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

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2010-01-21 01:55:41

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

然后,您可以遍历该数组,并检查单词是否以.?!结尾(使用String.endsWith()查找句子末尾。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2103598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档