1.載入文檔
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import pandas as pd 5 import re 6 import jieba 7 from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer 8 9 10 #加載文本 11 dataPath1='D:/machinelearning data/crawlerData/mi6x_JD500.csv' 12 dataPath2='D:/machinelearning data/crawlerData/huaWei_P20_JD100.csv' 13 dataPath3='D:/machinelearning data/crawlerData/test1.txt' 14 stopWord_Path='D:/論文文件/學習文件/情感分析/dict詞典/哈工大stopword .txt'#停用詞路徑 15 f1=pd.read_csv(dataPath1,sep=',',encoding='GBK')#.iloc[:,1]#加載文本1 16 f2=pd.read_csv(dataPath2,sep=',',encoding='GBK')#.iloc[:,1]#加載文本2 17 f3=pd.read_csv(dataPath3,sep=',',encoding='GBK',header=0)#.iloc[:,1]#加載文本3
2.加載停用詞
把停用詞典的停用詞存到列表里,下面去停用詞要用到
1 #加載停用詞,停用詞要是列表形式才能使用 2 stopWord=[] 3 with open(stopWord_Path,'r',encoding='utf-8') as fr:#加載停用詞 4 for word in fr.readlines(): 5 stopWord.append(word.strip()) 6 #print(stopWord)
3.文本分詞
這里有兩個切分詞的函數,第一個是手動去停用詞,第二個是下面在CountVectorizer()添加stop_words參數去停用詞。兩種方法都可用。
1 #文本切分函數,用來對中文文本分詞,包括除去數字字母以及停用詞,得到一個分詞用空格隔開的字符串,便於下面向量化(因為這個CountVouterizer()是針對英文分詞的,英文之間直接用空格隔開的) 2 def cut_word(sent): 3 line=re.sub(r'[a-zA-Z0-9]*','',sent) 4 wordList=jieba.lcut(line,cut_all=False) 5 return ' '.join([word for word in wordList if word not in stopWord and len(word)>1])#文本分詞,並且用空格連接起來,便於下面向量化 6 7 #也是文本切分函數,只不過這個沒有去停用詞,CountVouterizer()中可以直接添加停用詞表參數,不統計文檔中的停用詞的數量 8 def cutword(sent): 9 line=re.sub(r'[a-zA-Z0-9]*','',sent) 10 wordList=jieba.lcut(line,cut_all=False) 11 return ' '.join([word for word in wordList if len(word)>1])
4.對文本進行分詞,向量化
(1)對文本進行分詞,並且將分詞結果加到'word_list’列中。
f3['word_list']=f3.comment.apply(cutword)#將文本分詞,並且分詞用空格隔開變成文本存才DataFrame中 print(f3)
結果如下
comment word_list
0 你好嗎,你的我的他的都不行,非常好,中國加油! 你好 不行 非常 中國 加油
1 真的非常好,你知道嗎,手機性能不行 真的 非常 知道 手機 性能 不行
2 昨天晚上下單,今早拿到機器。這物流很給力!電池不耐用,不優秀。嚴重發燙,希望小米后續優化跟進。 昨天晚上 下單 今早 拿到 機器 物流 電池 耐用 優秀 嚴重 發燙 希望 小米 后續 優化 跟進
(2)對文本向量化,sklearn中的CounterVectorizer()向量化為系數矩陣,文本必須是空格隔開的字符串,因為CounterVectorizer()是針對英文分詞的,英文之間直接用空格隔開的。
get_feature_names()獲得上面稀疏矩陣的列索引,即特征的名字(就是分詞)。這樣就能知道稀疏矩陣中的每一列表示的是哪個詞了
1 wordList=list(f3.word_list)#必須變成列表個是才能輸入下面的向量化函數 2 count_vect = CountVectorizer(min_df=1,stop_words=stopWord,analyzer ='word') # 並且設置了停用詞表為列表stopWord,即在向量化時去掉停用詞不統計,詞至少在1個文檔中出現過 3 words_vec = count_vect.fit_transform(wordList) 4 print(words_vec.toarray())#得到分詞的系數矩陣 5 #print(words_vec.todense()) 6 vec1=pd.DataFrame(words_vec.toarray()) 7 print(count_vect.get_feature_names())#獲得上面稀疏矩陣的列索引,即特征的名字(就是分詞)
向量化的結果
[[0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0] [1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1]]
(3)count_vect.get_feature_names()得到的分詞索引列表
['下單', '不行', '中國', '今早', '優化', '優秀', '你好', '加油', '發燙', '后續', '小米', '希望', '性能', '手機', '拿到', '昨天晚上', '機器', '物流', '電池', '真的', '耐用', '跟進']
對應上面的稀疏矩陣就是,第一列為‘下單’,在文檔1,2,3中分別出現0,0,1次。其他的同理
