NLP文本表示之實戰

在上一篇文章介紹了文本表示《NLP之文本表示》https://blog.csdn.net/Prepare...python

可是沒有代碼。在這篇博客中,咱們在實踐一下!git

中文分詞經常使用模型:Jieba模型、百度的LAC模型,這裏使用 Jieba 模型進行中文分詞。github

數據集使用:人民日報1946年05月的數據。數據集地址:https://github.com/fangj/rmrb/tree/master/example/1946年05月數組

Jieba模型:搜索引擎

Jieba 基本上目前最好的 Python 中文分詞組件,它主要有如下 3 種特性:spa

支持 3 種分詞模式:.net

  • 精確模式
    全模式
    搜索引擎模式
    支持繁體分詞
    支持自定義詞典

第一步:讀取全部文件,造成數據集corpuscode

def getCorpus(self, rootDir):
    corpus = []
    r1 = u'[a-zA-Z0-9’!"#$%&\'()*+,-./::;<=>?@,。?★、…【】《》?「」‘’![\\]^_`{|}~]+'  # 用戶也能夠在此進行自定義過濾字符
    for file in os.listdir(rootDir):
        path  = os.path.join(rootDir, file)
        if os.path.isfile(path):
            # 打印文件地址
            #print(os.path.abspath(path))
            # 獲取文章內容,fromfile主要用來處理數組 pass
            # filecontext = np.fromfile(os.path.abspath(path))
            with open(os.path.abspath(path), "r", encoding='utf-8') as file:
                filecontext = file.read();
                #print(filecontext)
                # 分詞 去掉符號
                filecontext = re.sub(r1, '', filecontext)
                filecontext = filecontext.replace("\n", '')
                filecontext = filecontext.replace(" ", '')
                seg_list = jieba.lcut_for_search(filecontext)
                corpus += seg_list
                #print(seg_list)
                #print("[精確模式]:" + "/".join(seg_list))
        elif os.path.isdir(path):
            TraversalFun.AllFiles(self, path)
    return corpus

一、循環讀取文件夾下的文件;blog

二、使用numpy讀取文件獲取文件內容;排序

三、去掉特殊符號,獲取中文內容;

四、使用Jieba分詞進行分詞,你們能夠嘗試各類方式。

第二步:計算信息熵

信息熵的公式:

img

#構造詞典,統計每一個詞的頻率,並計算信息熵
def calc_tf(corpus):
    #   統計每一個詞出現的頻率
    word_freq_dict = dict()
    for word in corpus:
        if word not in word_freq_dict:
            word_freq_dict[word] = 1
        word_freq_dict[word] += 1
    # 將這個詞典中的詞,按照出現次數排序,出現次數越高,排序越靠前
    word_freq_dict = sorted(word_freq_dict.items(), key=lambda x:x[1], reverse=True)
    # 計算TF機率
    word_tf = dict()
    # 信息熵
    shannoEnt = 0.0
    # 按照頻率,從高到低,開始遍歷,並未每一個詞構造一個id
    for word, freq in word_freq_dict:
        # 計算p(xi)
        prob = freq / len(corpus)
        word_tf[word] = prob
        shannoEnt -= prob*log(prob, 2)
    return word_tf, shannoEnt

思路:

一、循環,計算每一個詞的頻率,循環一個詞,若是有則加1,沒有則等於1

二、計算信息熵:按照公式循環計算信息熵。

結果:

數據集大小,size: 163039

信息熵:14.047837802885464

你們快動手嘗試一下吧

前路遙遙,你們加油~ 公衆號【prepared】

Jieba模型:https://github.com/fxsjy/jieba

源碼地址:https://github.com/zhongsb/NL...

相關文章
相關標籤/搜索