DataWhaleチームパンチ学習キャンプtask02-1

テキストの前処理

テキストは、シーケンスデータの種類、物品が文字または単語のシーケンスとみなすことができる場合、このセクションでは、一般に、4つの前処理工程を含む、テキストデータ、共通の前処理工程を説明:
1.読むテキスト
2ワード
3。辞書を確立する、各ワードは一意のインデックス(索引)にマッピングされる
シーケンスインデックス、便利な入力モデルに単語列から4テキスト

テキストを読み込み
、我々は、テキストの前処理の具体的なプロセスを表示するには、一例として、英語の小説、すなわちHGまあのタイムマシンを使用します。

import collections
import re

def read_time_machine():
    with open('/home/kesci/input/timemachine7163/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 3221

単語の
各文の我々の単語、単語(トークン)に分割されている文は、単語のシーケンスに変換されます。

def tokenize(sentences, token='word'):
    """Split sentences into word or char tokens"""
    if token == 'word':
        return [sentence.split(' ') for sentence in sentences]
    elif token == 'char':
        return [list(sentence) for sentence in sentences]
    else:
        print('ERROR: unkown token type '+token)

tokens = tokenize(lines)
tokens[0:2]

[、 'H'、 'G'、 'ウェル'、 ' 'によって' ''、 '時間'、 'マシン'、']、[ '']

辞書確立
処理モデルを容易にするために、我々は文字列を数値に変換する必要があります。だから我々は、辞書(語彙)を構築する必要があり、固有のインデックス番号に各単語をマッピングします。

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.idx_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]

def count_corpus(sentences):
    tokens = [tk for st in sentences for tk in st]
    return collections.Counter(tokens)  # 返回一个字典,记录每个词的出现次数

私たちは、コーパスとしてタイムマシンで辞書を構築しようたとえば、見てください。

vocab = Vocab(tokens)
print(list(vocab.token_to_idx.items())[0:10])
#[('', 0), ('the', 1), ('time', 2), ('machine', 3), ('by', 4), ('h', 5), ('g', 6), ('wells', 7), ('i', 8), ('traveller', 9)]

インデックスの単語
辞書には、我々は、シーケンスインデックスに単語列から文の元のテキストを変換することができます

for i in range(8, 10):
    print('words:', tokens[i])
    print('indices:', vocab[tokens[i]])

言葉:[「」、「時間」、「旅行」、「そう」、「それ」、「も」「う」、「便利」、「に」、「話す」「は」、 'の、 '彼'、 '']
インデックス:[1、2、9、10、11、12、13、14、15、16、17、18、19、0]
ワード:[ ''、 '' expoundingし、 ''、 '難解'、 '問題'、 'に'、 '私たち'、 '彼'、 'グレー'、 '目'、 '輝き'、 'と']
インデックス:[20、21、22、23 、24、16、25、26、27、28、29、30]

既存のツール使って単語分割
の方法は、先に述べた言葉は非常に簡単です、我々は、それは、少なくとも以下の欠点があります。

1。句読点は通常、意味情報を提供することができますが、我々はそれが直接捨てアプローチ
2は、同様の「いけない」、「しない 」 などA・ワードが正しく処理されるだろう
「ミスター」、「博士に似3. 「この言葉が誤って処理されます

私たちは、これらの問題のより複雑なルールを導入することによって解決することができるが、実際には、我々は簡単に概要それらの2、既存のツールの数は良い言葉することができありますスペイシーと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])

[ 'ミスター'、 '陳'、 'ない'、「ない」、 '私の'、 '提案' 'と'、 '同意' '']

NLTK:

from nltk.tokenize import word_tokenize
from nltk import data
data.path.append('/home/kesci/input/nltk_data3784/nltk_data')
print(word_tokenize(text))

[ 'ミスター'、 '陳'、 'ない'、「ない」、 '私の'、 '提案' 'と'、 '同意' '']

公開された31元の記事 ウォンの賞賛0 ビュー810

おすすめ

転載: blog.csdn.net/qq_44750620/article/details/104315337