代码实操
import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.feature_extraction.text import CountVectorizer text = ["今天 上 NLP 课程", "今天 的 课程 有 意思" , "数据 课程 也有 意思"] vocabulary = ["今天", "上" , "NLP", "课程", "的", "有", "意思", "数据", "也"] contv = CountVectorizer(vocabulary=vocabulary, stop_words=[], min_df=0, token_pattern='(?u)\\b\\w*\\w*\\b', lowercase=False) # 实例化 contv1 = contv.fit_transform(text) # 训练-传入数据 print(contv1) #调取结果 print(contv1.toarray()) print(contv.vocabulary_)
{'今天': 0, '上': 1, 'NLP': 2, '课程': 3, '的': 4, '有': 5, '意思': 6, '数据': 7, '也': 8} (0, 0) 1 (0, 1) 1 (0, 2) 1 (0, 3) 1 (1, 0) 1 (1, 3) 1 (1, 4) 1 (1, 5) 1 (1, 6) 1 (2, 3) 1 (2, 6) 1 (2, 7) 1 [[1 1 1 1 0 0 0 0 0] [1 0 0 1 1 1 1 0 0] [0 0 0 1 0 0 1 1 0]]
一般要设置的参数是:ngram_range,max_df,min_df,max_features等,具体情况具体分析
这里对参数进行一个详细的说明:
Word2Vec
它是一种语言模型,使用向量表示单词,向量空间表示句子。在将单词转化为向量之后,句子也就可以被表示成一个矩阵,这样就把现实中的语言成功转化成了数字。
它是一种词嵌入模型,简单来说,就是可以通过训练词嵌入模型将文本由原来的高维表示形式转化为低维表示形式,每一个维度代表着当前单词与其它单词在该维度下的不同,多个维度的数共同来表示这个单词。
word2vec是基于one-hot词向量进行的转化,one-hot是把每一个词都表示成(0,0,1,…,0,0,…)的形式,不仅在文字量巨大时会造成数据灾难,而且在多个词进行比较时效果一般。
Word2vec 的优缺点
优点:
由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
比之前的 Embedding方 法维度更少,所以速度更快
通用性很强,可以用在各种 NLP 任务中
缺点:
由于词和向量是一对一的关系,所以多义词的问题无法解决。
Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化
word2vec更多学到的是具备相似上下文的词,学习的向量和真正语义还有差距。比如 “他的技术水平很好”,“他的技术水平很差”相似度也很高。
所以在使用情感分析的时候,一般不是很推荐word2vec进行分析和研究
代码案例
from gensim.models import Word2Vec word2vec_model = Word2Vec(cutWords_list, vector_size=100, # 向量长度 epochs=10, # 训练批次 min_count=20 # 忽略词频数少于20的词 )
调用Word2Vec模型对象的wv.most_similar方法查看与摄影含义最相近的词。
- wv.most_similar方法有2个参数,第1个参数是要搜索的词,第2个关键字参数topn数据类型为正整数,是指需要列出多少个最相关的词汇,默认为10,即列出10个最相关的词汇。
- wv.most_similar方法返回值的数据类型为列表,列表中的每个元素的数据类型为元组,元组有2个元素,第1个元素为相关词汇,第2个元素为相关程度,数据类型为浮点型。
总结
如何将文本转换为数值矩阵,目前在自然语言处理当中有很多的方法,构建词向量,每一种的方法都有优缺点,我们在使用这类方法的时候,需要结合自己的实际情况进行比对,最终才能得到最佳的模型。