当前位置: 首页 > 知识库问答 >
问题:

使用antlr解析电子邮件

施旭东
2023-03-14

我已经尝试了整整一周使用antlr构建一个语法,允许我解析电子邮件消息。

我的目标不是将整个电子邮件彻底解析为令牌,而是将其分解为相关部分。

这是我必须处理的文档格式。//描述不属于消息一部分的内联注释:

Subject : [SUBJECT_MARKER] + lorem ipsum...
// marks a message that needs to be parsed.
// Subject marker can be something like "help needed", "action required"

Body: 

// irrelevant text we can ignore, discard or skip
Hi George,
Hope you had a good weekend. Another fluff sentence ...
// end of irrelevant text


// beginning of the SECTION_TYPE_1. SECTION_TYPE_1 marker is "answers below:" 
[SECTION_TYPE_1]

Meaningful text block that needs capturing, made of many sentences: Lorem ipsum ...

[SENTENCE_MARKER] - Sentences that needs to be captured.
[SENTENCE_MARKER] - Sentences that needs to be captured.
[SENTENCE_MARKER] - Sentences that needs to be captured.

[SECTION_END_MARKER] // this is "\n\n"

// SENTENCE_MARKER can be "a)", "b)" or anything that is in the form "[a-zA-Z]')'"
// one important requirement is that this SENTENCE_MARKER matches only inside a section. Either SECTION_TYPE_1 or SECTION_TYPE_2


// alternatively instead of [SECTION_TYPE_1] we can have [SECTION_TYPE_2].
// if we have SECTION_TYPE_1 then try to parse SECTION_TYPE_1 else try to parse SECTION_TYPE_2.enter code here

[SECTION_TYPE_2] // beginning of the section type 1;

Meaningful text bloc that needs capturing. Many sentences Lorem ipsum ...

[SENTENCE_MARKER] - Sentences that needs to be captured.
[SENTENCE_MARKER] - Sentences that needs to be captured.
[SENTENCE_MARKER] - Sentences that needs to be captured.

[SECTION_END_MARKER] // same as above

我面临的问题如下:

  • 我没有想出一个好方法来跳过消息开头的文本,并在找到标记后才开始应用解析规则。截面类型1
  • 捕获节开始和句子标记之间节内的所有文本
  • 在SECTION\u结束标记之后,忽略后面的所有文本

共有1个答案

郜联
2023-03-14

Antlr是结构化的、理想情况下结构明确的文本的解析器。除非您的源消息具有相对明确的功能来可靠地标记感兴趣的消息部分,否则Antlr不太可能工作。

更好的方法是使用自然语言处理器(NLP)包来识别每个句子或短语的形式和对象,从而识别感兴趣的句子或短语。斯坦福NLP软件包非常有名(Github)。

使现代化

必要的语法形式如下:

message : subject ( sec1 | sec2 | fluff )* EOF ;

subject : fluff* SUBJECT_MARKER subText EOL ;
subText : ( word | HWS )+ ;

sec1    : ( SECTION_TYPE_1 content )+ SECTION_END_MARKER     ;
sec2    : ( SECTION_TYPE_2 content )+ SECTION_END_MARKER     ;
content : ( word | ws )+ ;

word    : CHAR+ ;
ws      : ( EOL | HWS )+ ;

fluff   : . ;

SUBJECT_MARKER      : 'marker' ;
SECTION_TYPE_1      : 'text1' ;
SECTION_TYPE_2      : 'text2' ;
SENTENCE_MARKER     : [a-zA-Z0-9] ')' ;

EOL                 : '\r'? '\n';
HWS                 : [ \t] ;
CHAR                : . ;

成功将取决于各种标记的明确程度——并且肯定会有歧义。要么修改语法以显式处理歧义,要么推迟到树行走/分析阶段来解决。

 类似资料:
  • 问题内容: 我正在编写一个Python脚本来处理Procmail返回的电子邮件。如该问题中所建议,我正在使用以下Procmail配置: 我的process_mail.py脚本正在通过stdin接收电子邮件,如下所示: 我正在尝试以这种方式解析消息: 我想获取诸如“发件人”,“收件人”和“主题”之类的消息字段。但是,消息对象不包含任何这些字段。 我究竟做错了什么? 问题答案: 您必须确保这些行不会意

  • Im正在尝试分析outlook中的.msg文件以获取MIME内容,以便将该文件另存为EML。我正在使用Exchange Web服务在EML通过Exchange服务器上的日志收件箱时保存EML,但有些电子邮件需要在事后通过outlook add in保存,不过将它们变成EML/MIME格式似乎比较困难。 任何洞察力都是非常有用的。

  • 问题内容: 是否有人熟悉Java库,该库有助于解析以下电子邮件的字段(日期,主题,从,到)? 问题答案: JavaMail是一个Oracle库,它在javax.mail软件包中提供邮件服务和与邮件相关的服务(例如解析常规邮件和MIME邮件)。另外,Apache有一个用于处理邮件的Commons Email 库。 在JavaMail API中,解析包含电子邮件消息的字符串(可能是或可能不是明确的MI

  • 我有一个perl脚本,使用MIME::E邮件来解析从stdin收到的电子邮件,但它不适用于没有部件的电子邮件。我没有能力在电子邮件发送前修改它们。 我希望能够识别电子邮件的重要部分,不管它是超文本标记语言还是文本,并将其存储在缓冲区中以便以后处理。这些电子邮件中的许多来自自动生成的邮件列表。 有时,它们似乎只有一个“内容类型”:没有边界的标题。 其他时候,它们有多个文本/普通部分,其中一个是电子邮

  • 我有一个使用commons电子邮件的项目(http://search.maven.org/#artifactdetails|组织。阿帕奇。commons | commons电子邮件| 1.2 | jar)通过maven发送。我想使用电子邮件模拟类(http://commons.apache.org/email/testapidocs/org/apache/commons/mail/mocks/Mo

  • 我正在寻找一种方法来解析多部分/可选电子邮件的正文部分。目前,我有一个使用Email::Mime模块的perl脚本,它可以正确解析text/plain和text/html。尽管我的问题是,当我解析一个多部分/可选电子邮件时,$part- PERL代码 来源