[Серия глубокого обучения] Практика обработки спама PaddlePaddle (1)

машинное обучение искусственный интеллект глубокое обучение

PaddlePaddle Практика обработки спама (1)

Введение

В нашей повседневной жизни мы часто получаем всевозможный спам, такой как реклама от продавцов, информация о скидках, игровые электронные письма Макао, информация о финансовых акциях и т. д. Вообще говоря, почтовый клиент устанавливает определенные ключевые слова для блокировки этого вида спама. , или классифицировать почту, но всегда найдутся такие, которые проскальзывают через сеть.   Однако сделать ручной классификатор спама несложно. Традиционные алгоритмы машинного обучения обычно используют наивный байесовский алгоритм, машины опорных векторов и другие алгоритмы для фильтрации спама.Сегодня мы в основном поговорим о том, как использовать PaddlePaddle для написания классификатора спама. Конечно, прежде чем мы поговорим о том, как PaddlePaddle справляется со спамом, давайте рассмотрим, как традиционные алгоритмы машинного обучения классифицируют спам.

Узнать о наборах данных

   Во-первых, давайте посмотрим на сегодняшний набор данных: trec06c. trec06c — это общедоступный массив спама, предоставленный Международной конференцией по текстовому поиску.
Адрес загрузки файла:trec06c
формат файла:

trec06c
│
└───data
│   │   000
│   │   001
│   │   ...
│   └───215
└───delay
│   │   index
└───full
│   │   index   скопировать код

содержание документа:

Пример нежелательной почты: Компания имеет несколько обычных счетов-фактур (счета-фактуры на продажу товаров), счета-фактуры налога на добавленную стоимость, специальные платежные квитанции для таможенного сбора налога на добавленную стоимость и другие счета-фактуры сферы услуг, счета-фактуры автомобильного и внутреннего водного транспорта. Он может быть открыт для вашей компании по низкой налоговой ставке.Компания имеет силу внутренней и внешней торговли, чтобы гарантировать подлинность счетов, выставленных нашей компанией. Надеюсь на сотрудничество!Общее развитие!Цзиньхоу ваш призыв к переговорам и консультациям! Контактное лицо: г-н Ли Тел: 13632588281 Если есть какие-либо нарушения, я надеюсь на понимание, и я желаю Шанци. Пример обычного электронного письма: В нем рассказывается история потомков Конфуция. Старый вождь вернулся в свой родной город, и его отношения с сыном были в разладе, но он был в мире со своим внуком Конг Беном, который был жаден до денег. Карету вел младший брат старого вождя, Вэй Цзунвань. Есть девушка-иностранка, которая, вероятно, изучает народные обычаи и встречает Новый год у них дома. Конг Бен всегда хотел уехать за границу и получил образование у своего дедушки. В конце концов, семья в основном помирилась. Кстати, еще один тип пленки, от Пекинской молодежной киностудии.

предварительная обработка данных

   После получения данных мы можем ясно видеть содержимое письма, но не все содержимое является тем, что нам нужно.Здесь мы извлекаем только китайский язык из письма в качестве обучающего корпуса. Если вы внимательно посмотрите, вы обнаружите, что не все электронные письма можно открыть напрямую, а формат кодирования данных также необходимо преобразовать в формат utf-8 для дальнейшего обучения. Поэтому нам нужно выполнить некоторую предварительную обработку исходных данных, включая следующее.

Основные шаги

  • Преобразование формата кодировки исходных данных в формат utf-8
  • символ фильтра
    • Удалите все некитайские символы, такие как знаки препинания, английские символы, цифры, ссылки на веб-сайты и другие специальные символы.
  • фильтровать стоп-слова
  • Сегментация Word для содержимого электронной почты

тренировочный код

Ниже приведен конкретный код transfer.py:

# -*- coding: utf-8 -*-
#Created by huxiaoman 2018.1.28
#transfer.py:生成spam和ham数据
import jieba
import sys
import os
import re

# 判断邮件中的字符是否是中文
def check_contain_chinese(check_str):
    for ch in check_str.decode('utf-8'):
        if u'\u4e00' <= ch <= u'\u9fff':
            return True
    return False

