机器学习 - 输入预处理 - NLP 电子邮件分类模型

数据挖掘 分类 nlp 预处理
2022-03-04 10:18:24

所以我创建了一个模型,将电子邮件分类为不同的类别,就像垃圾邮件过滤器一样。我将模型部署为 Web 服务,这没问题,但我无法理解如何使用它来预测新电子邮件的输出类别。如何预处理新电子邮件(主题和消息正文)以匹配模型/网络服务的输入格式?我训练的模型有大约 1000 个特征,对应于训练数据集中出现频率最高的 1000 个词。我是否对新电子邮件进行矢量化?我只是在新电子邮件中搜索功能/单词吗?我想,我显然缺少一些东西。

我使用 python、sklearn 和 pandas/numpy 来预处理和训练模型

2个回答

因此,根据我收集到的信息,您在问如何预处理未出现在训练集中的新(我想是未观察到的)电子邮件。在这种情况下,您应该将您的电子邮件文本转换为 1000 维向量,其中每个值对应一个特定的特征值。

我将根据您简单地计算新电子邮件中最常见的 1000 个单词中出现的次数(我们称之为)。xtest(1)

要将电子邮件转换为矢量形式,这是一种方法:

import pandas as pd
import numpy as np

words = ["blah", "tea", "tetra", "pak"]

def vectorise_email(words, e_mail):

    """Vectorise email to a vector of word counts based on a list of words.

    :param words: (List of Strings) List of frequent words in training set
    :param e_mail: (String) E-mail string

    :return word_counts: (Numpy Array) containing counts of words based on words list.
    """

    e_mail = pd.DataFrame(e_mail.split())

    e_mail = e_mail[e_mail[0].isin(words)][0].value_counts()
    word_counts = np.zeros(len(words))

    for w_idx, word in enumerate(words):
        word_counts[w_idx] = e_mail.at[word]

    return word_counts

print(vectorise_email(words, "this is a blah tetra pak tea tea blah blahh"))

这里我们首先将句子标记为单词(我使用了标准的字符串拆分方法,但您可以使用 nltk 的标记方法 [ https://www.nltk.org/api/nltk.tokenize.html])。然后我们将此列表转换为 pandas DataFrame 以使用 value_counts 方法(参考:https ://stackoverflow.com/questions/22391433/count-the-frequency-that-a-value-occurs-in-a-dataframe-column ) 以获取出现在单词列表中的单词的单词计数。然后我们通过将这些计数映射到一个 Numpy 数组来完成向量化过程,其中数组中的每个元素对应于输入电子邮件中的特定字数。

希望有帮助

对于投入生产的任何数据科学项目。必须遵循在生产和测试培训之前使用的相同预处理技术。在测试/生产中执行预测时,技术没有差异。

假设您在预处理中使用了此功能,同样可以在生产中使用,就像在将数据发送到模型之前一样。

def preprocessing(text):
    text = text.split()
    text = remove_stop_words(text)
    return text