基于sklearn进行文本向量化
sklearn中,计数向量化用CountVectorizer,tfidf向量化用TfidfVectorizer:
import pickle from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer def test(vectorizer, word_bag, test_data): test_matrix = vectorizer.transform(test_data) print(test_matrix.shape) array = test_matrix.toarray() for rid in range(len(array)): print(test_data[rid], "\t", "".join(["(%s, %.5f)" % (word_bag[cid], array[rid][cid]) for cid in 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=["小明 来到 北京 天安门"])
- TfidfVectorizer初始化对象时可以指定归一化参数norm : 'l1', 'l2' or None, optional
- Countvectorizer和TfidfVectorizer在分token的时候,默认把长度<2的字符丢弃,如果要保留,可以指定token_pattern参数
- 默认由输入的文档决定词表,也可以指定vocabulary参数
vectorizer = CountVectorizer(token_pattern=r"\w+", vocabulary=all_features) # 保留长度小于2的token
样例运行结果:
[word_bag] 中国 北京 大厦 天安门 小明 来到 杭研 毕业 清华大学 硕士 科学院 网易 [vocabulary] {"小明": 4, "网易": 11, "杭研": 6, "毕业": 7, "北京": 1, "清华大学": 8, "来到": 5, "大厦": 2, "硕士": 9, "中国": 0, "天安门": 3, "科学院": 10} (4, 12) 我 来到 北京 清华大学 (中国, 0.00000)(北京, 0.30596)(大厦, 0.00000)(天安门, 0.00000)(小明, 0.00000)(来到, 0.30596)(杭研, 0.00000)(毕业, 0.00000)(清华大学, 0.38807)(硕士, 0.00000)(科学院, 0.00000)(网易, 0.00000) 他 来到 了 网易 杭研 大厦 (中国, 0.00000)(北京, 0.00000)(大厦, 0.26396)(天安门, 0.00000)(小明, 0.00000)(来到, 0.20811)(杭研, 0.26396)(毕业, 0.00000)(清华大学, 0.00000)(硕士, 0.00000)(科学院, 0.00000)(网易, 0.26396) 小明 硕士 毕业 与 中国 科学院 (中国, 0.20000)(北京, 0.00000)(大厦, 0.00000)(天安门, 0.00000)(小明, 0.20000)(来到, 0.00000)(杭研, 0.00000)(毕业, 0.20000)(清华大学, 0.00000)(硕士, 0.20000)(科学院, 0.20000)(网易, 0.00000) 我 爱 北京 天安门 (中国, 0.00000)(北京, 0.44084)(大厦, 0.00000)(天安门, 0.55916)(小明, 0.00000)(来到, 0.00000)(杭研, 0.00000)(毕业, 0.00000)(清华大学, 0.00000)(硕士, 0.00000)(科学院, 0.00000)(网易, 0.00000) (1, 12) 小明 来到 北京 天安门 (中国, 0.00000)(北京, 0.22042)(大厦, 0.00000)(天安门, 0.27958)(小明, 0.27958)(来到, 0.22042)(杭研, 0.00000)(毕业, 0.00000)(清华大学, 0.00000)(硕士, 0.00000)(科学院, 0.00000)(网易, 0.00000) save finished. (1, 12) 小明 来到 北京 天安门 (中国, 0.00000)(北京, 0.22042)(大厦, 0.00000)(天安门, 0.27958)(小明, 0.27958)(来到, 0.22042)(杭研, 0.00000)(毕业, 0.00000)(清华大学, 0.00000)(硕士, 0.00000)(科学院, 0.00000)(网易, 0.00000)
参考: