(五)N-gram語言模型的資料處理
阿新 • • 發佈:2018-12-09
一、步驟
資料集說明:一段英文
(1)分詞:把原始的英文分詞,只保留詞之間的順序不變,多個句子也是看出整體進行分詞。
(2)統計詞頻:按照n元進行詞頻統計,比如“I love NLP I enjoy it”當n=2時候,可以劃分為(【I love】,【love NLP】,【NLP I】…),分別統計【I love】,【love NLP】等出現的次數。(在樸素貝葉斯中只是統計一個詞,這裡是統計n個前後關聯的詞)
(3)對統計好的詞進行大到小的排序,取m和詞作為特徵向量
其他步驟同文字分類步驟
二、程式碼
# -*- coding:utf-8 -*-
import urllib2
import re
import string
import operator
def cleanText(input):
input = re.sub('\n+', " ", input).lower() # 匹配換行,用空格替換換行符
input = re.sub('\[[0-9]*\]', "", input) # 剔除類似[1]這樣的引用標記
input = re.sub(' +', " ", input) # 把連續多個空格替換成一個空格
input = bytes(input) # .encode('utf-8') # 把內容轉換成utf-8格式以消除轉義字元
# input = input.decode("ascii", "ignore")
return input
def cleanInput(input):
input = cleanText(input)
cleanInput = []
input = input.split(' ') # 以空格為分隔符,返回列表
for item in input:
item = item.strip(string.punctuation) # string.punctuation獲取所有標點符號
if len(item) > 1 or (item.lower() == 'a' or item.lower() == 'i'):
cleanInput.append(item)
return cleanInput
def getNgrams(input, n):
#把一段英文處理成一個個詞語,保留了分詞後每個詞在原短文中的順序
input = cleanInput(input)
output = {} # 構造字典
for i in range(len(input) - n + 1):
ngramTemp = " ".join(input[i:i + n])
if ngramTemp not in output: # 詞頻統計
output[ngramTemp] = 0
output[ngramTemp] += 1
return output
# 獲取資料,content為一段英文
content = urllib2.urlopen(urllib2.Request("http://pythonscraping.com/files/inaugurationSpeech.txt")).read()
#2-grams
ngrams = getNgrams(content, 2)
sortedNGrams = sorted(ngrams.items(), key=operator.itemgetter(1), reverse=True) # =True 降序排列
print(sortedNGrams)