当前位置:   article > 正文

文本检索系统-2B:文本处理器

文本处理器是什么

问候,

介绍

欢迎回来。 是时候进行一些实际的设计了:我希望两个具有两个“事物”:

1)一个“ LibraryBuilder”,它逐渐构建处理后的文本,最后

自行构建“图书馆”。

2)一个“处理器”,用于处理输入文本并将其用勺子输入到第一个

宾语。

处理器

我希望这两个实体尽可能通用。 首先,我设计

所需的接口。 这是处理器接口:

  1. public interface Processor { 
  2.     public void process(String prefix) throws IOException
  3.     public Library getLibrary();
前缀字符串可以是任何字符串。 处理器知道如何处理。

前缀可以是uri或目录,也可以是到达目录所需的任何文件

原始文本。

process()方法完成所有处理; 而且因为事情可能出错

在处理过程中,允许抛出一个IOException

可能引发的异常。 我会在何时设计其子类

需要。

第二种方法给我最终结果:库。 图书馆是普通的

可以为我检索文本的类。

我希望处理器实现尽可能通用,即我不

希望将任何特定的詹姆士国王圣经知识粘贴到我的处理器中。

Processor实现将是一个抽象类,可以完成所有

组织或“进行”的工作,并留下特定的国王詹姆斯圣经

知识到子类。 为此,它实现了抽象方法。

图书馆建设者

我对LibraryBuilder使用相同的方案:

  1. public interface LibraryBuilder { 
  2.     public void preProcess();
  3.     public void postProcess()
  4.     public void setTitle(String title)
  5.     public void buildGroup(String group);
  6.     public void buildParagraph(String book, String chapter, 
  7.                    int para, String text) throws IOException; 
  8.     public Library build();
接口无法强制执行,但目的是调用preProcess()

方法,然后再进行其他操作。 所有处理结束并完成后

使用,应该调用postProcess()方法。

最后,LibraryBuilder应该给我一个Library对象

当其build()方法被调用时。

Library类本身不知道它处理哪个文本,即知道

没有关于詹姆士国王圣经的文字,也没有关于CD收藏品或其他任何东西的。

剩下的两个方法实现了文本“ spoonfeeding”:

1)buildGroup()为调用者建立一个新的组。

2)buildParagraph()在给定书,章,段落的情况下构建新段落

和原始段落文本。 如果需要,它可能会引发IOException。

如已经看到的,当调用Processor.getLibrary()方法时,它

将作业委托给LibraryBuilder.build()方法。

在这里,我也希望LibraryBuilder尽可能通用,所以我实现了

实现LibraryBuilder接口的抽象类。 这堂课

所有不需要任何有关King James知识的工作

圣经文字。

一个特殊的子类应实现抽象中定义的抽象方法

它可以粘贴其特定的詹姆士国王圣经文字的超级类。

类结构

这是顶层的类结构:

  1. // interfaces:
  2. interface Processor { ... }
  3. interface LibraryBuilder { ... }
  4. // implementing classes:
  5. abstract class AbstractProcessor() implements Processor { ... }
  6. abstract class AbstractBuilder() implements LibraryBuilder { ... } 
对于这个特定的示例项目,我必须实现两个特定的类:
  1. class KJProcessor extends AbstractProcessor { ... }
  2. class KJBuilder extends AbstractBuillder { ... } 
这两节课包含有关圣经的特定国王詹姆斯圣经知识

正在被处理,并且构建器从中构造了一个库。

抽象处理器

AbstractProcessor完成原始文本处理的所有“执行”工作

