将段落拆分为带有标题和编号的句子

2024-03-29

我正在使用 Java 中的 BreakIterator 类将段落分成句子。这是我的代码:

public Map<String, Double> breakSentence(String document) {
    sentences = new HashMap<String, Double>();
    BreakIterator bi = BreakIterator.getSentenceInstance(Locale.US);
    bi.setText(document);

    Double tfIdf = 0.0;
    int start = bi.first();
    for(int end = bi.next(); end != BreakIterator.DONE; start = end, end = bi.next()) {
        String sentence = document.substring(start, end);

        sentences.put(sentence, tfIdf);
    }

    return sentences;
}

问题是当段落包含标题或数字时,例如:

“罗伯茨教授试图通过编写 1.200 行代码来解决问题。”

我的代码将产生的是:

sentences :
Prof
Roberts trying to solve a problem by writing a 1
200 lines of code

由于标题和数字中的句点,而不是 1 个句子。

有没有办法解决这个问题,用 Java 处理标题和数字?


嗯,这是一个有点棘手的情况,我想出了一个棘手的解决方案,但它仍然有效。我自己对 Java 很陌生,所以如果经验丰富的老手想要编辑这篇文章或对其发表评论并通过各种方式使其更加专业,请让我看起来更好。

我基本上在你已经必须检查的内容上添加了一些控制措施,看看是否存在像 Dr. Prof. Mr. Mrs. 等这样的词,如果这些词存在,它只会跳过该中断并移动到下一个中​​断(保持原始开始位置)寻找下一个结束(最好是不在另一位博士或先生等之后结束)

我提供了完整的程序,以便您可以看到全部内容:

import java.text.BreakIterator;
import java.util.*;

public class TestCode {

    private static final String[] ABBREVIATIONS = {
        "Dr." , "Prof." , "Mr." , "Mrs." , "Ms." , "Jr." , "Ph.D."
    };

    public static void main(String[] args) throws Exception {

        String text = "Prof. Roberts and Dr. Andrews trying to solve a " +
                      "problem by writing a 1.200 lines of code. This will " +
                      "work if Mr. Java writes solid code.";

        for (String s : breakSentence(text)) {
              System.out.println(s);
        }
    }

    public static List<String> breakSentence(String document) {

        List<String> sentenceList = new ArrayList<String>();
        BreakIterator bi = BreakIterator.getSentenceInstance(Locale.US);
        bi.setText(document);
        int start = bi.first();
        int end = bi.next();
        int tempStart = start;
        while (end != BreakIterator.DONE) {
            String sentence = document.substring(start, end);
            if (! hasAbbreviation(sentence)) {
                sentence = document.substring(tempStart, end);
                tempStart = end;
                sentenceList.add(sentence);
            }
            start = end; 
            end = bi.next();
        }
        return sentenceList;
    }

    private static boolean hasAbbreviation(String sentence) {
        if (sentence == null || sentence.isEmpty()) {
            return false;
        }
        for (String w : ABBREVIATIONS) {
            if (sentence.contains(w)) {
                return true;
            }
        }
        return false;
    }
}

这样做的目的,基本上是建立两个起点。原始起点(您使用的起点)仍然在做同样的事情,但是临时开始不会移动,除非字符串看起来准备好制成句子。就拿第一句话来说吧:

"Prof."

并检查是否由于一个奇怪的单词而中断(即,句子中是否有 Prof. Dr. 或 w/e 可能导致该中断),如果是,则 tempStart 不会移动,它会停留在那里,等待下一个块返回。在我稍微复杂一点的句子中,下一个块也有一个奇怪的单词搞乱了中断:

"Roberts and Dr."

它采用该块,因为里面有一个博士,所以它继续到第三个句子块:

"Andrews trying to solve a problem by writing a 1.200 lines of code."

一旦它到达被破坏的第三个块并且没有任何可能导致错误中断的奇怪标题,它就会从临时开始(仍在开始处)开始到当前结束,基本上将所有三个部分连接在一起。

现在它将临时开始设置为当前的“结束”并继续。

