vik*_*ing 13 java text-extraction named-entity-extraction
现在我使用Jsoup从某些第三方网页中提取某些信息(不是所有文本),我会定期这样做.这工作正常,直到某些网页的HTML发生变化,这种变化导致现有Java代码发生变化,这是一项繁琐的工作,因为这些网页变化非常频繁.它还需要程序员来修复Java代码.以下是我对网页感兴趣的HTML代码示例:
<div>
<p><strong>Score:</strong>2.5/5</p>
<p><strong>Director:</strong> Bryan Singer</p>
</div>
<div>some other info which I dont need</div>
Run Code Online (Sandbox Code Playgroud)
现在这就是我想要做的,我想在本地保存这个网页(一个HTML文件)并从中创建一个模板,如:
<div>
<p><strong>Score:</strong>{MOVIE_RATING}</p>
<p><strong>Director:</strong>{MOVIE_DIRECTOR}</p>
</div>
<div>some other info which I dont need</div>
Run Code Online (Sandbox Code Playgroud)
除了网页的实际URL之外,这些HTML模板将是Java程序的输入,它将找出这些预定义关键字的位置(例如{MOVIE_RATING},{MOVIE_DIRECTOR})并从实际网页中提取值.
这样我每次网页更改时都不必修改Java程序,我只保存网页的HTML并用这些关键字替换数据,其余的将由程序处理.例如,将来实际的HTML代码可能如下所示:
<div>
<div><b>Rating:</b>**1/2</div>
<div><i>Director:</i>Singer, Bryan</div>
</div>
Run Code Online (Sandbox Code Playgroud)
相应的模板如下所示:
<div>
<div><b>Rating:</b>{MOVIE_RATING}</div>
<div><i>Director:</i>{MOVIE_DIRECTOR}</div>
</div>
Run Code Online (Sandbox Code Playgroud)
创建这些模板也可以由非程序员,任何可以编辑文件的人完成.
现在的问题是,我如何在Java中实现这一点,是否有任何现有的和更好的方法来解决这个问题?
注意: 谷歌搜索时我发现了一些研究论文,但大多数都需要一些先前的学习数据,准确性也是一个值得关注的问题.
除了正则表达式部分之外,您提供的方法与吉尔伯特的方法非常相似。我不想进入丑陋的正则表达式世界,我计划在电影信息之外的许多其他领域使用模板方法,例如价格、产品规格提取等。
您描述的模板实际上并不是正常意义上的“模板”:一组静态内容转储到输出,其中插入了一堆动态内容。相反,它是模板的“反向”——它是一种被吸收并丢弃的解析模式,留下需要的参数来找到。
由于您的网页会定期更改,因此您不想对要解析的内容进行硬编码,以便过于精确地解析,而是希望“放大”其基本功能,做出最少的假设。即,您希望致力于字面匹配关键文本(例如“评级:”)并以"<b/>"更灵活的方式处理交错标记 - 忽略它并允许它在不中断的情况下进行更改。
当您组合(1)和(2)时,您可以为结果指定任何您喜欢的名称,但它是使用正则表达式进行解析。即模板方法是使用正则表达式的解析方法 - 它们是一样的。问题是:正则表达式应该采用什么形式?
3A。如果您使用 java 手工编码来进行解析,那么显而易见的答案是正则表达式格式应该只是格式java.util.regex。其他任何东西都是开发负担并且是“非标准的”并且难以维护。
3B. 如果您想使用 html 感知的解析器,那么 jsoup 是一个很好的解决方案。问题是您需要比 jsoup 提供的更多的文本/正则表达式处理和灵活性。它似乎过于锁定特定的 html 标签和结构,因此当页面更改时就会中断。
3C。您可以使用更强大的语法控制通用文本解析器,例如 ANTLR - 一种受巴科斯-诺尔启发的语法用于控制解析,并插入生成器代码来处理解析的数据。在这里,解析语法表达式确实非常强大,具有关于文本在页面上如何排序以及文本字段和值如何相互关联的复杂规则。该功能超出了您的要求,因为您没有处理语言。而且不可避免的事实是,您仍然需要描述要跳过的难看的部分 - 例如标记标签等。第一次与 ANTLR 较量需要在获得生产力回报之前进行教育投资。
3D。有没有一个java工具只使用简单的模板类型方法来给出简单的答案?好吧,谷歌搜索并没有给出太多希望https://www.google.com/search?q=java+template+based+parser&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-GB :official&client=firefox-a。我相信任何创建这样一个野兽的尝试都会退化为基本的正则表达式解析或更高级的语法控制解析,因为匹配/忽略/替换文本的基本要求驱动解决方案朝这些方向发展。其他任何事情都太简单而无法实际工作。对于负面观点感到抱歉 - 它只是反映了问题空间。
我投票支持 (3A) 作为满足您需求的最简单、最强大和灵活的解决方案。
| 归档时间: |
|
| 查看次数: |
1438 次 |
| 最近记录: |