作者 | 云朵君
标记(Token): 是具有已知含义的字符串,标记可以是单词、数字或只是像标点符号的字符。“你好”、“123”和“-”是标记的一些示例。句子(Sentence): 是一组意义完整的记号。“天气看起来不错” 是一个句子的例子,句子的标记是【“天气”, “看起来”, “不错“】。段落(Paragraph): 是句子或短语的集合,也可以将句子视为段落的标记。文档(Documents): 可能是一个句子、一个段落或一组段落。发送给个人的文本消息是文档的一个示例。语料(Corpus): 通常是作为词袋的原始文档集合。语料库包括每个记录中每个单词的 id 和频率计数。语料库的一个例子是发送给特定人的电子邮件或文本消息的集合。稀疏向量(SparseVector): 通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的元组模型(Model): 是一个抽象的术语。定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)。TF-IDF,LSA,LDA,和 word2vec在内的多种主题模型算法,用此很多算法工程师会将其作为主题建模的首选库。#UsingPipinstaller:
pipinstall--upgradegensim
#UsingCondaenvironment:
condainstall-cconda-forgegensim
importgensim
fromgensimimportcorpora
text1=["""Gensimisafreeopen-sourcePythonlibraryforrepresentingdocumentsassemanticvectors,
asefficientlyandpainlesslyaspossible.Gensimisdesigned
toprocessraw,unstructureddigitaltextsusingunsupervisedmachinelearningalgorithms."""]
tokens1=[[itemforiteminline.split()]forlineintext1]
g_dict1=corpora.Dictionary(tokens1)
print("Thedictionaryhas:"+str(len(g_dict1))+"tokens\n")
print(g_dict1.token2id)
The dictionary has: 29 tokens
{'Gensim': 0, 'Python': 1, 'a': 2, 'algorithms.': 3,
'and': 4, 'as': 5, 'designed': 6, 'digital': 7,
'documents': 8, 'efficiently': 9, 'for': 10, 'free': 11,
'is': 12, 'learning': 13, 'library': 14, 'machine': 15,
'open-source': 16, 'painlessly': 17, 'possible.': 18,
'process': 19, 'raw,': 20, 'representing': 21,
'semantic': 22, 'texts': 23, 'to': 24, 'unstructured': 25,
'unsupervised': 26, 'using': 27, 'vectors,': 28}
id。simple_preprocess() 函数对文件进行预处理,从文件中检索tokens列表。fromgensim.utilsimportsimple_preprocess
fromgensimimportcorpora
#text2=open('sample_text.txt',encoding='utf-8').read()
text2="""
NLPisabranchofdatasciencethatconsistsofsystematicprocessesforanalyzing,
understanding,andderivinginformationfromthetextdatainasmartandefficientmanner.
ByutilizingNLPanditscomponents,onecanorganizethemassivechunksoftextdata,
performnumerousautomatedtasksandsolveawiderangeofproblemssuchas–
automaticsummarization,machinetranslation,namedentityrecognition,
relationshipextraction,sentimentanalysis,speechrecognition,andtopicsegmentationetc.
"""
tokens2=[]
forlineintext2.split('.'):
tokens2.append(simple_preprocess(line,deacc=True))
g_dict2=corpora.Dictionary(tokens2)
print("Thedictionaryhas:"+str(len(g_dict2))+"tokens\n")
print(g_dict2.token2id)
g_dict1.add_documents(tokens2)
print("Thedictionaryhas:"+str(len(g_dict1))+"tokens\n")
print(g_dict1.token2id)
doc2bow 函数从创建的字典中生成 Bag of Words (词袋)。词袋返回一个元组向量,其中包含每个标记的唯一 id 和文档中出现的次数。g_bow=[g_dict1.doc2bow(token,allow_update=True)
fortokenintokens1]
print("BagofWords:",g_bow)
#SavetheDictionaryandBOW
g_dict1.save('./g_dict1.dict')
corpora.MmCorpus.serialize('./g_bow1.mm',g_bow)
#LoadtheDictionaryandBOW
g_dict_load=corpora.Dictionary.load('./g_dict1.dict')
g_bow_load=corpora.MmCorpus('./g_bow1.mm')
doc2bow 函数并不是将文本转化成稀疏向量的唯一途径。后面我们将介绍更多的向量变换函数。classMyCorpus(object):
def__iter__(self):
forlineinopen('mycorpus.txt'):
#假设每行有一个文档,标记用空格分隔
yielddictionary.doc2bow(line.lower().split())
doc2bow 变换。每一个模型又都是一个标准的Python对象。下面以TF-IDF模型为例,介绍 Gensim 模型的一般使用方法。fromgensimimportmodels
importnumpyasnp
text=["Thefoodisexcellentbuttheservicecanbebetter",
"Thefoodisalwaysdeliciousandlovedtheservice",
"Thefoodwasmediocreandtheservicewasterrible"]
g_dict=corpora.Dictionary([simple_preprocess(line)forlineintext])
g_bow=[g_dict.doc2bow(simple_preprocess(line))forlineintext]
print("Dictionary:")
foriteming_bow:
print([[g_dict[id],freq]forid,freqinitem])
g_tfidf=models.TfidfModel(g_bow,smartirs='ntc')
print("TF-IDFVector:")
foriteming_tfidf[g_bow]:
print([[g_dict[id],np.around(freq,decimals=2)]forid,freqinitem])
tfidf = models.TfidfModel(corpus),完成对语料库corpus中出现的每一个特征的IDF值的统计工作。其中,corpus是一个返回bow向量的迭代器。需要注意的是,这里的bow向量必须与训练语料的bow向量共享同一个特征字典(即共享同一个向量空间)。model[corpus]方法返回的是一个迭代器。如果要多次访问model[corpus]的返回结果,可以先将结果向量序列化到磁盘上。tfidf.save("./model.tfidf")
tfidf=models.TfidfModel.load("./model.tfidf")
“世界之窗”为例,当它们同时出现(世界之窗)的时候和单独出现(世界,窗)的时候有完全不同的意思,这些词组被称为“N-gram”。Bigrams二元组是由2个单词组成的N-gram,Trigrams 三元组是由3个单词组成的。“text8”数据集创建二元组和三元组,可通过 Gensim Downloader API 下载。并使用 Gensim 的 Phrases 功能。Trigram 模型是通过将之前获得的 bigram 模型传递给 Phrases 函数来生成的。importgensim.downloaderasapi
fromgensim.models.phrasesimportPhrases
dataset=api.load("text8")
tokens=[wordforwordindataset]
bigram_model=Phrases(tokens,min_count=3,threshold=10)
print(bigram_model[tokens[0]])
trigram_model=Phrases(bigram_model[data],threshold=10)
print(trigram_model[bigram_model[data[0]]])
Word2Vec 是 Gensim 的一个预先构建的词嵌入模型,它使用外部神经网络将词嵌入到低维向量空间中。Gensim 的 Word2Vec 模型可以实现 Skip-grams 模型和 Continuous Bag of Words 模型。“text8”数据集的前 1000 个单词训练 Word2Vec 模型。fromgensim.models.word2vecimportWord2Vec
frommultiprocessingimportcpu_count
#importgensim.downloaderasapi
#dataset=api.load("text8")
words=[dfordindataset]
data1=words[:1000]
w2v_model=Word2Vec(data1,min_count=0,
workers=cpu_count())
print(w2v_model.wv['social'])
“Social”的词向量。most_similar 函数,可以得到所有与该“Social”词相似的词。print(w2v_model.wv.most_similar('social'))
[('political', 0.7943845987319946),
('cultural', 0.7576460838317871),
('ideology', 0.7451750040054321),
('progresive', 0.725498378276825),
('intellectual', 0.7218820452690125),
('discipline', 0.7171103954315186),
('religious', 0.7035976052284241),
('radical', 0.7034412026405334),
('socio', 0.700967013835907),
('promoting', 0.6993831396102905)]
Word2Vec 模型并在需要的时候将其加载回来。w2v_model.save('./w2v_model1')
w2v_model=Word2Vec.load('./w2v_model1')
Word2Vec 模型。可以通过调用 build_vocab 函数和 train 函数来更新模型。data2=words[1000:]
w2v_model.build_vocab(data2,update=True)
w2v_model.train(data2,total_examples=w2v_model.corpus_count,
epochs=w2v_model.epochs)
print(w2v_model.wv['social'])#numpy.array()
#构造LSI模型并将待检索的query和文本转化为LSI主题向量
#转换之前的corpus和query均是BOW向量
lsi_model=models.LsiModel(corpus,id2word=dictionary,
num_topics=2)
documents=lsi_model[corpus]
query_vec=lsi_model[query]
index=similarities.MatrixSimilarity(documents)
save()和load()方法持久化保存这个相似度矩阵:index.save('/tmp/test.index')
index=similarities.MatrixSimilarity.load('/tmp/test.index')
similarities.MatrixSimilarity类往往会带来内存不够用的问题。此时,可以改用similarities.Similarity类。二者的接口基本保持一致。index对象计算任意一段query和所有文档的(余弦)相似度:sims=index[query_vec]
#返回一个元组类型的迭代器:(idx, sim)
分享
点收藏
点点赞
点在看
文章转发自AI科技大本营微信公众号,版权归其所有。文章内容不代表本站立场和任何投资暗示。
Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM