来自C#中电子邮件的模糊模式匹配

时间:2015-02-12 13:52:28

标签: c# regex machine-learning fuzzy-search

我正在寻找一种从电子邮件中提取数据的方法。我主要查看主题行和电子邮件正文,并提取客户和订单参考号。

想象一下,我是一家客户可以发送电子邮件至info@mydomain.com的公司,他们可能会在电子邮件的主题行或正文中添加特定的客户编号或订单参考。但是,它们可能并不总是以最佳格式提供这些引用。我想提取数据,并返回数据有效可能性的概率。

我是否可以使用某种技术来尝试扫描电子邮件并以可能的程度返回可能的客户编号和/或订单参考(有点像贝叶斯垃圾邮件过滤)?

我正在考虑使用某种正则表达式引擎,但这看起来太僵硬了。我也在看NUML.net并想知道它是否可以帮助我,但我有点超出我的深度,因为我不完全确定我需要什么。我遇到了Levenshtein算法,但这似乎是匹配两个固定的字符串,而不是固定的字符串和模式。

我想象的API看起来有点像这样:

// emailMessage is a Mandrill inbound object, in case anybody wonders
EmailScanResult results = EmailScanner.Scan(emailMessage, new {ScanType.CustomerNo, ScanType.OrderReference});
foreach (var result in results)
{
    var scanType = result.Type; // I.e. ScanType.CustomerNo
    var score = result.Score; // e.g. 1.2
    var value = result.Value; // CU-233454345-2321
}

可能的输入是多种多样的;例如。对于相同的客户编号:

  • DF-232322-AB2323
  • DF-232322-AB2323
  • 232322-ab2323
  • 232322AB2323

哪种算法对此类任务有用?是否有任何推荐的.NET库,你知道任何适当的例子吗?

1 个答案:

答案 0 :(得分:0)

如果我做对了,你可以使用正则表达式没有问题。例如,使用您提供的输入样本,您可以使用正则表达式:

  

([A-Z | A-Z] {2,2} - ){0,1} \ d {6,6} - {0,1} \ d {4,4}

  • 第一部分获取 DF - df - ,可能会也可能不会发生:([AZ | az] {2,2} - ){0,1}
  • 第二部分获取第一组数字: \ d {6,6}
  • 然后,我们说它可能有一个破折号: \ - {0,1}
  • 最后,我们得到最后一组数字: \ d {4,4}

这将涵盖您作为示例提供的值,但您也可以编写其他表达式来获取其他值。

或者,也许,您可以使用类似Lucene.net的内容。据我所知,这对你也有帮助 http://pt.slideshare.net/nitin_stephens/lucene-basics
http://jsprunger.com/getting-started-with-lucene-net/