作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Shanglun王
验证专家 在工程

Sean是一个充满激情的通晓多种语言的人:一个全栈向导、系统管理员和数据科学家. 他还开发了市场情报软件.

以前在

CB Insights
Share

深度学习是一项技术,已经成为机器学习工作流程的重要组成部分. 利用并行计算能力和支持工具的改进, 曾经不切实际的复杂和深度神经网络现在变得可行了.

功能强大且易于访问的库的出现,例如 Tensorflow, Torch, and Deeplearning4j 还向大型科技公司的学术界和研究部门以外的用户开放了开发吗. 这证明了它的日益普及, 像华为和苹果这样的公司现在包括专门的, 在其最新设备中采用深度学习优化处理器,为深度学习应用提供动力.

深度学习已经在许多领域证明了它的力量. 最值得注意的是谷歌 AlphaGo 能在围棋比赛中打败人类棋手吗, 这款游戏令人难以置信的复杂性一度被认为是计算机与人类玩家竞争中几乎不可逾越的障碍. Flow Machines项目 索尼公司开发了一种神经网络,可以按照过去著名音乐家的风格作曲. FaceID, 苹果公司开发的一项安全功能, 使用深度学习来识别用户的面部,并跟踪用户面部随时间的变化.

在本文中, 我们将把深度学习应用于我最喜欢的两个主题:自然语言处理和葡萄酒. 我们将建立一个模型来理解专家的自然语言葡萄酒评论,并推断出他们正在评论的葡萄酒的种类.

NLP的深度学习

深度学习已被广泛应用于 自然语言处理 (NLP),因为它非常适合学习句子的复杂底层结构和不同单词的语义接近度. 例如, 目前的情感分析技术使用深度学习来捕捉难以建模的语言概念,如否定和混合情绪.

与其他NLP算法相比,深度学习有几个优势:

  1. 灵活的模型: 深度学习模型比其他ML模型灵活得多. 我们可以很容易地尝试不同的结构,根据需要添加和删除图层. 深度学习模型还允许构建具有灵活输出的模型. 灵活性是开发非常适合理解复杂语言结构的模型的关键. 它对于开发NLP应用程序(如翻译)也是必不可少的, chatbots, 以及文本到语音的应用程序.
  2. 需要更少的领域知识: 当然,开发一个好的深度学习模型需要一些领域知识和直觉, 深度学习算法能够自己学习特征层次结构,这意味着开发人员不需要对问题空间有深入的了解 开发深度学习NLP算法. 对于像自然语言这样复杂的问题空间,这是一个非常受欢迎的优势.
  3. 更容易持续学习: 随着新数据的出现,深度学习算法很容易训练. 一些机器学习算法需要将整个数据集发送到模型中进行更新, 这会给生活带来问题吗, 大型数据集.

今天的问题

Today, 我们将建立一个深度学习算法,根据评论文本来确定被评论的葡萄酒的种类. 我们将使用葡萄酒杂志的数据集 http://www.kaggle.com/zynicide/wine-reviews 是由Kaggle用户提供的吗 zackthoutt.

从概念上讲,问题是,我们能不能把葡萄酒评论看成……

香气包括热带水果、扫帚、硫磺和干药草. 味觉没有过度表达, 献上未成熟的苹果, 柑橘和干鼠尾草伴随着轻快的酸度.

认识到这是一种白色的混合? 一些葡萄酒爱好者可能会认出白葡萄酒的迹象,比如苹果酒, citrus, 还有明显的酸度, 但是我们能不能训练我们的神经网络来识别这些信号呢? 另外, 我们能训练我们的神经网络来识别白混合酒和灰皮诺酒之间的细微差别吗?

类似的算法

我们今天要处理的问题本质上是一个NLP分类问题. 有几种NLP分类算法已经应用于NLP中的各种问题. 例如, 朴素贝叶斯 已用于各种垃圾邮件检测算法,和 支持向量机 (SVM)已被用于对医疗机构的进度记录等文本进行分类. 实现这些算法的一个简单版本,作为我们深度学习模型的基线,这将是一件有趣的事情.

Naive Bayes

NLP中朴素贝叶斯的一种流行实现包括使用TF-IDF对文本进行预处理,然后在预处理后的输出上运行多项朴素贝叶斯. 这允许算法在文档中最突出的单词上运行. 我们可以这样实现朴素贝叶斯:

导入numpy为np
从sklearn.naive_bayes import multiomalnb
从sklearn.feature_extraction.文本导入CountVectorizer
以pd方式导入熊猫
从集合导入计数器
从sklearn.Model_selection导入train_test_split
从sklearn.feature_extraction.文本导入TfidfTransformer

df = pd.read_csv(数据/ wine_data.csv')

counter = counter (df['variety']).tolist())
Top_10_varieties = {i[0]: idx for idx, i in enumerate(计数器).most_common (10))}
Df = Df [Df ['variety'].Map (lambda x: x in top_10_varieties)]

Description_list = df['description'].tolist()
Varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()]
Varietal_list = np.阵列(varietal_list)

count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform (description_list)


tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform (x_train_counts)

Train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3)

clf =多项式nb ().fit (train_x train_y)
Y_score = CLF.预测(test_x)

n_right = 0
For I in range(len(y_score)):
    如果y_score[i] == test_y[i]:
        N_right += 1

