1. 程式人生 > >python自然語言處理(一)之中文分詞預處理、統計詞頻

python自然語言處理(一)之中文分詞預處理、統計詞頻

一個小的嘗試。。

資料來源

資料集 一共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預設升序。