# 加载邮件数据的label
def load_label_files(label_file):
    label_dict ={}
    for line in open(label_file).readlines():
        list1 = line.strip().split("..")
        label_dict[list1[1].strip()] = list1[0].strip()
    return label_dict

# 加载停用词词表
def load_stop_train(stop_word_path):
    stop_dict = {}
    for line in open(stop_word_path).readlines():
        line = line.strip()
        stop_dict[line] = 1
    return stop_dict

# 读取邮件数据,并转换为utf-8格式,生成spam和ham样本
def read_files(file_path,label_dict,stop_dict,spam_file_path,ham_file_path):
    parents = os.listdir(file_path)
    spam_file = open(spam_file_path,'a')
    ham_file = open(ham_file_path,'a')
    for parent in parents:
        child = os.path.join(file_path,parent)
        if os.path.isdir(child):
            read_files(child,label_dict,stop_dict,spam_file_path,ham_file_path)
        else:
            print child[10:]
            label = "unk"
            if child[10:] in label_dict:
                label = label_dict[child[10:]]
            # deal file
            temp_list = []
            for line in open(child).readlines():
                line = line.strip().decode("gbk",'ignore').encode('utf-8')
                if not check_contain_chinese(line):
                    continue
                seg_list = jieba.cut(line, cut_all=False)
                for word in seg_list:
                    if word in stop_dict:
                        continue
                    else:
                        temp_list.append(word)
            line = " ".join(temp_list)
            print label
            if label == "spam":
                spam_file.write(line.encode("utf-8","ignore") + "\n")
            if label == "ham":
                ham_file.write(line.encode("utf-8","ignore")+"\n")

# 生成word2vec词表
def generate_word2vec(file_path,label_dict,stop_dict,word_vec):
    parents = os.listdir(file_path)
    fh1 = open(word_vec,'a')
    i = 0

    for parent in parents:
        child = os.path.join(file_path,parent)
        if os.path.isdir(child):
            generate_word2vec(child,label_dict,stop_dict,word_vec)
        else:
            print child[10:]
            i += 1
            print i
            label = "unk"
            if child[10:] in label_dict:
                label = label_dict[child[10:]]
            # deal file
            temp_list = []
            for line in open(child).readlines():
                line = line.strip().decode("gbk",'ignore').encode('utf-8')
                if not check_contain_chinese(line):
                    continue
                if len(line) == 0:
                    continue
                seg_list = jieba.cut(line, cut_all=False)
                for word in seg_list:
                    if word in stop_dict:
                        continue
                    else:
                        temp_list.append(word)
            line = " ".join(temp_list)
            fh1.write(line.encode("utf-8","ingore")+"\n")

if __name__=="__main__":
    file_path = sys.argv[1]
    label_path = sys.argv[2]
    stop_word_path = "stop_words.txt"
    word_vec_path = "word2vec.txt"
    spam_data = "spam.txt"
    ham_data = "ham.txt"
    label_dict = load_label_files(label_path)
    stop_dict = load_stop_train(stop_word_path)
    read_files(file_path,label_dict,stop_dict,spam_data,ham_data)скопировать код

запустить скрипт

Выполнить. это:

bashif [ $1 = "test" ]; then
    echo "test"
    python transfer.py ../test/ ../trec06c/full/index
else
    echo "whole"
    python transfer.py ../trec06c/data/ ../trec06c/full/index
fiскопировать код

Режим работы:

sh run.shскопировать код

