乐趣区

关于python:适用于NLP自然语言处理的Python使用Facebook-FastText库

原文链接:http://tecdat.cn/?p=8572

在本文中,咱们将钻研 FastText,它是用于单词嵌入和文本分类的另一个极其有用的模块。

在本文中,咱们将简要探讨 FastText 库。本文分为两个局部。在第一局部中,咱们将看到 FastText 库如何创立向量示意模式,该向量示意模式可用于查找单词之间的语义相似性。在第二局部中,咱们将看到 FastText 库在文本分类中的利用。

语义相似性的 FastText

FastText 反对词袋和 Skip-Gram 模型。在本文中,咱们将实现 skip-gram 模型,因为这些主题十分类似,因而咱们抉择这些主题以领有大量数据来创立语料库。您能够依据须要增加更多相似性质的主题。

第一步,咱们须要导入所需的库。

$ pip install wikipedia

导入库

以下脚本将所需的库导入咱们的应用程序:

`

  1. from keras.preprocessing.text import Tokenizer
  2. from gensim.models.fasttext import FastText
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import nltk
  6. from string import punctuation
  7. from nltk.corpus import stopwords
  8. from nltk.tokenize import word_tokenize
  9. from nltk.stem import WordNetLemmatizer
  10. from nltk.tokenize import sent_tokenize
  11. from nltk import WordPunctTokenizer
  12. import wikipedia
  13. import nltk
  14. nltk.download(‘punkt’)
  15. nltk.download(‘wordnet’)
  16. nltk.download(‘stopwords’)
  17. en_stop = set(nltk.corpus.stopwords.words(‘english’))
  18. %matplotlib inline

`
对于单词示意和语义相似性,咱们能够将 Gensim 模型用于 FastText。

维基百科文章

在这一步中,咱们将抓取所需的 Wikipedia 文章。看上面的脚本:

`

  1. artificial_intelligence = wikipedia.page(“Artificial Intelligence”).content
  2. machine_learning = wikipedia.page(“Machine Learning”).content
  3. deep_learning = wikipedia.page(“Deep Learning”).content
  4. neural_network = wikipedia.page(“Neural Network”).content
  5. artificial_intelligence = sent_tokenize(artificial_intelligence)
  6. machine_learning = sent_tokenize(machine_learning)
  7. deep_learning = sent_tokenize(deep_learning)
  8. neural_network = sent_tokenize(neural_network)
  9. artificial_intelligence.extend(machine_learning)
  10. artificial_intelligence.extend(deep_learning)
  11. artificial_intelligence.extend(neural_network)

`

要抓取 Wikipedia 页面,咱们能够应用模块中的 page 办法 wikipedia。您要剪贴的页面名称作为参数传递给page 办法。该办法返回 WikipediaPage 对象,而后您能够应用该对象通过 content 属性来检索页面内容,如下面的脚本所示。

而后应用该 sent_tokenize 办法将来自四个 Wikipedia 页面的抓取的内容标记为句子。该 sent_tokenize 办法返回句子列表。四个页面的句子别离标记。最初,通过该 extend 办法将四篇文章中的句子连贯在一起。

数据预处理

下一步是通过删除标点符号和数字来革除文本数据。

preprocess_text如下定义的性能执行预处理工作。

`

  1. import re
  2. from nltk.stem import WordNetLemmatizer
  3. stemmer = WordNetLemmatizer()
  4. def preprocess_text(document):
  5. preprocessed_text = ‘ ‘.join(tokens)
  6. return preprocessed_text

`

让咱们看看咱们的函数是否通过预处理一个伪句子来执行所需的工作:

`

  1. sent = preprocess_text(“Artificial intelligence, is the most advanced technology of the present era”)
  2. print(sent)

`

预处理语句如下所示:

artificial intelligence advanced technology present

您会看到标点符号和停用词已被删除。

创立单词示意

咱们曾经对语料库进行了预处理。当初是时候应用 FastText 创立单词示意模式了。首先让咱们为 FastText 模型定义超参数:

`

  1. embedding_size = 60
  2. window_size = 40
  3. min_word = 5
  4. down_sampling = 1e-2

`

embedding_size 是嵌入向量的大小。

下一个超参数是 min_word,它指定语料库中单词生成的最小频率。最初,最频繁呈现的单词将通过down_sampling 属性指定的数字进行下采样。

当初让咱们 FastText 为单词示意创立模型。

`

  1. %%time
  2. ft_model = FastText(word_tokenized_corpus,
  3. size=embedding_size,
  4. window=window_size,
  5. min_count=min_word,
  6. sample=down_sampling,
  7. sg=1,
  8. iter=100)

`

sg 参数定义了咱们要创立模型的类型。值为 1 示意咱们要创立跳跃语法模型。零指定单词袋模型,这也是默认值。