工作。 需要为实际工作将其分类。 这是其第一部分:

  1. public abstract class AbstractProcessor implements Processor { 
  2.     protected LibraryBuilder builder;
  3.     protected String title; 
  4.     public AbstractProcessor(String title, LibraryBuilder builder) { 
  5.         this.builder= builder;
  6.         this.title= title;
  7.     }
  8.     ... 
给定库的名称,可以构造一个AbstractProcessor,并且

LibraryBuilder。 KJProcessor为它的超类提供KBBuilder

以及标题字符串

此类中定义的抽象方法是:

  1.     ...
  2.     protected abstract void preProcess();
  3.     protected abstract void postProcess()
  4.     protected abstract int getNofBooks();
  5.     protected abstract String getBookTitle(String prefix, int book)
  6.     protected abstract Reader getBookReader(String prefix, int book
  7.                 throws IOException
  8.     protected abstract void processBook(String title, BufferedReader br
  9.                 throws IOException;
  10.     ... 
与LibraryBuilder相似,此对象在调用preProcess()方法之前

处理开始。 处理完成后,postProcess()方法为

调用。 KJProcessor为这两个抽象方法实现空方法

因为它不需要进行任何特殊的预处理或后期处理。

AbstractProcessor需要知道要处理多少本书,

需要每本书的标题。 这就是接下来的两种方法的用途

它们需要在AbstractProcessor类的子类中实现。

getBookReader()方法需要返回一个可以读取的Java Reader对象。

从一本书。 最后一种方法必须处理整本书,给定读者

那本书。

最后两个方法会抛出IOException,因为任何输入/输出

相关动作可能会出错。

请注意,子类可以调用方法并读取或更改成员变量

直接在建筑商中,即两者之间的耦合紧密。

这是需要Library对象时的委托方法:

  1.     ...
  2.     public Library getLibrary() { return builder.build(); }
  3.     ... 
另请参见上文:AbstractProcessor只需调用builder.build()方法

为图书馆。

现在进行一些实质性的工作。 AbstractProcessor中的下一个方法

类是在Processor中定义的process()方法的实现

接口:

  1.     ...
  2.     public void process(String prefix) throws IOException { 
  3.         builder.preProcess();
  4.         builder.setTitle(title); 
  5.         this.preProcess(); 
  6.         for (int i= 0, n= getNofBooks(); i < n; i++)
  7.             processBook(prefix, i); 
  8.         this.postProcess(); 
  9.         builder.postProcess();
  10.     }
  11.     ... 
它在生成器和子类上调用preProcess()方法,

将标题传递给建造者。

接下来,它确定要处理的书的数量并处理每本

通过调用processBook()方法预订书籍(请参见下文)。

当一切都成功后,将在两者上调用postProcess()方法。

子类和生成器。

这是processBook()方法的实现:

  1.     ...
  2.     public void processBook(String prefix, int book) throws IOException { 
  3.         BufferedReader br= null
  4.         try {
  5.             br= new BufferedReader(getBookReader(prefix, book));
  6.             processBook(getBookTitle(prefix, book), br);
  7.         }
  8.         finally {
  9.             try { br.close(); } catch (IOException ioe) { }
  10.         }
  11.     } 
此方法要求子类返回给定书籍的Reader。 它包裹

Reader周围的BufferedReader,并再次要求子类进行处理

当前的书。 最后,缓冲的读取器再次关闭,然后关闭

包装的阅读器本身。

我认为这是本周足够的设计和实现。 下礼拜

显示LibraryBuilder是如何设计和实现的。 比工作还多

此处理器实现。

之后,我将展示KJProcessor和KJBuilder类。 他们处理

nitty-gritty字符串处理工作,基本上是实现

在其父类中定义的抽象方法以及一些丑陋的方法

必须提供一致的文字(请参阅上周的文章部分)。

我将把所有代码作为附件添加到以下一些文章部分中,以便

您可以使用它,或者实际上可以以有用的方式应用它。 不是

实际阅读源代码有害。 如果您发现错误,请随时纠正我。

下周见

亲切的问候,

乔斯

From: https://bytes.com/topic/java/insights/739668-text-retrieval-systems-2b-text-processors

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1003227
推荐阅读
相关标签
  

闽ICP备14008679号