【NLP實戰】Task2:特徵處理

一、基本文本處理技能

1、分詞匹配方法

最大匹配法:最大匹配是指以詞典爲依據,取詞典中最長單詞爲第一個次取字數量的掃描串,在詞典中進行掃描(爲提升掃描效率,還可以跟據字數多少設計多個字典,然後根據字數分別從不同字典中進行掃描。下面以“我們在野生動物園玩”詳細說明一下這幾種匹配方法:

(1)正向最大匹配法

正向即從前往後取詞,從7->1,每次減一個字,直到詞典命中或剩下1個單字。
第1輪掃描:
第1次:“我們在野生動物”,掃描7字詞典,無
第2次:“我們在野生動”,掃描6字詞典,無
。。。。
第6次:“我們”,掃描2字詞典,有
掃描中止,輸出第1個詞爲“我們”,去除第1個詞後開始第2輪掃描,即:
第2輪掃描:
第1次:“在野生動物園玩”,掃描7字詞典,無
第2次:“在野生動物園”,掃描6字詞典,無
。。。。
第6次:“在野”,掃描2字詞典,有
掃描中止,輸出第2個詞爲“在野”,去除第2個詞後開始第3輪掃描,即:
第3輪掃描:
第1次:“生動物園玩”,掃描5字詞典,無
第2次:“生動物園”,掃描4字詞典,無
第3次:“生動物”,掃描3字詞典,無
第4次:“生動”,掃描2字詞典,有
掃描中止,輸出第3個詞爲“生動”,第4輪掃描,即:
第4輪掃描:
第1次:“物園玩”,掃描3字詞典,無
第2次:“物園”,掃描2字詞典,無
第3次:“物”,掃描1字詞典,無
掃描中止,輸出第4個詞爲“物”,非字典詞數加1,開始第5輪掃描,即:
第5輪掃描:
第1次:“園玩”,掃描2字詞典,無
第2次:“園”,掃描1字詞典,有
掃描中止,輸出第5個詞爲“園”,單字字典詞數加1,開始第6輪掃描,即:
第6輪掃描:
第1次:“玩”,掃描1字字典詞,有
掃描中止,輸出第6個詞爲“玩”,單字字典詞數加1,整體掃描結束。
正向最大匹配法,最終切分結果爲:“我們/在野/生動/物/園/玩”,其中,單字字典詞爲2,非詞典詞爲1。

(2)反向最大匹配法

逆向即從後往前取詞,其他邏輯和正向相同。即:
第1輪掃描:“在野生動物園玩”
第1次:“在野生動物園玩”,掃描7字詞典,無
第2次:“野生動物園玩”,掃描6字詞典,無
。。。。
第7次:“玩”,掃描1字詞典,有
掃描中止,輸出“玩”,單字字典詞加1,開始第2輪掃描
第2輪掃描:“們在野生動物園”
第1次:“們在野生動物園”,掃描7字詞典,無
第2次:“在野生動物園”,掃描6字詞典,無
第3次:“野生動物園”,掃描5字詞典,有
掃描中止,輸出“野生動物園”,開始第3輪掃描
第3輪掃描:“我們在”
第1次:“我們在”,掃描3字詞典,無
第2次:“們在”,掃描2字詞典,無
第3次:“在”,掃描1字詞典,有
掃描中止,輸出“在”,單字字典詞加1,開始第4輪掃描
第4輪掃描:“我們”
第1次:“我們”,掃描2字詞典,有
掃描中止,輸出“我們”,整體掃描結束。
逆向最大匹配法,最終切分結果爲:“我們/在/野生動物園/玩”,其中,單字字典詞爲2,非詞典詞爲0。

(3)雙向最大匹配法

正向最大匹配法和逆向最大匹配法,都有其侷限性,我舉得例子是正向最大匹配法侷限性的例子,逆向也同樣存在(如:長春藥店,逆向切分爲“長/春藥店”),因此有人又提出了雙向最大匹配法,雙向最大匹配法。即,兩種算法都切一遍,然後根據大顆粒度詞越多越好,非詞典詞和單字詞越少越好的原則,選取其中一種分詞結果輸出。
如:“我們在野生動物園玩”
正向最大匹配法,最終切分結果爲:“我們/在野/生動/物/園/玩”,其中,兩字詞3個,單字字典詞爲2,非詞典詞爲1。
逆向最大匹配法,最終切分結果爲:“我們/在/野生動物園/玩”,其中,五字詞1個,兩字詞1個,單字字典詞爲2,非詞典詞爲0。
非字典詞:正向(1)>逆向(0)(越少越好)
單字字典詞:正向(2)=逆向(2)(越少越好)
總詞數:正向(6)>逆向(4)(越少越好)
因此最終輸出爲逆向結果。

2、詞、字符頻率統計

二、語言模型

統計語言模型是一個單詞序列上的概率分佈,對於一個給定長度爲m的序列,它可以爲整個序列產生一個概率 P(w_1,w_2,…,w_m) 。其實就是想辦法找到一個概率分佈,它可以表示任意一個句子或序列出現的概率。

   目前在自然語言處理相關應用非常廣泛,如語音識別(speech recognition) , 機器翻譯(machine translation), 詞性標註(part-of-speech tagging), 句法分析(parsing)等。傳統方法主要是基於統計學模型,最近幾年基於神經網絡的語言模型也越來越成熟。

   常見的方法有n-gram模型方法、決策樹方法、最大熵模型方法、最大熵馬爾科夫模型方法、條件隨機域方法、神經網絡方法,等等。

1、unigram、bigram、trigram

  • unigram 一元分詞,把句子分成一個一個的漢字
  • bigram 二元分詞,把句子從頭到尾每兩個字組成一個詞語
  • trigram 三元分詞,把句子從頭到尾每三個字組成一個詞語

2、文本矩陣化

過程:
加載數據集->分詞->生成詞彙表->生成word_index->加載預訓練詞向量模型->生成詞向量矩陣

import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

# 讀取停用詞
def read_stopword(filename):
    stopword = []
    fp = open(filename, 'r')
    for line in fp.readlines():
        stopword.append(line.replace('\n', ''))
    fp.close()
    return stopword


# 切分數據,並刪除停用詞
def cut_data(data, stopword):
    words = []
    for content in data['content']:
        word = list(jieba.cut(content))
        for w in list(set(word) & set(stopword)):
            while w in word:
                word.remove(w)
        words.append(' '.join(word))
    data['content'] = words
    return data


# 獲取單詞列表
def word_list(data):
    all_word = []
    for word in data['content']:
        all_word.extend(word)
    all_word = list(set(all_word))
    return all_word


# 計算文本向量
def text_vec(data):
    count_vec = CountVectorizer(max_features=300, min_df=2)
    count_vec.fit_transform(data['content'])
    fea_vec = count_vec.transform(data['content']).toarray()
    return fea_vec


if __name__ == '__main__':
    data = pd.read_csv('./cnews/cnews.test.txt', names=['title', 'content'], sep='\t')  # (10000, 2)
    data = data.head(50)

    stopword = read_stopword('stopword.txt')
    data = cut_data(data, stopword)

    fea_vec = text_vec(data)
    print(fea_vec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章