基本概念
语料(Corpus):一组原始文本的集合,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。
向量(Vector):由一组文本特征构成的列表。是一段文本在Gensim中的内部表达。
稀疏向量(SparseVector):通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的元组
模型(Model):是一个抽象的术语。定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)。
(1)词带模型
'''
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(tokenized)
# 求并集
bag_of_words = [x for item in segs_1 for x in item if x not in punctuation]
# 去重
bag_of_words = list(set(bag_of_words))
print(bag_of_words)
bag_of_word2vec = []
for sentence in tokenized:
tokens = [1 if token in sentence else 0 for token in bag_of_words]
bag_of_word2vec.append(tokens)
#词带向量
print(bag_of_word2vec)
'''
gensim 代码
dictionary = corpora.Dictionary(tokenized)
print(dictionary)
print(dictionary.token2id)
corpus = [dictionary.doc2bow(sentence)for sentencein tokenized]
print(corpus)
(2)tf-idf 表示
import pickle
from sklearn.feature_extraction.textimport TfidfVectorizer, CountVectorizer
import json
def test(vectorizer, word_bag, test_data):
test_matrix = vectorizer.transform(test_data)
print(test_matrix.shape)
array = test_matrix.toarray()
for ridin range(len(array)):
print(test_data[rid], "\t", "".join(["(%s, %.5f)" % (word_bag[cid], array[rid][cid])for cidin range(len(word_bag))]))
def vectorize():
train_data = ["我 来到 北京 清华大学", "他 来到 了 网易 杭研 大厦", "小明 硕士 毕业 与 中国 科学院", "我 爱 北京 天安门"]
# vectorizer = CountVectorizer()
vectorizer = TfidfVectorizer(norm="l1")
vectorizer.fit(train_data)
# train_matrix = vectorizer.fit_transform(train_data)
word_bag = vectorizer.get_feature_names()
print("[word_bag] %s" %" ".join(word_bag))
print("[vocabulary] %s" % json.dumps(vectorizer.vocabulary_, ensure_ascii=False))
test(vectorizer, word_bag, test_data=train_data)
test(vectorizer, word_bag, test_data=["小明 来到 北京 天安门"])
file_name ="data/vectorizer.pkl"
pickle.dump(vectorizer, open(file_name, "w"), protocol=1)
tfidf_vectorizer = pickle.load(open(file_name, "r"))
test(tfidf_vectorizer, word_bag, test_data=["小明 来到 北京 天安门"])
vectorize()
(3)N-Grams模型
bv = CountVectorizer(ngram_range = (2,2))
bv_matrix = bv.fit_transform(norm_corpus)
bv_matrix = bv_matrix.toarray()
vocab = bv.get_feature_names()
pd.DataFrame(bv_matrix, columns=vocab)
(4)共现矩阵
importnumpyasnpimportpandasaspdimportjieba.analyseimportos# 获取关键词def Get_file_keywords(dir):try:formated_data=[]# 每篇文章关键词的二维数组set_key_list=[]# 所有关键词的列表fo=open('dic.txt','r',encoding='UTF-8')keywords=fo.read()forhome,dirs,filesinos.walk(dir):forfilenameinfiles:fullname=os.path.join(home,filename)f=open(fullname,'r',encoding='UTF-8')sentence=f.read()words=" ".join(jieba.analyse.extract_tags(sentence=sentence,topK=30,withWeight=False,allowPOS=('n')))# TF-IDF分词words=words.split(' ')formated_data.append(words)forwordinwords:ifwordinkeywords:set_key_list.append(word)else:words.remove(word)set_word=list(set(set_key_list))# 所有关键词的集合returnformated_data,set_wordexceptExceptionasreason:print('出现错误:',reason)# 初始化矩阵def build_matirx(set_word):edge=len(set_word)+1# 建立矩阵,矩阵的高度和宽度为关键词集合的长度+1'''matrix = np.zeros((edge, edge), dtype=str)'''# 另一种初始化方法matrix=[[''forjinrange(edge)]foriinrange(edge)]# 初始化矩阵matrix[0][1:]=np.array(set_word)matrix=list(map(list,zip(*matrix)))matrix[0][1:]=np.array(set_word)# 赋值矩阵的第一行与第一列returnmatrix# 计算各个关键词的共现次数def count_matrix(matrix, formated_data):forrowinrange(1,len(matrix)):# 遍历矩阵第一行,跳过下标为0的元素forcolinrange(1,len(matrix)):# 遍历矩阵第一列,跳过下标为0的元素# 实际上就是为了跳过matrix中下标为[0][0]的元素,因为[0][0]为空,不为关键词ifmatrix[0][row]==matrix[col][0]:# 如果取出的行关键词和取出的列关键词相同,则其对应的共现次数为0,即矩阵对角线为0matrix[col][row]=str(0)else:counter=0# 初始化计数器forechinformated_data:# 遍历格式化后的原始数据,让取出的行关键词和取出的列关键词进行组合,# 再放到每条原始数据中查询ifmatrix[0][row]inechandmatrix[col][0]inech:counter+=1else:continuematrix[col][row]=str(counter)returnmatrixdef main():formated_data,set_word=Get_file_keywords('D:\\untitled\\test')print(set_word)print(5244)print(formated_data)matrix=build_matirx(set_word)matrix=count_matrix(matrix,formated_data)data1=pd.DataFrame(matrix)data1.to_csv('data.csv',index=0,columns=None,encoding='utf_8_sig')main()
(2)word2vec
'''
from gensim.models import Word2Vec
import jieba
# 定义停用词、标点符号
punctuation = [",", "。", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
sentences = [
"长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称6300公里。流域总面积一百八十余万平方公里,年平均入海水量约九千六百余亿立方米。以干流长度和入海水量论,长江均居世界第三位。",
"黄河,中国古代也称河,发源于中华人民共和国青海省巴颜喀拉山脉,流经青海、四川、甘肃、宁夏、内蒙古、陕西、山西、河南、山东9个省区,最后于山东省东营垦利县注入渤海。干流河道全长5464千米,仅次于长江,为中国第二长河。黄河还是世界第五长河。",
"黄河,是中华民族的母亲河。作为中华文明的发祥地,维系炎黄子孙的血脉.是中华民族民族精神与民族情感的象征。",
"黄河被称为中华文明的母亲河。公元前2000多年华夏族在黄河领域的中原地区形成、繁衍。",
"在兰州的“黄河第一桥”内蒙古托克托县河口镇以上的黄河河段为黄河上游。",
"黄河上游根据河道特性的不同,又可分为河源段、峡谷段和冲积平原三部分。 ",
"黄河,是中华民族的母亲河。"
]
sentences = [jieba.lcut(sen) for sen in sentences]
tokenized = []
for sentence in sentences:
words = []
for word in sentence:
if word not in punctuation:
words.append(word)
tokenized.append(words)
model = Word2Vec(tokenized,sg=1, size=100, window=5, min_count=2, negative=1, sample=0.001, hs=1, workers=4)
model.save('model')
model = Word2Vec.load('model')
'''