gpt4 book ai didi

java - Android 的 BreakIterator 将换行符视为句子分隔符

转载 作者:行者123 更新时间:2023-11-30 00:09:27 28 4
gpt4 key购买 nike

我有一个 unix 文本文件,我想在我的 Android 应用程序中阅读并将其拆分成句子。但是我注意到 BreakIterator 将一些换行符视为句子分隔符。我使用以下代码读取文件并将其拆分为句子(仅输出第一句用于演示目的):

        File file = new File...
String text = "";
BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(Locale.US);

try {
FileInputStream inputStream = new FileInputStream(file);

InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
StringBuilder stringBuilder = new StringBuilder();

while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append('\n');
}

inputStream.close();
text = stringBuilder.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

sentenceIterator.setText(text);
int end = sentenceIterator.next();
System.out.println(end);
System.out.println(text.substring(0, end));

但如果我从 Eclipse 编译代码并将其作为桌面应用程序运行,文本将被正确拆分。我不明白为什么它不能在 Android 应用程序上执行相同的操作。

我尝试将文本文件转换为dos格式,我什至尝试读取文件并保留原始换行符:

    Pattern pat = Pattern.compile(".*\\R|.+\\z");
StringBuilder stringBuilder = new StringBuilder();
try (Scanner in = new Scanner(file, "UTF-8")) {
String line;
while ((line = in.findWithinHorizon(pat, 0)) != null) {
stringBuilder.append(line);
}
text = stringBuilder.toString();
sentenceIterator.setText(text);
int end = sentenceIterator.next();
System.out.println(end);
System.out.println(text.substring(0, end));
}

但没有成功。有任何想法吗?您可以在此处下载文件(unix 格式)的摘录:http://dropmefiles.com/TZgBp

我刚刚注意到无需下载此文件即可复制它。只需创建一个在句子中有换行符的字符串(例如 "Hello,\nworld!")并运行仪器测试。如果在常规测试中使用了 BreakIterator,那么它会正确拆分。

我希望有 2 个句子:

句子 1:

Foreword

IF a colleague were to say to you, Spouse of me this night today manufactures the unusual meal in a home.

句子 2:

You will join?

是的,它们看起来不太好,但至少您知道为什么会这样(句子分隔符是 ?. 等)。但是,如果代码在 Android 上运行,它甚至会从

创建一个句子

Foreword

出于某种原因...

我不确定这是否是错误,或者是否有解决方法。但在我看来,这使得 Android 版本的 BreakIterator 作为分句器毫无用处,因为书中的句子分布在多行中是正常的。

在所有实验中,我都使用相同的 import java.text.BreakIterator;

最佳答案

这不是真正的答案,但它可能会给您一些见解。

这不是文件编码问题,我按照他的方式尝试过,但有同样的错误行为。

BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(Locale.US);
String text = "Foreword\nIf a colleague were to say to you, Spouse of me this night today manufactures the unusual meal in a home. You will join?";
sentenceIterator.setText(text);

Android 与您的计算机使用的 Java 版本不同

我注意到当我打印出 sentenceIterator 对象的类时

sentenceIterator.getClass()

我在使用 IntelliJ 和在 Android 上运行时有不同的类:

使用 IntelliJ 运行:

sun.util.locale.provider.RuleBasedBreakIterator

在安卓上运行:

java.text.RuleBasedBreakIterator 

sun.util.locale.provider.RuleBasedBreakIterator 具有您想要的行为。

我不知道如何让 Android 使用好的 RuleBasedBreakIterator 类。我什至不知道这是否可能。

关于java - Android 的 BreakIterator 将换行符视为句子分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48383331/

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