我正在围绕电子邮件分类开展C#项目。首先,我们提取我们需要的数据(联系人,主题,正文等)并将其保存到数据库中。因为我们需要分类功能,所以我们使用正则表达式去除主题和正文中我们不需要的所有东西,并使用移植器词干算法来阻止所有单词(我们也将文本标记化等)。我们将数据中的特征保存为单词,双字母(单词序列)和三元组以及它们出现的次数。
然后我们使用术语频率 - 反向文档频率为我们的功能添加权重。需要查看哪些特征更适合用于分类。
我们目前的问题是我们有165个邮件的+ - 23000个功能。因此,我们需要将功能减少到+ -20功能,因此我们可以在分类器上使用这些功能。
为了实现这一目标,我们正在寻找一个黑盒解决方案,但到目前为止我们一直无法找到它。我们已经尝试了一些涉及主成分分析的解决方案,但它们的输出非常模糊。因此,我们的项目负责人建议我们尝试找到可以在项目中实施的解决方案。
最好的解决方案是接收多维矩阵,并将此矩阵缩小为包含+ -20个特征。示例输入(仅限TF-IDF值的数字):
dog cat fish
doc1 0,024 0,011 0,008
doc2 0,011 0,014 0,007
doc3 0,005 0,024 0,003
doc4 0,008 0,028 0,008
doc5 0,002 0,03 0,006
我们试图以两种方式使用协议框架PCA,但由于我们不理解输出,我们不知道如何减少矩阵(只是一个小测试,看它是如何工作的):
double[,] sourceMatrix =
{
{ 2.5, 2.4 },
{ 0.5, 0.7 },
{ 2.2, 2.9 },
{ 1.9, 2.2 },
{ 3.1, 3.0 },
{ 2.3, 2.7 },
{ 2.0, 1.6 },
{ 1.0, 1.1 },
{ 1.5, 1.6 },
{ 1.1, 0.9 }
};
// Creates the Principal Component Analysis of the given source
var pca = new PrincipalComponentAnalysis(sourceMatrix, AnalysisMethod.Center);
// Compute the Principal Component Analysis
pca.Compute();
// Creates a projection
double[,] components = pca.Transform(sourceMatrix);
for (int i = 0; i < components.GetLength(0); i++)
{
for (int j = 0; j < components.GetLength(1); j++)
{
Console.WriteLine(components[i, j]);
}
}
Console.ReadLine();
我们也使用Components方法在数据网格中显示结果,返回比例,累积比例奇异值和特征值。但由于我们对这个概念不熟悉,我们不知道这对我们如何减少矩阵有用。
double[,] sourceMatrix =
{
{ 2.5, 2.4 },
{ 0.5, 0.7 },
{ 2.2, 2.9 },
{ 1.9, 2.2 },
{ 3.1, 3.0 },
{ 2.3, 2.7 },
{ 2.0, 1.6 },
{ 1.0, 1.1 },
{ 1.5, 1.6 },
{ 1.1, 0.9 }
};
// Creates the Principal Component Analysis of the given source
var pca = new PrincipalComponentAnalysis(sourceMatrix, AnalysisMethod.Center);
// Compute the Principal Component Analysis
pca.Compute();
// Display
dgvPCA.DataSource = pca.Components;
dgvPCA.Columns["Analysis"].Visible = false;
注意:我们不能使用任何需要付款的库。