результат операции:

  • ham.txt: положительный образец, обычная почта. Всего 21373 единицы данных.
    • Пример: Я не понимаю, почему вы хотите поговорить со своими родителями, если вы не возражаете, что делать с вашими родителями... Во-первых, спасибо, что утешили меня. Но мне очень грустно, у меня свои проблемы. Я бы не осмелилась рассказать маме об этой ситуации. Моя мама из тех, о ком нужно беспокоиться. И я не рядом с ней. Мой дом за городом. Если я скажу маме, она не согласится быть со мной. Мама смотрит на здоровье очень важно . В один год у моего зятя часто шла кровь из носа, и мама очень волновалась, поэтому я уговорила сестру отвезти его посмотреть.
  • spam.txt: отрицательные образцы, спам. Всего 41627 единиц данных.
    • Пример: Здравствуйте, это специальное сообщение для вас о Гонконге, фотографиях, достопримечательностях и т. д. Я не знаю, нравится вам это или нет. Надеюсь, что вас не побеспокоят. Если вы не видите содержание ниже, пожалуйста, подождите немного или введите адрес Гонконгского форума по доменным именам в Интернете.
  • word2vec.txt: содержит содержимое всей сегментации слов электронной почты, обеспечивая прогнозы обучения для Word2Vec. Всего 63 000 единиц данных.
    • Пример: Я думаю, что не имеет значения, есть ли у вас долги, самое главное - быть в состоянии взять на себя эту ответственность. Если вы должны так много денег, по крайней мере, у меня есть объяснение для пользователей сети, которые проявили любовь в начале. Я верну, или не верну, или, да, у меня есть это сердце, но я действительно неспособен. Хорошо, что мне даже не нужно активировать свой ID. Я даже сменил свой мобильный номер телефона... Не говоря уже о людях из других мест, даже интернет-пользователи в Пекине не смогли его найти... Он был в Моменте в версии Mizuki fl, Я наблюдал весь процесс.

Создание векторов слов

Ограничения традиционных методов

  Мы знаем, что данные после сегментации слов не могут быть непосредственно взяты в модель для обучения.Нам нужно преобразовать слова в векторы слов для обучения модели, чтобы слово могло состоять из многомерного вектора слов. Традиционный метод — это горячее кодирование, то есть для представления слова используется длинный вектор, длина вектора — это размер словаря, компонент вектора — только одна 1, а все остальные — 0. , а позиция 1 соответствует измененному слову в словаре Местоположение, например компьютер, выражается как: [0 0 0 0 0 1 0 0 0 0], гарнитура выражается как [0 0 0 0 0 0 0 1 0] Если таким образом используется разреженное хранилище, выражение получается кратким и занимает меньше места, но у этого метода есть и несколько недостатков. Один из них заключается в том, что он легко страдает от проклятия размерности, особенно при его использовании. за Некоторые алгоритмы глубокого обучения; во-вторых, сходство между словами не может быть хорошо описано, то есть любые два слова изолированы. По этим двум векторам невозможно увидеть, связаны ли два слова, и большая часть информации теряется, что приводит к большим отклонениям в результатах.

Преимущества метода Word2Vec

  В 1968 году Хинтон предложил распределенное представление, которое может устранить недостатки горячего кодирования. Основная идея состоит в том, чтобы напрямую представить слово с помощью обычного вектора, который обычно выглядит так: [0,792, -0,177, -0,107, 0,109, -0,542, ...], что является обычным векторным представлением. Размеры чаще встречаются с размерами 50 и 100. Конечно, то, как слово представлено в виде такого вектора, нужно получить путем обучения, методов обучения много, и word2vec — самый распространенный. Следует отметить, что вектор слов, полученный для каждого слова, может быть разным для разных корпусов и разных методов обучения. Вектор слова вообще невысокой размерности, в общем случае достаточно указать 1000 и 500 размерностей, так что шанс размерной катастрофы теперь мизерный. Репрезентативность представления сильно снижена.
Потому что он представлен вектором, а вектор векторов слов, полученный с помощью лучшего алгоритма обучения, обычно имеет пространственное значение, то есть сложите все эти векторы вместе, чтобы сформировать пространство векторов слов, и каждый вектор представляет собой точку в этом пространстве. , метрика расстояния между векторами слов в этом пространстве также может представлять «расстояние» между соответствующими двумя словами. Так называемое «расстояние» между двумя словами представляет собой грамматическое и семантическое сходство между двумя словами.
Относительно крутой метод применения заключается в том, что после получения вектора слов, если для определенного слова А, вы хотите найти наиболее похожее слово этого слова, после того, как вектор слов установлен, для компьютера вам нужно только взять слово Вычислите евклидово расстояние или cos-расстояние между вектором и векторами слов других слов и получите слово с наименьшим расстоянием, которое наиболее похоже.
   Итак, здесь мы выбираем метод word2vec для обучения и генерации векторов слов. Что касается принципа работы word2vec, вы можете поискать и узнать в Интернете, и я не буду повторяться здесь.

