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