本文章內容主要學習文字預處理的基本步驟及實現。
(1)讀入文字
(2)分詞
(3)建立詞典,將每乙個詞對映到乙個唯一的索引
(4)將文字從詞的序列轉換為索引的序列,方便輸入模型
此處用一部英文**,即h. g. well的time machine,作為示例,展示文字預處理的具體過程。
def read_time_machine():
with open('timemachine.txt', 'r') as f:#開啟文字
lines = [re.sub('[^a-z]+', ' ', line.strip().lower()) for line in f]
return lines
lines = read_time_machine()
print('# sentences %d' % len(lines))
# sentences 3583我們對每個句子進行分詞,也就是將乙個句子劃分成若干個詞(token),轉換為乙個詞的序列。
def tokenize(sentences, token='word'):
if token == 'word':
return [sentence.split(' ') for sentence in sentences]
elif token == 'char':
return [list(sentence) for sentence in sentences]
else:
print('error: unknow token type'+token)
tokens = tokenize(lines)
tokens[0:2]
輸出為了方便模型處理,我們需要將字串轉換為數字。因此我們需要先構建乙個字典(vocabulary),將每個詞對映到乙個唯一的索引編號。[[''],
['the',
'project',
'gutenberg',
'ebook',
'of',
'the',
'time',
'machine',
'by',
'h',
'g',
'wells']]
def count_corpus(sentences):
tokens = [tk for st in sentences for tk in st]
return collections.counter(tokens)
class vocab(object):
def __init__(self, tokens, min_freq = 0, use_special_tokens = false):
counter = count_corpus(tokens)
self.token_freqs = list(counter.items())
self.idx_to_token =
if use_special_tokens:
# padding, begin of sentence, end of sentence, unknown
self.pad, self.bos, self.eos, self.unk = (0,1,2,3)
self.id_to_token += ['', '', '', '']
else:
self.unk = 0
self.idx_to_token += ['']
self.idx_to_token += [token for token, freq in self.token_freqs
if freq >= min_freq and token not in self.idx_to_token]
self.token_to_idx = dict()
for idx, token in enumerate(self.idx_to_token):
self.token_to_idx[token] = idx
def __len__(self):
return len(self.idx_to_token)
def __getitem__(self, tokens):
if not isinstance(tokens, (list, tuple)):
return self.token_to_idx.get(tokens, self.unk)
return [self.__getitem__(token) for token in tokens]
def to_tokens(self, indices):
if not isinstance(indices, (list, tuple)):
return self.idx_to_token[indices]
return [self.idx_to_token[index] for index in indices]
vocab = vocab(tokens)
print(list(vocab.token_to_idx.items())[0:10])
[('', 0), ('the', 1), ('project', 2), ('gutenberg', 3), ('ebook', 4), ('of', 5), ('time', 6), ('machine', 7), ('by', 8), ('h', 9)]使用字典,我們可以將原文本中的句子從單詞序列轉換為索引序列
for i in range(8, 10):
print('words:', tokens[i])
print('indices:', vocab[tokens[i]])
words: ['']我們前面介紹的分詞方式非常簡單,它至少有以下幾個缺點:indices: [0]
words: ['title', 'the', 'time', 'machine']
indices: [41, 1, 6, 7]
標點符號通常可以提供語義資訊,但是我們的方法直接將其丟棄了
類似「shouldn't", "doesn't"這樣的詞會被錯誤地處理
類似"mr.", "dr."這樣的詞會被錯誤地處理
我們可以通過引入更複雜的規則來解決這些問題,但是事實上,有一些現有的工具可以很好地進行分詞,我們在這裡簡單介紹其中的兩個:spacy和nltk。
下面是乙個簡單的例子:
text = "mr. chen doesn't agree with my suggestion."
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)
print([token.text for token in doc])
from nltk.tokenize import word_tokenize
from nltk import data
print(word_tokenize(text))
參考: 文字預處理
常見預處理步驟,預處理通常包括四個步驟 讀入文字 分詞建立字典,將每個詞對映到乙個唯一的索引 index 將文字從詞的序列轉換為索引的序列,方便輸入模型 現有的工具可以很好地進行分詞,我們在這裡簡單介紹其中的兩個 spacy和nltk。text mr.chen doesn t agree with ...
線性回歸 文字預處理
線性回歸 1.模型 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 price warea area wage age bprice warea area wage age b...
文字語料預處理總結
import jieba import re eve list 測試 現power type check 依據bom和裝配圖,bom中沒有不用處理 記憶體問題反饋攻關組跟蹤 print list map lambda x re.sub s d a za z x eve list import jie...