python自然語言處理(一)之中文分詞預處理、統計詞頻
阿新 • • 發佈:2019-01-08
一個小的嘗試。。
資料來源
資料集 一共200條關於手機的中文評論,以XML格式儲存。
分詞工具
python-jieba
預處理
包括去停用詞、去標點符號和數字
去停用詞:使用的是他人總結的 停用詞表
去標點符號和數字:用正則表示式。原本打算的是中文標點符號從網上覆制,英文標點符號用string.punctuation,但考慮到正則表示式中有些符號需要轉義,略麻煩,就直接粗暴地用字串表示了。
def filterWord(word):
stopwords = {}.fromkeys([ line.rstrip() for line in open('stopwords.txt')]);
punctuation = "\s+\.\!\/_,$%^*(+\"\'\{\}\=]+|[-【】《》、;+——!,。:?“、 [email protected]#¥%……&*()";
number = "0-9";
if(word in stopwords):
return "";
else:
word = re.sub("[%s%s]+" % (punctuation, number), "", word);
return word;
使用xml.etree解析XML檔案
資料格式如下:
<Reviews> <Review> <Sentences> <Sentence> <text> 這是一個例子 </text> </Sentence> …… </Sentences> </Review> …… </Reviews>
遍歷方式:
def loadFile(source_file): print("loading file:" + source_file); tree = xml.etree.cElementTree.parse(source_file); #解析檔案 root = tree.getroot(); #獲得elementTree的根節點 reviews = root.findall('Review'); #獲得根節點中所有標籤為‘Review’的子節點 for review in reviews: sentences = review.getchildren()[0]; #獲得Review節點的第一個子節點 for sentence in sentences: text = sentence.getchildren()[0].text; #獲得sentence節點的第一個子節點中的文字內容 word_list = jieba.lcut(text); #呼叫分詞工具進行分詞
對於分詞結果中的每一個詞進行預處理,即 filterWord。將預處理過的詞更新到詞頻字典中。【詞頻字典:以詞作為key,詞頻作為value】
輸出詞頻列表
按照詞頻倒序排列並輸出,而詞頻為dict中的value部分。可以通過sorted函式排序。
result = sorted(word_dict.items(), key = lambda d:d[1], reverse = True);
通過設定sorted函式中的key引數【這裡的lambda表示式可以看作是一個匿名函式,冒號左邊的部分為接收引數列表,冒號右邊的部分為函式返回值】,來實現排序。sorted預設升序。