执行下面的脚本。运行可能须要一些工夫。在我的机器上,上述代码运行的工夫统计信息如下:

`

  1. CPU times: user 1min 45s, sys: 434 ms, total: 1min 45s
  2. Wall time: 57.2 s

`

 print(ft_model.wv['artificial'])

这是输入:

`

  1. [-3.7653010e-02 -4.5558015e-01 3.2035065e-01 -1.5289043e-01
  2. 4.0645871e-02 -1.8946664e-01 7.0426887e-01 2.8806925e-01
  3. -1.8166199e-01 1.7566417e-01 1.1522485e-01 -3.6525184e-01
  4. -6.4378887e-01 -1.6650060e-01 7.4625671e-01 -4.8166099e-01
  5. 2.0884991e-01 1.8067230e-01 -6.2647951e-01 2.7614883e-01
  6. -3.6478557e-02 1.4782918e-02 -3.3124462e-01 1.9372456e-01
  7. 4.3028224e-02 -8.2326338e-02 1.0356739e-01 4.0792203e-01
  8. -2.0596240e-02 -3.5974573e-02 9.9928051e-02 1.7191900e-01
  9. -2.1196717e-01 6.4424530e-02 -4.4705093e-02 9.7391091e-02
  10. -2.8846195e-01 8.8607501e-03 1.6520244e-01 -3.6626378e-01
  11. -6.2017748e-04 -1.5083785e-01 -1.7499258e-01 7.1994811e-02
  12. -1.9868813e-01 -3.1733567e-01 1.9832127e-01 1.2799081e-01
  13. -7.6522082e-01 5.2335665e-02 -4.5766738e-01 -2.7947658e-01
  14. 3.7890410e-03 -3.8761377e-01 -9.3001537e-02 -1.7128626e-01
  15. -1.2923178e-01 3.9627206e-01 -3.6673656e-01 2.2755004e-01]

`

当初让咱们找到“人造”,“智能”,“机器”,“网络”,“经常出现”,“深度”这五个最类似的词。您能够抉择任意数量的单词。以下脚本将打印指定的单词以及 5 个最类似的单词。

`

  1. for k,v in semantically_similar_words.items():
  2. print(k+”:”+str(v))

`

输入如下:

`

  1. artificial:[‘intelligence’, ‘inspired’, ‘book’, ‘academic’, ‘biological’]
  2. intelligence:[‘artificial’, ‘human’, ‘people’, ‘intelligent’, ‘general’]
  3. machine:[‘ethic’, ‘learning’, ‘concerned’, ‘argument’, ‘intelligence’]
  4. network:[‘neural’, ‘forward’, ‘deep’, ‘backpropagation’, ‘hidden’]
  5. recurrent:[‘rnns’, ‘short’, ‘schmidhuber’, ‘shown’, ‘feedforward’]
  6. deep:[‘convolutional’, ‘speech’, ‘network’, ‘generative’, ‘neural’]

`

咱们还能够找到任意两个单词的向量之间的余弦类似度,如下所示:

print(ft_model.wv.similarity(w1='artificial', w2='intelligence'))

输入显示值为“0.7481”。该值能够介于 0 到 1 之间。更高的值示意更高的类似度。

可视化单词相似性

只管模型中的每个单词都示意为 60 维向量,然而咱们能够应用主成分剖析技术来找到两个主成分。而后能够应用两个次要成分在二维空间中绘制单词。

`

  1. print(all_similar_words)
  2. print(type(all_similar_words))
  3. print(len(all_similar_words))

`

字典中的每个键都是一个单词。相应的值是所有语义类似的单词的列表。因为咱们在“人工”,“智能”,“机器”,“网络”,“经常性”,“深度”这 6 个词的列表中找到了前 5 个最类似的词,因而您会发现其中有 30 个词该 all_similar_words 列表。

接下来,咱们必须找到所有这 30 个单词的单词向量,而后应用 PCA 将单词向量的维数从 60 减小到 2。而后能够应用 plt 办法,该 matplotlib.pyplot 办法是绘制单词的办法的别名在二维向量空间上。

执行以下脚本以可视化单词:

`

  1. word_vectors = ft_model.wv[all_similar_words]
  2. for word_names, x, y in zip(word_names, p_comps[:, 0], p_comps[:, 1]):
  3. plt.annotate(word_names, xy=(x+0.06, y+0.03), xytext=(0, 0), textcoords=’offset points’)

`

下面脚本的输入如下所示:

能够看到在文本中常常一起呈现的单词在二维立体中也彼此凑近。

用于文本分类的 FastText

文本分类是指依据文本的内容将文本数据分类为预约义的类别。情感剖析,垃圾邮件检测和标签检测是一些用于文本分类的用例的最常见示例。

