gpt4 book ai didi

java - 将段落拆分为带有标题和数字的句子

转载 作者:搜寻专家 更新时间:2023-11-01 02:48:16 25 4
gpt4 key购买 nike

我正在使用 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. 等词,如果这些词存在,它就会跳过那个 break 并移动到下一个 break (保持原来的开始位置)寻找 NEXT 结束(最好是不会在另一个 Dr. 或 Mr. 等之后结束)

我包括了我的完整程序,这样你就可以看到它了:

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 不会移动,它留在那里等待下一个 block 回来。在我稍微详细一点的句子中,下一段也有一个奇怪的词打乱了休息:

"Roberts and Dr."

它接受那个 block ,因为它有一个 Dr. 它继续到第三个句子 block :

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

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

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

就像我说的那样,这可能不是获得您想要的东西的迷人方式,但没有其他人自愿并且它有效耸耸肩

关于java - 将段落拆分为带有标题和数字的句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com