код реализации

   Здесь можно разместить файл word2vec.txt, который мы сгенерировали в ходе предварительной обработки данных, чтобы обучить модель word2vec генерировать векторы слов Конкретный код реализации выглядит следующим образом: word2vec.py

# -*- coding: utf-8 -*-
# Created by huxiaoman 2018.1.28
# word2vec.py:生成word2vec模型

import os
import sys
import numpy as np
from gensim.models.word2vec import Word2Vec
from gensim.corpora.dictionary import Dictionary
import codecs

reload(sys)
sys.setdefaultencoding( "utf-8" )

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in codecs.open(os.path.join(self.dirname, fname),"r", encoding="utf-8",errors="ignore"):
                yield line.strip().split()

# word2vec.txt数据的地址
train_path = "rawData/"

# 生成的word2vec模型的地址
model_path = "/modelPath/"
sentences = MySentences(train_path) 

# 此处min_count=5代表5元模型,size=100代表词向量维度,worker=15表示15个线程
model = Word2Vec(sentences,min_count = 5,size=100,workers=15)

#保存模型
model.save(model_path+'/Word2vec_model.pkl')скопировать код

Режим работы

python word2vec.pyскопировать код

результат операции

Word2vec_model.pkl скопировать код

обучение модели

   После создания положительных и отрицательных выборочных данных и преобразования всех слов в векторы слов мы можем залить данные в модель для обучения.В этой статье для обучения будет использоваться традиционный алгоритм машинного обучения svm.

Конкретные шаги

  • Загрузить набор данных
  • Разделите обучающий набор train, проверочный набор val и тестовый набор test
  • Определите модель обучения и обучите
  • Проверить точность

    код реализации

    # 构建svm模型,加载数据等代码详见github
    def get_svm_model(x_train,y_train,x_val,y_val):
    model = SVC(C=1,kernel='rbf',max_iter=10,gamma=1,probability=True)
    model.fit(x_train,y_train)
    pred=model.predict(x_val)
    fpr,tpr,thresholds = roc_curve(y_val, pred, pos_label=2)
    score = metrics.f1_score(y_val,pred)
    print scoreскопировать код

    Режим работы

    python train_svm.pyскопировать код

    результат операции

    0.73343221скопировать код

резюме

Эта статья используется в качестве разминки для серии статей о борьбе со спамом с помощью PaddlePaddle. В ней в основном рассказывается о том, как предварительно обрабатывать и фильтровать текстовые данные, как генерировать векторы слов и как обучать модель с помощью традиционного метода машинного обучения — опорного вектора. точность 0,73343221. Качество результата зависит от размера словаря, размера размерности вектора слова и настройки основных параметров svm.В реальном рабочем процессе требуется непрерывная настройка параметров для достижения оптимального эффекта. В следующей статье мы покажем вам, как использовать PaddlePaddle для борьбы со спамом, классифицировать спам с помощью глубокого обучения и посмотрим, будет ли эффект лучше, чем у традиционного метода машинного обучения, и можно ли улучшить производительность и скорость до определенного уровня. степень. .

  • Эта статья была написана на основе сообщения в блоге Modify, и все части сообщения в блоге Modify были одобрены самим Modify. Эта статья была впервые опубликована на Jinglue Jizhi и выпущена Jinglue Jizhi в виде серии видеороликов «PaddlePaddle приставает к мошенникам по электронной почте». Если вам что-то непонятно, спрашивайте в комментариях~

Добавить Автора

Источник: http://www.cnblogs.com/charlotte77/

Эта статья предназначена в основном для изучения, исследования и распространения.Если вам необходимо перепечатать, пожалуйста, свяжитесь со мной, укажите автора и источник, некоммерческое использование!