自然語言處理--中文文本向量化counterVectorizer()


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次。其他的同理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM