C# 使用Encog框架的垃圾邮件过滤示例
我正在寻找一个关于如何使用Encog框架创建一个简单的垃圾邮件过滤/分类或集群应用程序的示例。我在谷歌上找不到任何东西 我还购买了Jeff Heaton的书《用C#中的Encog3编程神经网络》,但我找不到任何此类应用的例子 任何人都可以提供关于一个简单应用程序的任何信息,如何根据主题和正文将电子邮件分类为垃圾邮件C# 使用Encog框架的垃圾邮件过滤示例,c#,machine-learning,classification,spam-prevention,encog,C#,Machine Learning,Classification,Spam Prevention,Encog,我正在寻找一个关于如何使用Encog框架创建一个简单的垃圾邮件过滤/分类或集群应用程序的示例。我在谷歌上找不到任何东西 我还购买了Jeff Heaton的书《用C#中的Encog3编程神经网络》,但我找不到任何此类应用的例子 任何人都可以提供关于一个简单应用程序的任何信息,如何根据主题和正文将电子邮件分类为垃圾邮件 编辑:我已经在Python中看到了如何做到这一点的方法,但我想问的是,有谁能提供如何创建垃圾邮件过滤/分类应用程序的Encog+C#特定示例吗?大多数垃圾邮件过滤器使用一种贝叶斯分类
编辑:我已经在Python中看到了如何做到这一点的方法,但我想问的是,有谁能提供如何创建垃圾邮件过滤/分类应用程序的Encog+C#特定示例吗?大多数垃圾邮件过滤器使用一种贝叶斯分类,这是最流行、最天真的贝叶斯分类。 下面是一些无需任何附加框架即可使用的代码
public void TrainClassifier(DataTable table)
{
dataSet.Tables.Add(table);
//table
DataTable GaussianDistribution = dataSet.Tables.Add("Gaussian");
GaussianDistribution.Columns.Add(table.Columns[0].ColumnName);
//columns
for (int i = 1; i < table.Columns.Count; i++)
{
GaussianDistribution.Columns.Add(table.Columns[i].ColumnName + "Mean");
GaussianDistribution.Columns.Add(table.Columns[i].ColumnName + "Variance");
}
//calc data
var results = (from myRow in table.AsEnumerable()
group myRow by myRow.Field<string>(table.Columns[0].ColumnName) into g
select new { Name = g.Key, Count = g.Count() }).ToList();
for (int j = 0; j < results.Count; j++)
{
DataRow row = GaussianDistribution.Rows.Add();
row[0] = results[j].Name;
int a = 1;
for (int i = 1; i < table.Columns.Count; i++)
{
row[a] = Helper.Mean(SelectRows(table, i, string.Format("{0} = '{1}'",
table.Columns[0].ColumnName, results[j].Name)));
row[++a] = Helper.Variance(SelectRows(table, i,
string.Format("{0} = '{1}'",
table.Columns[0].ColumnName, results[j].Name)));
a++;
}
}
@杰夫希顿你在外面吗!?谢谢你在没有其他人愿意回答的时候提供了答案。我试图研究您的代码,但我有两个问题:1)如何初始化
dataSet
变量以运行测试?2) 我应该传递什么类型的对象给Classify()方法以返回结果?我只是想找到一种方法来运行这段代码,看看它是如何工作的。编辑了帖子:)希望这也能回答你的Classify()问题。谢谢你的代码。我不知道我会如何将其应用于垃圾邮件过滤;但是,也许随着我继续学习,这一点会变得更加清楚。例如,你应该找到一个垃圾邮件的集合,检索每个单词及其频率。使用频率作为输入节点,您可以计算垃圾邮件的概率。我建议寻找html标记。你能显示Helper.Mean和Helper.Variance方法中的内容吗?
public string Classify(double[] obj)
{
Dictionary<string,> score = new Dictionary<string,>();
var results = (from myRow in dataSet.Tables[0].AsEnumerable()
group myRow by myRow.Field<string>(
dataSet.Tables[0].Columns[0].ColumnName) into g
select new { Name = g.Key, Count = g.Count() }).ToList();
for (int i = 0; i < results.Count; i++)
{
List<double> subScoreList = new List<double>();
int a = 1, b = 1;
for (int k = 1; k < dataSet.Tables["Gaussian"].Columns.Count; k = k + 2)
{
double mean = Convert.ToDouble(dataSet.Tables["Gaussian"].Rows[i][a]);
double variance = Convert.ToDouble(dataSet.Tables["Gaussian"].Rows[i][++a]);
double result = Helper.NormalDist(obj[b - 1], mean, Helper.SquareRoot(variance));
subScoreList.Add(result);
a++; b++;
}
double finalScore = 0;
for (int z = 0; z < subScoreList.Count; z++)
{
if (finalScore == 0)
{
finalScore = subScoreList[z];
continue;
}
finalScore = finalScore * subScoreList[z];
}
score.Add(results[i].Name, finalScore * 0.5);
}
double maxOne = score.Max(c => c.Value);
var name = (from c in score
where c.Value == maxOne
select c.Key).First();
return name;
}
DataTable table = new DataTable();
table.Columns.Add("Sex");
table.Columns.Add("Height", typeof(double));
table.Columns.Add("Weight", typeof(double));
table.Columns.Add("FootSize", typeof(double));
//training data.
table.Rows.Add("male", 6, 180, 12);
table.Rows.Add("male", 5.92, 190, 11);
table.Rows.Add("male", 5.58, 170, 12);
table.Rows.Add("male", 5.92, 165, 10);
table.Rows.Add("female", 5, 100, 6);
table.Rows.Add("female", 5.5, 150, 8);
table.Rows.Add("female", 5.42, 130, 7);
table.Rows.Add("female", 5.75, 150, 9);
table.Rows.Add("transgender", 4, 200, 5);
table.Rows.Add("transgender", 4.10, 150, 8);
table.Rows.Add("transgender", 5.42, 190, 7);
table.Rows.Add("transgender", 5.50, 150, 9);
Classifier classifier = new Classifier();
classifier.TrainClassifier(table);
//output would be transgender.
Console.WriteLine(classifier.Classify(new double[] { 4, 150, 12 }));
Console.Read();