自然语言处理(NLP)是计算机科学和人工智能领域的一个重要分支,它涉及到计算机对人类语言的理解和处理。随着技术的进步,NLP已经实现了从简单的文本分析到复杂的语言翻译、语音助手、客服聊天机器人等多种应用。本文将带了解如何使用强大的NLP库Gensim来进行文本分析。
自然语言处理主要处理自然语言,包括文本、音频和视频。本文将重点讨论如何操作文本数据,并探讨文本数据的构建模块。
词元(Token):词元是具有已知意义的字符串,可以是一个词、数字或标点符号。例如,“Hello”,“123”和“-”。
句子(Sentence):句子是一组完整的词元,具有特定意义。例如,“天气看起来不错”,其词元为[“天气”,“看起来”,“不错”]。
段落(Paragraph):段落是句子或短语的集合,句子可以被视为段落的一个词元。
文档(Documents):文档可以是一句话、一个段落或一组段落。发送给个人的文本消息就是一个文档的例子。
语料库(Corpus):语料库通常是大量的文档集合,以词袋模型的形式存在。语料库包含每个词的ID和在每个记录中的频率计数。例如,发送给特定人的电子邮件或文本消息集合就是一个语料库的例子。
Gensim是一个知名的开源Python库,用于NLP和主题建模。它能够处理大量文本数据,并且在训练向量嵌入方面速度快于其他NLP库。此外,Gensim提供了流行的主题建模算法,如LDA,使其成为许多用户的首要选择。
设置Gensim非常简单。可以使用Pip安装器或Conda环境来安装Gensim。
# 安装Gensim
pip install gensim
创建字典:可以使用Gensim从句子列表和文本文件中生成字典。首先,来看看如何从句子列表中创建字典。
# 从句子列表创建字典
from gensim.corpora import Dictionary
sentences = [['hello', 'world'], ['gensim', 'rocks']]
dictionary = Dictionary(sentences)
print(dictionary)
从输出中可以看到,字典中的每个词元都被分配了一个唯一的ID。
现在,使用文本文件中的词元创建一个字典。首先,将使用Gensim的simple_preprocess()函数预处理文件,以从文件中检索词元列表。
# 从文本文件创建字典
from gensim.utils import simple_preprocess
with open('example.txt', 'r') as file:
tokens = simple_preprocess(file.read())
dictionary = Dictionary(tokens)
print(dictionary)
已经成功地从文本文件中创建了一个字典。
还可以更新现有字典,以包含新文档中的词元。
# 更新现有字典
new_document = ['new', 'document', 'example']
dictionary.add_documents([new_document])
创建词袋模型:可以使用Gensim的doc2bow函数从创建的字典中生成词袋模型。词袋模型返回一个包含每个词元唯一ID和在文档中出现次数的元组向量。
# 创建词袋模型
from gensim import corpora
bow_corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
print(bow_corpus)
保存和加载Gensim字典和BOW:可以保存字典和BOW语料库,并在需要时加载它们。
# 保存和加载字典和BOW
dictionary.save('example.dict')
bow_corpus.save('example.bow')
loaded_dictionary = corpora.Dictionary.load('example.dict')
loaded_bow_corpus = corpora.BowCorpus.load('example.bow')
创建TF-IDF:"词频-逆文档频率"(TF-IDF)是一种通过计算词的权重来衡量文档中每个词重要性的技术。
# 创建TF-IDF
from gensim.models import TfidfModel
tfidf = TfidfModel(bow_corpus)
corpus_tfidf = tfidf[bow_corpus]
在TF-IDF向量中,每个词的权重与该词在文档中的频率成反比。
创建Bigrams和Trigrams:在大型文档的文本中,一些词通常一起出现。当这些词一起出现时,它们可能作为一个单一实体出现,并与单独出现时具有完全不同的含义。
以短语“Gateway to India”为例。当它们一起出现时,与单独出现时具有完全不同的含义。这些词组被称为“N-gram”。
Bigrams是2个词的N-gram,Trigrams是3个词的N-gram。将为“text8”数据集创建bigrams和trigrams,该数据集可通过Gensim Downloader API下载。将使用Gensim的Phrases函数来实现这一点。
# 创建Bigrams和Trigrams
from gensim.models import Phrases
bigram = Phrases(sentences)
trigram = Phrases(bigram[sentences])
通过将先前获得的bigram模型传递给Phrases函数来生成Trigram模型。
创建Word2Vec模型:词嵌入模型是一种将文本表示为数值向量的模型。
Word2Vec是Gensim中的预构建词嵌入模型,它使用外部神经网络将词嵌入到低维向量空间中。Gensim的Word2Vec模型可以实现Skip-grams模型和Continuous Bag of Words模型。
# 创建Word2Vec模型
from gensim.models import Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
让首先为“text8”数据集的前1000个词训练Word2Vec模型。
# 训练Word2Vec模型
model = Word2Vec.load('word2vec.model')
vector = model.wv['social']
print(vector)
上述输出是通过该模型找到的“Social”的词向量。
使用most_similar函数,可以得到与“Social”相似的所有词。
# 获取相似词
similar_words = model.wv.most_similar('social')
print(similar_words)
还可以保存Word2Vec模型并重新加载它。
# 保存和加载Word2Vec模型
model.save('word2vec.model')
loaded_model = Word2Vec.load('word2vec.model')
# 更新Word2Vec模型
model.build_vocab(new_sentences)
model.train(new_sentences)