打印(“准确性:%.2f%%" % ((n_right/float(len(test_y)) * 100)))

运行上面的代码,你应该看到如下所示: 73.56%

考虑到我们正在研究10个类,这是一个相当不错的结果.

我们也可以用支持向量机看看它是怎么做的. 要查看它的执行情况,只需将分类器定义替换为

 clf = SVC(kernel='linear').fit (train_x train_y)

运行此命令,您应该看到以下输出:

Accuracy: 80.66%

也不太寒酸.

让我们看看我们是否可以建立一个深度学习模型,可以超越或至少与这些结果相匹配. 如果我们做到了, 这将是一个很好的迹象,表明我们的深度学习模型至少在复制由领域专业知识提供信息的流行机器学习模型的结果方面是有效的.

构建模型

今天,我们将使用 Keras 使用Tensorflow来构建我们的模型. Keras是一个Python库,与相对低级的Tensorflow API接口相比,它使构建深度学习模型变得非常容易. 除了密集的层, 我们还将使用嵌入层和卷积层来学习单词的底层语义信息和数据中潜在的结构模式.

数据清理

First, 我们必须以一种容易被神经网络处理和理解的方式重组数据. 我们可以通过用唯一标识的数字替换单词来做到这一点. 结合嵌入向量, 我们能够以一种既灵活又语义敏感的方式表示单词.

在实践中,我们希望在预处理方面更聪明一些. 把重点放在常用的单词上是有意义的, 同时也要过滤掉最常用的单词(例如.g.,这个,这个,a).

我们可以使用Defaultdict和NLTK实现此功能. 将以下代码编写到单独的Python模块中. 我把它放在 lib / get_top_x_words.py.

从NLTK导入word_tokenize
从集合中导入defaultdict

Def count_top_x_words(corpus, top_x, skip_top_n):
    Count = defaultdict(lambda: 0)
    对于语料库中的c:
        对于word_tokenize(c)中的w:
            Count [w] += 1
    Count_tuples = sorted([(w, c) for w, c in count ..items()], key=lambda x: x[1], reverse=True)
    返回[i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]]


Def replace_top_x_words_with_vectors(corpus, top_x):
    Topx_dict = {top_x[i]: i for i in range(len(top_x))}

    return [
        [topx_dict[w] for w in word_tokenize(s) if w in topx_dict]
        对于语料库中的s
    ), topx_dict


Def filter_to_top_x(corpus, n_top, skip_n_top=0):
    Top_x = count_top_x_words(corpus, n_top, skip_n_top)
    返回replace_top_x_words_with_vectors(corpus, top_x)

现在我们准备好构建模型了. 我们需要一个嵌入层, 卷积层, 密集层利用了所有对我们的应用有帮助的深度学习特征. 使用Keras,我们可以非常简单地构建模型:

from keras.模型导入顺序
from keras.图层导入Dense, Conv1D, Flatten
from keras.layers.嵌入导入
from keras.预处理导入顺序
from keras.Utils导入to_categorical
以pd方式导入熊猫
从集合导入计数器
从sklearn.Model_selection导入train_test_split
from lib.导入filter_to_top_x

df = pd.read_csv(数据/ wine_data.csv')

counter = counter (df['variety']).tolist())
Top_10_varieties = {i[0]: idx for idx, i in enumerate(计数器).most_common (10))}
Df = Df [Df ['variety'].Map (lambda x: x in top_10_varieties)]

Description_list = df['description'].tolist()
Mapped_list, word_list = filter_to_top_x(description_list, 2500,10)
Varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()]
Varietal_list = to_categorical(varietal_list_o)

Max_review_length = 150

Mapped_list = sequence.pad_sequences (mapped_list maxlen = max_review_length)
Train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3)

Max_review_length = 150

Embedding_vector_length = 64
model = Sequential()

model.添加(嵌入(2500,embedding_vector_length, input_length=max_review_length))
model.5)添加(Conv1D (50)
model.add(平())
model.add(密度(100年,激活= ' relu '))
model.add(Dense(max(varietal_list_o) + 1, activation='softmax'))
model.编译(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.Fit (train_x, train_y, epochs=3, batch_size=64)

Y_score = model.预测(test_x)
Y_score = [[1 if I == max(sc) else 0 for I in sc]
n_right = 0
For I in range(len(y_score)):
    如果所有(y_score[我][j] = = test_y[我][j]的范围内(len (y_score[我]))):
        N_right += 1

打印(“准确性:%.2f%%" % ((n_right/float(len(test_y)) * 100)))

运行代码,您应该看到以下输出.

Accuracy: 77.20%

回想一下,朴素贝叶斯和SVC的准确率是73.56% and 80.66%. 因此,我们的神经网络在对抗一些更常见的文本分类方法方面非常有优势.

Conclusion

今天,我们介绍了建立一个分类深度学习模型来分析葡萄酒评论.

我们发现我们能够建立一个能够与其他一些机器学习算法竞争并超越它们的模型. 我们希望您能够受到启发,使用这些信息来构建分析更复杂数据集并生成更复杂输出的应用程序!

注意:您可以在web上找到我在本文中使用的代码 GitHub.

了解基本知识

  • 什么是自然语言处理?

    自然语言处理是用于分析或产生人类语言和语音的计算技术的范围.

聘请Toptal这方面的专家.
Hire Now
Shanglun王

Shanglun王

验证专家 在工程

纽约,纽约,美国

2016年12月16日成为会员

作者简介

Sean是一个充满激情的通晓多种语言的人:一个全栈向导、系统管理员和数据科学家. 他还开发了市场情报软件.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

CB Insights

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® community.