OpenNLP - 标记字符串数组
OpenNLP - Tokenize an Array of Strings
我正在尝试使用 OpenNLP 分词器对文本文件进行分词。
我所做的是,我读取了一个 .txt 文件并将其存储在一个列表中,想要遍历每一行,标记该行并将标记化的行写入一个新文件。
行中:
tokens[i] = tokenizer.tokenize(output[i]);
我得到:
Type mismatch: cannot convert from String[] to String
这是我的代码:
public class Tokenizer {
public static void main(String[] args) throws Exception {
InputStream modelIn = new FileInputStream("en-token-max.bin");
try {
TokenizerModel model = new TokenizerModel(modelIn);
Tokenizer tokenizer = new TokenizerME(model);
CSVReader reader = new CSVReader(new FileReader("ParsedRawText1.txt"),',', '"', 1);
String csv = "ParsedRawText2.txt";
CSVWriter writer = new CSVWriter(new FileWriter(csv),CSVWriter.NO_ESCAPE_CHARACTER,CSVWriter.NO_QUOTE_CHARACTER);
//Read all rows at once
List<String[]> allRows = reader.readAll();
for(String[] output : allRows) {
//get current row
String[] tokens=new String[output.length];
for(int i=0;i<output.length;i++){
tokens[i] = tokenizer.tokenize(output[i]);
System.out.println(tokens[i]);
}
//write line
writer.writeNext(tokens);
}
writer.close();
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
}
}
有人知道如何完成这个任务吗?
正如编译器所说,您尝试将字符串数组(tokenize()
的结果)分配给字符串(tokens[i]
是一个字符串)。所以你应该在内循环中声明和使用 tokens
并在那里写 tokens[] :
for (String[] output : allRows) {
// get current row
for (int i = 0; i < output.length; i++) {
String[] tokens = tokenizer.tokenize(output[i]);
System.out.println(tokens);
// write line
writer.writeNext(tokens);
}
}
writer.close();
顺便说一句,您确定您的源文件是 csv 文件吗?如果它实际上是一个纯文本文件,那么你用逗号分割文本并将这些块交给 Opennlp,它的性能可能会更差,因为它的模型是在普通句子上训练的,而不是像你的那样分割。
我正在尝试使用 OpenNLP 分词器对文本文件进行分词。 我所做的是,我读取了一个 .txt 文件并将其存储在一个列表中,想要遍历每一行,标记该行并将标记化的行写入一个新文件。
行中:
tokens[i] = tokenizer.tokenize(output[i]);
我得到:
Type mismatch: cannot convert from String[] to String
这是我的代码:
public class Tokenizer {
public static void main(String[] args) throws Exception {
InputStream modelIn = new FileInputStream("en-token-max.bin");
try {
TokenizerModel model = new TokenizerModel(modelIn);
Tokenizer tokenizer = new TokenizerME(model);
CSVReader reader = new CSVReader(new FileReader("ParsedRawText1.txt"),',', '"', 1);
String csv = "ParsedRawText2.txt";
CSVWriter writer = new CSVWriter(new FileWriter(csv),CSVWriter.NO_ESCAPE_CHARACTER,CSVWriter.NO_QUOTE_CHARACTER);
//Read all rows at once
List<String[]> allRows = reader.readAll();
for(String[] output : allRows) {
//get current row
String[] tokens=new String[output.length];
for(int i=0;i<output.length;i++){
tokens[i] = tokenizer.tokenize(output[i]);
System.out.println(tokens[i]);
}
//write line
writer.writeNext(tokens);
}
writer.close();
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
}
}
有人知道如何完成这个任务吗?
正如编译器所说,您尝试将字符串数组(tokenize()
的结果)分配给字符串(tokens[i]
是一个字符串)。所以你应该在内循环中声明和使用 tokens
并在那里写 tokens[] :
for (String[] output : allRows) {
// get current row
for (int i = 0; i < output.length; i++) {
String[] tokens = tokenizer.tokenize(output[i]);
System.out.println(tokens);
// write line
writer.writeNext(tokens);
}
}
writer.close();
顺便说一句,您确定您的源文件是 csv 文件吗?如果它实际上是一个纯文本文件,那么你用逗号分割文本并将这些块交给 Opennlp,它的性能可能会更差,因为它的模型是在普通句子上训练的,而不是像你的那样分割。