就像我说的,这可能不是一个获得你想要的东西的迷人方式,但没有其他人自愿,而且它有效shrug

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将段落拆分为带有标题和编号的句子 的相关文章

  • Spring Boot 自动将 JSON 转换为控制器中的对象

    我有具有该依赖项的 Spring Boot 应用程序
  • 从字符串编译Java源代码? [复制]

    这个问题在这里已经有答案了 有没有办法让正在运行的Java程序编译Java源代码 作为字符串传递 Class newClass Compiler compile class ABC void xyz etc etc 理想情况下 传入源代码引
  • 具有替代方案的重载方法值表

    我有编译器抱怨的以下代码 val state KTable String String builder table BARY PATH Materialized as PATH STORE 错误信息 error home developer
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • 改变 H2 中的序列

    我在生产中使用 Postgres 数据库 在测试中使用 H2 我想为现有表创建一个新序列 所以在 Liquibase 中我写了这个
  • Android 支持 v4 22.2.0 的 Proguard 配置

    更新 Gradle Android 构建的依赖关系后使用com android support support v4 22 2 0从本地 Maven extras 存储库 在 SDK 内 Proguard 开始抛出这些问题 Warning
  • 如何在 spring 中将模型作为重定向属性传递

    redirectModel addAttribute Model model return REDIRECT PREFIX my company organization management manage users 当我通过这个时 我得
  • Jackson @JsonRawValue 获取地图的值

    我有以下 Java bean 类 使用 Jackson 将其转换为 JSON public class Thing public String name JsonRawValue public Map content new HashMap
  • 将密钥添加到选定的密钥集中

    我正在编写一个 NIO 服务器 并希望响应用户请求 即将一些数据写入通道 Selector selector if selector selectNow 0 if key isReadable SocketChannel channel k
  • Java 方法存根

    这就是我必须做的 为下面的 main 调用的方法定义存根 每个存根应打印 FIXME Finish methodName 后跟换行符 并应返回 1 输出示例 FIXME Finish getUserNum FIXME Finish getU
  • 根据使用频率随机生成字母?

    如何根据常用语音中的使用频率随机生成字母 任何伪代码都值得赞赏 但如果用 Java 实现就更棒了 否则 只需朝正确的方向戳一下就会有所帮助 注意 我不需要生成使用频率 我确信我可以很容易地查找到它 我假设您将频率存储为 0 到 1 之间的浮
  • 使用 google app-engine 跨浏览器/服务器重新启动会话持久性

    如何使会话在浏览器 服务器重新启动后持续存在 我正在使用谷歌应用程序引擎 每次重新启动浏览器和 或服务器时 我都会得到一个新的会话 ID String jSessionId this getThreadLocalRequest getSes
  • 如何使用 poi 获取 java 中单元格的数据验证源?

    I have defined a list of valuses my list in one excel sheet as follow 在另一个 Excel 工作表中 我将某些单元格引用到该列表 以便该列表在单元格中显示为下拉列表 如下
  • Java中使用流的byte[]到byte[]的ArrayList

    我有一个 byte 的 ArrayList 我想知道是否可以使用 Java 8 中的流将其转换为 byte ArrayList 内的所有数组都具有相同的大小 ArrayList
  • 在Java程序中打开Windows虚拟键盘

    我想在按钮中创建一个事件 当我单击按钮时 我想打开 Windows 虚拟键盘 你能帮我看一下代码吗 谢谢您的合作 此致 您可以使用 getRuntime 来执行它 import java io IOException public clas
  • 面向 Clojure 用户的 Java

    我一直在断断续续地使用 Lisp 并且正在赶上 clojure clojure的好处是我可以自然地使用所有的java函数 而clojure的坏处也是我必须自然地了解java函数 例如 我不得不花一些时间 谷歌搜索 来查找 Java 中的平方
  • ZipInputStream.getNextEntry() 如何工作?

    假设我们有这样的代码 File file new File zip1 zip ZipInputStream zis new ZipInputStream new FileInputStream file 假设您有一个包含以下内容的 zip
  • 如何停止在控制台上打印异常堆栈跟踪?

    我编写了一个 Servlet 来处理 Web 应用程序中发生的异常 并将它们映射到 web xml 中
  • 在日志中显示 Spring 事务

    我为 spring 配置了事务支持 有什么方法可以记录事务以确保我正确设置所有内容 在日志中显示是查看正在发生的情况的好方法 in your log4j properties 对于替代记录器或 log4j 的 xml 格式 请查看文档 根据
  • 在自定义 BaseAdapter 子类中使用 Butter Knife 会导致“无法注入视图”错误

    我正在尝试使用 Butter Knife 来简化自定义 BaseAdapter 类的创建 我正在遵循这里的示例 http jakewharton github io butterknife http jakewharton github i

