将合并后的数据导出为CSV文件:现在我们已经有了一个包含电子邮件和标签数据的数据框架,现在可以将该数据框架导出为CSV文件,以供将来使用。使用Deedle frame的SaveCsv函数,您可以轻松地将数据帧保存为CSV文件。
这个准备数据步骤的代码如下:
1 using Deedle; 2 using EAGetMail; 3 using System; 4 using System.IO; 5 using System.Linq; 6 7 namespace 准备数据 8 { 9 internal class Program 10 { 11 private static void Main(string[] args) 12 { 13 // 获取所有原始的电子邮件格式的文件 14 // TODO: 更改指向数据目录的路径 15 string rawDataDirPath = @"D:\工作\代码库\AI\垃圾邮件过滤\raw-data"; 16 string[] emailFiles = Directory.GetFiles(rawDataDirPath, "*.eml"); 17 18 // 从电子邮件文件中解析出主题和正文 19 var emailDF = ParseEmails(emailFiles); 20 // 获取每个电子邮件的标签(spam vs. ham) 21 var labelDF = Frame.ReadCsv(rawDataDirPath + "\\SPAMTrain.label", hasHeaders: false, separators: " ", schema: "int,string"); 22 // 将这些标签添加到电子邮件数据框架中 23 emailDF.AddColumn("is_ham", labelDF.GetColumnAt<String>(0)); 24 // 将解析后的电子邮件和标签保存为CSV文件 25 emailDF.SaveCsv("transformed.csv"); 26 27 Console.WriteLine("准备数据步骤完成!"); 28 Console.ReadKey(); 29 } 30 31 private static Frame<int, string> ParseEmails(string[] files) 32 { 33 // 我们将解析每个电子邮件的主题和正文,并将每个记录存储到键值对中 34 var rows = files.AsEnumerable().Select((x, i) => 35 { 36 // 将每个电子邮件文件加载到邮件对象中 37 Mail email = new Mail("TryIt"); 38 email.Load(x, false); 39 40 // 提取主题和正文 41 string EATrialVersionRemark = "(Trial Version)"; // EAGetMail在试用版本中附加主题“(试用版本)” 42 string emailSubject = email.Subject.EndsWith(EATrialVersionRemark) ? 43 email.Subject.Substring(0, email.Subject.Length - EATrialVersionRemark.Length) : email.Subject; 44 string textBody = email.TextBody; 45 46 // 使用电子邮件id (emailNum)、主题和正文创建键-值对 47 return new { emailNum = i, subject = emailSubject, body = textBody }; 48 }); 49 50 // 根据上面创建的行创建一个数据帧 51 return Frame.FromRecords(rows); 52 } 53 } 54 }