数据集

数据集蕴含多个文件,但咱们仅对该 yelp_review.csv 文件感兴趣。该文件蕴含无关不同业务(包含餐馆,酒吧,牙医,医生,美容院等)的 520 万条评论。然而,因为内存限度,咱们将仅应用前 50,000 条记录来训练咱们的模型。如果须要,能够尝试更多记录。

让咱们导入所需的库并加载数据集:

`

  1. import pandas as pd
  2. import numpy as np
  3. yelp_reviews = pd.read_csv(“/content/drive/My Drive/Colab Datasets/yelp_review_short.csv”)

`

在下面的脚本中,咱们 yelp_review_short.csv 应用 pd.read_csv 函数加载了蕴含 50,000 条评论的文件。

通过将评论的数值转换为分类数值,能够简化咱们的问题。这将通过在 reviews_score 数据集中增加新的列来实现。

最初,数据帧的题目如下所示

装置 FastText

下一步是导入 FastText 模型,能够应用以下 wget 命令从 GitHub 存储库中导入该命令,如以下脚本所示:

`

  1. !wget https://github.com/facebookre…

`

如果您运行上述脚本并看到以下后果,则表明 FastText 已胜利下载:

`

  1. –2019-08-16 15:05:05– https://github.com/facebookre…
  2. Resolving github.com (github.com)… 140.82.113.4
  3. Connecting to github.com (github.com)|140.82.113.4|:443… connected.
  4. HTTP request sent, awaiting response… 302 Found
  5. Location: https://codeload.github.com/f… [following]
  6. –2019-08-16 15:05:05– https://codeload.github.com/f…
  7. Resolving codeload.github.com (codeload.github.com)… 192.30.255.121
  8. Connecting to codeload.github.com (codeload.github.com)|192.30.255.121|:443… connected.
  9. HTTP request sent, awaiting response… 200 OK
  10. Length: unspecified [application/zip]
  11. Saving to:‘v0.1.0.zip’
  12. v0.1.0.zip [<=>] 92.06K –.-KB/s in 0.03s
  13. 2019-08-16 15:05:05 (3.26 MB/s) –‘v0.1.0.zip’saved [94267]

`

下一步是解压缩 FastText 模块。只需键入以下命令:

!unzip v0.1.0.zip

接下来,您必须导航到下载 FastText 的目录,而后执行 !make 命令以运行 C ++ 二进制文件。执行以下步骤:

`

  1. cd fastText-0.1.0
  2. !make

`

如果看到以下输入,则表明 FastText 已胜利装置在您的计算机上。

`

  1. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/args.cc
  2. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/dictionary.cc
  3. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/productquantizer.cc
  4. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/matrix.cc
  5. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/qmatrix.cc
  6. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/vector.cc
  7. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/model.cc
  8. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/utils.cc
  9. c++ -pthread -std=c++0x -O3 -funroll-loops -c src/fasttext.cc
  10. c++ -pthread -std=c++0x -O3 -funroll-loops args.o dictionary.o productquantizer.o matrix.o qmatrix.o vector.o model.o utils.o fasttext.o src/main.cc -o fasttext

`

要验证装置,请执行以下命令:

!./fasttext

您应该看到 FastText 反对以下命令:

`

  1. usage: fasttext <command> <args>
  2. The commands supported by FastText are:
  3. supervised train a supervised classifier
  4. quantize quantize a model to reduce the memory usage
  5. test evaluate a supervised classifier
  6. predict predict most likely labels
  7. predict-prob predict most likely labels with probabilities
  8. skipgram train a skipgram model
  9. cbow train a cbow model
  10. print-word-vectors print word vectors given a trained model
  11. print-sentence-vectors print sentence vectors given a trained model
  12. nn query for nearest neighbors
  13. analogies query for analogies

`

文字分类

在训练 FastText 模型进行文本分类之前,须要先提及 FastText 承受非凡格局的数据,具体如下:

`

  1. _label_tag This is sentence 1
  2. _label_tag2 This is sentence 2.

`

如果咱们查看咱们的数据集,它不是所需的格局。具备积极情绪的文本应如下所示:

**__label__**positive burgers are very big portions here.

同样,负面评论应如下所示:

__label__negative They do not use organic ingredients, but I thi...

以下脚本从数据集中过滤出 reviews_scoretext列,而后 __label__ 在该 reviews_score 列中的所有值之前增加前缀。相似地,\n\ttext列中的空格替换。最初,更新后的数据帧以的模式写入yelp_reviews_updated.txt

`

  1. import pandas as pd
  2. from io import StringIO
  3. import csv
  4. col = [‘reviews_score’, ‘text’]

`

当初让咱们打印更新后的 yelp_reviews 数据框。

yelp_reviews.head()

您应该看到以下后果:

`

  1. reviews_score text
  2. 0 __label__positive Super simple place but amazing nonetheless. It…
  3. 1 __label__positive Small unassuming place that changes their menu…
  4. 2 __label__positive Lester’s is located in a beautiful neighborhoo…
  5. 3 __label__positive Love coming here. Yes the place always needs t…
  6. 4 __label__positive Had their chocolate almond croissant and it wa…

`

同样,数据框的尾部如下所示:

`1. reviews_score text

  1. 49995 __label__positive This is an awesome consignment store! They hav…
  2. 49996 __label__positive Awesome laid back atmosphere with made-to-orde…
  3. 49997 __label__positive Today was my first appointment and I can hones…
  4. 49998 __label__positive I love this chic salon. They use the best prod…
  5. 49999 __label__positive This place is delicious. All their meats and s…`

咱们曾经将数据集转换为所需的形态。下一步是将咱们的数据分为训练集和测试集。80%的数据(即 50,000 条记录中的前 40,000 条记录)将用于训练数据,而 20%的数据(最初 10,000 条记录)将用于评估算法的性能。

以下脚本将数据分为训练集和测试集:

`

  1. !head -n 40000 “/content/drive/My Drive/Colab Datasets/yelp_reviews_updated.txt” > “/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt”
  2. !tail -n 10000 “/content/drive/My Drive/Colab Datasets/yelp_reviews_updated.txt” > “/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt”

`

yelp_reviews_train.txt便会生成蕴含训练数据的文件。同样,新生成的 yelp_reviews_test.txt 文件将蕴含测试数据。

当初是时候训练咱们的 FastText 文本分类算法了。

`

  1. %%time
  2. !./fasttext supervised -input “/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt” -output model_yelp_reviews

`

为了训练算法,咱们必须应用 supervised 命令并将其传递给输出文件。这是下面脚本的输入:

`

  1. Read 4M words
  2. Number of words: 177864
  3. Number of labels: 2
  4. Progress: 100.0% words/sec/thread: 2548017 lr: 0.000000 loss: 0.246120 eta: 0h0m
  5. CPU times: user 212 ms, sys: 48.6 ms, total: 261 ms
  6. Wall time: 15.6 s

`

您能够通过以下 !ls 命令查看模型:

!ls

这是输入:

`

  1. args.o Makefile quantization-results.sh
  2. classification-example.sh matrix.o README.md
  3. classification-results.sh model.o src
  4. CONTRIBUTING.md model_yelp_reviews.bin tutorials
  5. dictionary.o model_yelp_reviews.vec utils.o
  6. eval.py PATENTS vector.o
  7. fasttext pretrained-vectors.md wikifil.pl
  8. fasttext.o productquantizer.o word-vector-example.sh
  9. get-wikimedia.sh qmatrix.o yelp_reviews_train.txt
  10. LICENSE quantization-example.sh

`

能够 model_yelp_reviews.bin 在下面的文档列表中看到。

最初,能够应用以下 test 命令测试模型。必须在 test 命令后指定型号名称和测试文件,如下所示:

!./fasttext test model_yelp_reviews.bin "/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt"

下面脚本的输入如下所示:

`

  1. N 10000
  2. P@1 0.909
  3. R@1 0.909
  4. Number of examples: 10000

`

这里 P@1 是指精度,R@1是指召回率。您能够看到咱们的模型达到了 0.909 的精度和召回率,这相当不错。

当初,让咱们尝试革除标点符号和特殊字符的文本,并将其转换为小写字母,以进步文本的一致性。

!cat "/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt" | sed -e "s/\([.\!?,’/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt"

并且以下脚本革除了测试集:

"/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt" | sed -e "s/\([.\!?,’/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_test_clean.txt"

当初,咱们将在清理的训练集上训练模型:

`

  1. %%time
  2. !./fasttext supervised -input “/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt” -output model_yelp_reviews

`

最初,咱们将应用在污染训练集上训练的模型对测试集进行预测:

!./fasttext test model_yelp_reviews.bin "/content/drive/My Drive/Colab Datasets/yelp_reviews_test_clean.txt"

下面脚本的输入如下:

`

  1. N 10000
  2. P@1 0.915
  3. R@1 0.915
  4. Number of examples: 10000

`

您会看到精度和召回率都有小幅进步。为了进一步改善模型,您能够减少模型的时代和学习率。以下脚本将元数设置为 30,将学习率设置为 0.5。

`

  1. %%time
  2. !./fasttext supervised -input “/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt” -output model_yelp_reviews -epoch 30 -lr 0.5

`

论断

最近,已证实 FastText 模型可用于许多数据集上的单词嵌入和文本分类工作。与其余单词嵌入模型相比,它十分易于应用并且闪电般疾速。

退出移动版