随机推荐

  • 二维网格中的不同随机点

    我有一个大的二维网格 比如说 10000 X 10000 我需要从这些网格中选择 1000 个随机点 但我还需要注意这两个点都不相同 我想到的标准方法是在选择每个点之后 我应该检查所有先前的条目以查看该点是否已被选择 但对于大网格和大量点来
  • 连接到 EC2 Django 开发服务器

    我是 EC2 和 Web 开发的新手 目前我有一个正在运行的 Linux EC2 实例 并且已经安装了 Django 在开始我的实际项目并尝试运行 Django 测试服务器之前 我正在创建一个测试项目 这是我在 shell 中的输出 pyt
  • matplotlib:半球/楔形的自定义投影

    我正在看定制投影 http matplotlib sourceforge net examples api custom projection example htmlmatplotlib 库中的示例 我正在尝试修改它以仅绘制南半球 我已将
  • 快速处理大量 CSV 数据的最佳方法

    我有大量 CSV 数据集 10M 行 需要处理 我还有另外两个文件需要在输出时引用 它们包含的数据放大了我们对 CSV 文件中数百万行的了解 目标是输出一个新的 CSV 文件 其中每条记录都与其他文件中的附加信息合并 想象一下 大型 CSV
  • 如何使我的 Flask wtforms SelectField 看起来像下拉菜单?

    我创建了一个 SelectField 如下所示 class Inputs Form myChoices number of choices myField SelectField u Field name choices myChoices
  • 使用 sfFilter 用 Doctrine 更新数据库

    我创建了一个 sfFilter 来更新用户所在的当前模块 class SessionFilter extends sfFilter public function execute filterChain if this gt isFirst
  • Rails - grouped_options_for_select

    我在使用选项组填充 Rails 中的选择框时遇到一些困难grouped options for select 我目前有 3 个实例变量 我想将它们添加到分组选择框的整个分组数组中 例如 我有 fruits which contains th
  • cmake v3.15.3 找不到 boost v1.71.0

    我正在尝试在 Windows 10 中从源代码构建以下软件 https github com FreeOpcUa freeopcua https github com FreeOpcUa freeopcua 我还安装了最新版本的 boost
  • 使用 decltype 作为成员函数返回类型时,声明顺序很重要

    为什么这有效 template
  • 从mysql输入的html中搜索数据

    我想从我的数据库 mysql 获取数据并将其显示在网站上 应该保存脚本 这是我已经拥有的文件的结构 includes db connect php functions php getdata php logout php process l
  • Tableview 滚动反弹并隐藏底部单元格

    我有一个显示在导航控制器下的视图 该视图在顶部包含一个子视图 在底部包含一个表视图 根据数据 表中的行可能超出可见高度 当我的行位于最后一个可见行下方时 如果我向上滚动视图 它会弹回来 不会停留在那里 有办法让它留下来吗 我尝试将父视图设为
  • 非常奇怪的 Drupal 7 404 行为

    我在 D7 中遇到了一些我以前从未见过的非常奇怪的行为 我已将一个新站点从我的开发机器迁移到测试机器 因此代码和数据库是相同的 在开发机器 Ubuntu 13 04 Apache PHP 5 5 3 上 一切正常 但在 Raspbian 上
  • Python:lxml.etree.tostring(with_comments=False)

    我调用以下命令并收到以下错误 gt gt gt lxml etree tostring tree getroot with comments False ValueError Can only discard comments in C14
  • solr 模式中的日期时间字段

    我正在使用 Solr 在我的数据库上进行搜索 并且我需要从 mysql 数据库获取一个具有 日期时间 数据类型的字段 因此我设置了选择查询以在 dataconfig xml 中获取此字段 并为此添加了字段名称schema xml 中的字段如
  • 将整个范围乘以值?

    因此 我能想到的在大范围 大约 450k 行 上完成此操作的最佳方法是使用以下 Sue do 代码 Range A1 Copy A1 Contains Value I want to multiply column by Range MyT
  • 阅读复杂的 const 声明的简单规则?

    为了读取复杂的指针声明 有左右规则 https web archive org web 20110818081319 http ieng9 ucsd edu cs30x rt lt rule html 但这条规则没有提到如何阅读const修
  • pip 安装和自定义索引 url

    我在尝试使用安装时遇到以下异常pip Retrying Retry total 4 connect None read None redirect None after connection broken by ProtocolError
  • Android YouTubePlayer 在播放器顶部带有未经授权的覆盖层

    我在片段中使用 YouTubePlayer 适用于 Android 的 YouTube api 我用 YouTube 播放器膨胀 LinearLayout 如下所示 fragmentManager getActivity getSuppor
  • 适用于 iPhone 的 OCMock(iOS4、XCode 3.2.3)

    我有最后一个版本OCMock http www mulle kybernetik com software OCMock 1 55 和 XCode 3 2 3 我在我的项目中创建了一个测试包目标 在我的测试中使用 OCMock 的最佳方法是
  • 将段落拆分为带有标题和编号的句子

    我正在使用 Java 中的 BreakIterator 类将段落分成句子 这是我的代码 public Map