# 语料库
import jieba
#定义停用词、标点符号
punctuation = [",","。", ":", ";", "?"]
#定义语料
content = ["机器学习带动人工智能飞速的发展。",
"深度学习带动人工智能飞速的发展。",
"机器学习和深度学习带动人工智能飞速的发展。"
]
# 对语料进行分词
segs_1 = [jieba.lcut(con) for con in content]
# print(segs_1)
#去掉停止词
tokenized = []
for sentence in segs_1:
words = []
for word in sentence:
if word not in punctuation:
words.append(word)
tokenized.append(words)
print("\n去除停止词后:",tokenized)
将语料库中的每个单词与唯一的整数ID相关联。可以使用gensim.corpora.Dictionary 该类来做到这一点。该词典定义了我们处理过程所知道的所有单词的词汇表。
from gensim import corpora
"""
对于较大的语料库,包含成千上万个标记的字典是很常见的。
"""
dictionary = corpora.Dictionary(tokenized)
print(dictionary)
处理的语料库中有9个唯一的词,这意味着在词袋模型下,每个文档将由9维向量表示。
可以使用字典将标记化的文档转换为这些9维向量。我们可以看到这些ID对应于什么:
import pprint
pprint.pprint(dictionary.token2id)
例如,假设要对短语“人机交互带来重大变革”进行矢量化处理(请注意,该短语不在我们的原始语料库中)。
可以使用doc2bow 字典的方法为文档创建词袋表示法,该方法返回单词计数的稀疏表示法:
【注意,由于不在原始语料库中,所以有些词是无法转换的,也就说这个东东完全是依靠语料库的强大,是优点也是缺点】
每个元组中的第一个条目对应于字典中令牌的ID,第二个条目对应于此令牌的计数。
new_doc = "人机交互和人工智能带来重大变革"
segs_new = jieba.lcut(new_doc)
print(segs_new)
new_vec = dictionary.doc2bow(segs_new)
print(new_vec)
以上Doc2Bow产出的向量列表,可以作为一些分类算法/预测算法的/深度模型的输入数据
bow_corpus = [dictionary.doc2bow(text) for text in tokenized]
pprint.pprint(bow_corpus)
tf-idf模型将向量从词袋表示转换为向量空间,在该向量空间中,将根据语料库中每个词的相对稀有度对频率计数进行加权。
from gensim import models
# train the model
tfidf = models.TfidfModel(bow_corpus)
# transform the string
new_doc = "人机交互和机器智能、人工智能带来重大变革"
segs_new = jieba.lcut(new_doc)
# 去除停止词:略
print(segs_new)
"""
该tfidf模型再次返回一个元组列表,其中第一个条目是令牌ID,第二个条目是tf-idf权重。
"""
print(dictionary.doc2bow(segs_new))
print(tfidf[dictionary.doc2bow(segs_new)])
"""
要通过TfIdf转换整个语料并对其进行索引,以准备相似性查询:
"""
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[bow_corpus],num_features=len(dictionary))
"""
查询我们的查询文档query_document与语料库中某个文档的相似性:【一个文档就是一个句子】
"""
query_document = jieba.lcut("深度算法加速人工智能飞速的发展和应用。")
print(query_document)
query_bow = dictionary.doc2bow(query_document)
sims = index[tfidf[query_bow]]
print(list(enumerate(sims)))
# 按照相似度大小顺序排序
for document_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(document_number, score)