0

我有一个 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 句:

前言

如果一位同事对你说,今天晚上我的配偶在家里制作了不寻常的饭菜。

第 2 句:

你会加入吗?

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

前言

由于某些原因...

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

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

4

1 回答 1

1

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

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

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 类。我什至不知道这是否可能。

于 2018-01-23T09:53:31.290 回答