精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面向深度學習的文本預處理方法

譯文
人工智能 深度學習
如今,深度學習引起了人們極大的興趣,尤其是自然語言處理(NLP)。不久前,Kaggle公司開展一場自然語言處理(NLP)競賽,其名稱為“Quora不真誠問題挑戰(Quora Question insincerity Challenge)”。

[[432936]]

【51CTO.com快譯】如今,深度學習引起了人們極大的興趣,尤其是自然語言處理(NLP)。不久前,Kaggle公司開展一場自然語言處理(NLP)競賽,其名稱為“Quora不真誠問題挑戰(Quora Question insincerity Challenge)”。這個競賽指出解決文本分類問題,其目的是通過競賽以及Kaggle專家提供的寶貴內核,使其變得更容易理解。

首先從解釋競賽中的文本分類問題開始。

文本分類是自然語言處理中的一項常見任務,它將不確定長度的文本序列轉換為文本類別。那么文本分類有什么作用?可以:

  • 了解評論時的情緒
  • 在Facebook等平臺上查找有害評論
  • 在Quora上查找不真誠的問題,而目前Kaggle公司正在進行的一項競賽
  • 在網站上查找虛假評論
  • 確定文本廣告是否會被點擊

現在,這些問題都有一些共同點。而從機器學習的角度來看,這些問題本質上是相同的,只是目標標簽發生了變化,并沒有其他的變化。話雖如此,業務知識的添加可以幫助使這些模型更加健壯,這就是在預處理數據以進行測試分類時想要包含的內容。

雖然本文關注的預處理管道主要圍繞深度學習,但其中大部分也適用于傳統的機器學習模型。

首先,在完成所有步驟之前,先了解一下文本數據深度學習管道的流程,以便更進一步了解整個過程。

通常從清理文本數據和執行基本 事件驅動架構(EDA)開始。在這里,嘗試通過清理數據來提高數據質量。還嘗試通過刪除詞匯表外(OOV)的單詞來提高Word2Vec嵌入的質量。前兩個步驟之間通常沒有什么順序,并且通常在這兩個步驟之間來回切換。

接下來,為可以輸入深度學習模型的文本創建一個表示。然后開始創建模型并訓練它們。最后,在此使用適當的指標評估模型,并獲得領導者的批準以部署模型。如果這些術語現在沒有多大意義,那么不要擔心,可以嘗試通過本文闡述的過程來解釋它們。

在這里,先談談單詞嵌入。在為深度學習模型預處理數據時,就必須考慮一下。

Word2Vec嵌入入門

現在需要有一種方法來表示詞匯中的單詞。一種方法是使用one-hot編碼的單詞向量,但這并不是一個很好的選擇。其一個主要原因是one-hot單詞向量無法準確表達不同單詞之間的相似度,例如余弦相似度。

鑒于one-hot編碼向量的結構,不同單詞之間的相似度總是為0。另一個原因是,隨著詞匯量的增加,這些one-hot編碼向量變得非常大。

Word2Vec通過提供單詞的固定長度向量表示以及捕獲不同單詞之間的相似性和類比關系,克服了上述困難。

Word2vec單詞向量的學習方式允許學習不同的類比。它使人們能夠對以前不可能的單詞進行代數運算。例如:什么是國王——男人+女人?出來是女王。

Word2Vec向量也幫助找出單詞之間的相似性。如果試圖找到與“good”相似的詞,會發現awesome、great等。正是word2vec的這一特性使其對于文本分類非常寶貴。現在的深度學習網絡可以明白“good”和“great”本質上是含義相似的詞。

因此,簡單來說,word2vec為單詞創建向量。因此,對字典中的每個單詞都有一個d維向量。通常使用其他人在維基百科、推特等大型文本語料庫上訓練后提供的預訓練詞向量。最常用的預訓練詞向量是具有300維詞向量的Glove和Fasttext。而在這篇文章中將使用Glove。

文本數據的基本預處理技術

在大多數情況下,觀察到的文本數據并不完全干凈。來自不同來源的數據具有不同的特征,這使得文本預處理成為分類管道中最重要的步驟之一。

例如,來自Twitter的文本數據與Quora或某些新聞/博客平臺上的文本數據完全不同,因此需要區別對待。有用的是,將在本文中討論的技術對于在自然語言處理(NLP)中可能遇到的任何類型的數據都足夠通用。

(1)清除特殊字符和刪除標點符號

預處理管道很大程度上取決于將用于分類任務的word2vec嵌入。原則上,預處理應該與訓練詞嵌入之前使用的預處理相匹配。由于大多數嵌入不提供標點符號和其他特殊字符的向量值,因此要做的第一件事就是去除文本數據中的特殊字符。這些是Quora不真誠問題數據中存在的一些特殊字符,使用替換功能來擺脫這些特殊字符。

#將看到的所有文本分類方法都會用到的一些預處理。

Python

  1. 1 puncts = [',''.''"'':'')''(''-''!''?''|'';', "'", '$', '&', '/', '[', ']', '>', '%', '=', '#', '*', '+', '\\', '',  '~', '@', '£',  '·', '_', '{', '}', '©', '^', '®', '`',  '<', '', '°', '', '', '',  '', '', '×', '§', '', '', ' ', '', '½', 'à', '',  '', '', '', '', '', 'â', '', '', '¢', '²', '¬', '', '', '', '±', '¿', '', '', '¦', '', '', '¥', '', '', '', '',  '', '', '¼', '', '', '', '', '', '', '', '¨', '', '', '', 'é', '¯', '', '¤', '', 'è', '¸', '¾', 'Ã', '', '', '',  '', '', '', '', '', '', '»', '', '', '', '', '³', '', '', '', '', '', '', '', 'ï', 'Ø', '¹', '', '', '√', 

Python

  1. 1def clean_text(x):    x = str(x)    for punct in puncts:        if punct in x:            x = x.replace(punct, '')    return  

這也可以在一個簡單的正則表達式的幫助下完成。但是人們通常喜歡上述做事方式,因為它有助于理解從數據中刪除的字符類型。

Python

  1. 1def clean_numbers(x):    if bool(re.search(r'\d', x)):        x = re.sub('[0-9]{5,}''#####', x)        x = re.sub('[0-9]{4}''####', x)        x = re.sub('[0-9]{3}''###', x)        x = re.sub('[0-9]{2}''##', x)    return x 

(2)清除數字

為什么要用#s替換數字?因為大多數嵌入都像這樣預處理了它們的文本。

Python小技巧:在下面的代碼中使用if語句來預先檢查文本中是否存在數字。就像if總是比re.sub命令快,而且大部分文本都不包含數字。

Python

  1. 1 def clean_numbers(x):    if bool(re.search(r'\d', x)):    x = re.sub('[0-9]{5,}''#####', x)         

(3)刪除拼寫錯誤

找出數據中的拼寫錯誤總是有幫助的。由于word2vec中不存在這些詞的嵌入,應該用正確的拼寫替換單詞以獲得更好的嵌入覆蓋率。

以下代碼工件是對Peter Norvig的拼寫檢查器的改編。它使用單詞的word2vec排序來近似單詞概率,因為谷歌word2vec顯然在訓練語料庫中按照頻率降序排列單詞。可以使用它來找出擁有的數據中的一些拼寫錯誤的單詞。

以下是來自Quora問題相似性挑戰中的CPMP腳本。

Python

  1. 1 import re from collections import Counter import gensim import heapq from operator import itemgetter from multiprocessing import Pool  
  2. 2model = gensim.models.KeyedVectors.load_word2vec_format('../input/embeddings/GoogleNews-vectors-negative300/GoogleNews-vectors-negative300.bin',                                                         binary=True) words = model.index2word  
  3. 3 w_rank = {} for i,word in enumerate(words):    w_rank[word] = i  
  4. 4 WORDS = w_rank  
  5. 5 def words(text): return re.findall(r'\w+', text.lower())  
  6. 6 def P(word):     "Probability of `word`."    # use inverse of rank as proxy    # returns 0 if the word isn't in the dictionary    return - WORDS.get(word, 0)  
  7. 7 def correction(word):     "Most probable spelling correction for word."    return max(candidates(word), key=P)  
  8. 8 def candidates(word):     "Generate possible spelling corrections for word."    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])  
  9. 9 def known(words):     "The subset of `words` that appear in the dictionary of WORDS."    return set(w for w in words if w in WORDS)  
  10. 10 def edits1(word):    "All edits that are one edit away from `word`."    letters    = 'abcdefghijklmnopqrstuvwxyz'    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)]    deletes    = [L + R[1:]               for L, R in splits if R]    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters]    inserts    = [L + c + R               for L, R in splits for c in letters]    return set(deletes + transposes + replaces + inserts)  
  11. 11 def edits2(word):     "All edits that are two edits away from `word`."    return (e2 for e1 in edits1(word) for e2 in edits1(e1))  
  12. 12 def build_vocab(texts):    sentences = texts.apply(lambda x: x.split()).values    vocab = {}    for sentence in sentences:        for word in sentence:            try:                vocab[word] += 1            except KeyError:                vocab[word] = 1    return vocab  
  13. 13 vocab = build_vocab(train.question_text)  
  14. 14 top_90k_words = dict(heapq.nlargest(90000, vocab.items(), key=itemgetter(1)))  
  15. 15 pool = Pool(4) corrected_words = pool.map(correction,list(top_90k_words.keys()))  
  16. 16 for word,corrected_word in zip(top_90k_words,corrected_words):    if word!=corrected_word:        print 

一旦完成了查找拼寫錯誤的數據,接下來要做的就是使用拼寫錯誤映射和正則表達式函數來替換它們。

Python

  1. 1 mispell_dict = {'colour''color''centre''center''favourite''favorite''travelling''traveling''counselling''counseling''theatre''theater''cancelled''canceled''labour''labor''organisation''organization''wwii''world war 2''citicise''criticize''youtu ''youtube ''Qoura''Quora''sallary''salary''Whta''What''narcisist''narcissist''howdo''how do''whatare''what are''howcan''how can''howmuch''how much''howmany''how many''whydo''why do''doI''do I''theBest''the best''howdoes''how does''mastrubation''masturbation''mastrubate''masturbate'"mastrubating"'masturbating''pennis''penis''Etherium''Ethereum''narcissit''narcissist''bigdata''big data''2k17''2017''2k18''2018''qouta''quota''exboyfriend''ex boyfriend''airhostess''air hostess'"whst"'what''watsapp''whatsapp''demonitisation''demonetization''demonitization''demonetization''demonetisation''demonetization' 

Python

  1. 1def _get_mispell(mispell_dict):    mispell_re = re.compile('(%s)' % '|'.join(mispell_dict.keys()))    return mispell_dict, mispell_re  
  2. 2 mispellings, mispellings_re = _get_mispell(mispell_dict) def replace_typical_misspell(text):    def replace(match):       return mispellings[match.group(0)]    return mispellings_re.sub(replace, text)  
  3. 3 # Usage replace_typical_misspell("Whta is demonitisation")  

(4)消除縮略語

縮略語是采用撇號書寫的單詞。縮略語的例子是“ain’t”或“aren’t”。因為想標準化文本,所以擴展這些縮略語是有意義的。下面使用壓縮映射和正則表達式函數完成這項工作。

Python

  1. 1 contraction_dict = {"ain't""is not""aren't""are not","can't""cannot""'cause""because""could've""could have""couldn't""could not""didn't""did not",  "doesn't""does not""don't""do not""hadn't""had not""hasn't""has not""haven't""have not""he'd""he would","he'll""he will""he's""he is""how'd""how did""how'd'y""how do you""how'll""how will""how's""how is",  "I'd""I would""I'd've""I would have""I'll""I will""I'll've""I will have","I'm""I am""I've""I have""i'd""i would""i'd've""i would have""i'll""i will",  "i'll've""i will have","i'm""i am""i've""i have""isn't""is not""it'd""it would""it'd've""it would have""it'll""it will""it'll've""it will have","it's""it is""let's""let us""ma'am""madam""mayn't""may not""might've""might have","mightn't""might not","mightn't've""might not have""must've""must have""mustn't""must not""mustn't've""must not have""needn't""need not""needn't've""need not have","o'clock""of the clock""oughtn't""ought not""oughtn't've""ought not have""shan't""shall not""sha'n't""shall not""shan't've""shall not have""she'd""she would""she'd've""she would have""she'll""she will""she'll've""she will have""she's""she is""should've""should have""shouldn't""should not""shouldn't've""should not have""so've""so have","so's""so as""this's""this is","that'd""that would""that'd've""that would have""that's""that is""there'd""there would""there'd've""there would have""there's""there is""here's""here is","they'd""they would""they'd've""they would have""they'll""they will""they'll've""they will have""they're""they are""they've""they have""to've""to have""wasn't""was not""we'd""we would""we'd've""we would have""we'll""we will""we'll've""we will have""we're""we are""we've""we have""weren't""were not""what'll""what will""what'll've""what will have""what're""what are",  "what's""what is""what've""what have""when's""when is""when've""when have""where'd""where did""where's""where is""where've""where have""who'll""who will""who'll've""who will have""who's""who is""who've""who have""why's""why is""why've""why have""will've""will have""won't""will not""won't've""will not have""would've""would have""wouldn't""would not""wouldn't've""would not have""y'all""you all""y'all'd""you all would","y'all'd've""you all would have","y'all're""you all are","y'all've""you all have","you'd""you would""you'd've""you would have""you'll""you will""you'll've""you will have""you're""you are""you've""you have"

Python

  1. 1 def _get_contractions(contraction_dict):    contraction_re = re.compile('(%s)' % '|'.join(contraction_dict.keys()))    return contraction_dict, contraction_re  
  2. 2 contractions, contractions_re = _get_contractions(contraction_dict)  
  3. 3 def replace_contractions(text):    def replace(match):        return contractions[match.group(0)]    return contractions_re.sub(replace, text)  
  4. 4 # Usage replace_contractions("this's a text with contraction"

除了上述技術外,還有其他文本預處理技術,如詞干提取、詞形還原和停用詞去除。由于這些技術不與深度學習NLP模型一起使用,在這里不會討論它們。

表示:序列創建

使深度學習成為自然語言處理(NLP)的“go-to”選擇的原因之一是,實際上不必從文本數據中人工設計特征。深度學習算法將一系列文本作為輸入,像人類一樣學習文本結構。由于機器不能理解單詞,因此它們期望以數字形式提供數據。所以想將文本數據表示為一系列數字。

要了解這是如何完成的,需要對Keras Tokenizer功能有所了解。可以使用任何其他分詞器,但Keras分詞器是一種流行的選擇。

(1)標記器

簡單來說,標記器(tokenizer)是一個將句子拆分成單詞的實用函數。keras.preprocessing.text.Tokenizer將文本標記(拆分)為標記(單詞),同時僅保留文本語料庫中出現次數最多的單詞。

Python

  1. 1#Signature: Tokenizer(num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n'lower=True, split=' ', char_level=False, oov_token=None, document_count=0, **kwargs) 

num_words參數僅在文本中保留預先指定的單詞數。這很有幫助,因為不希望這個模型通過考慮很少出現的單詞而產生大量噪音。在現實世界的數據中,使用num_words參數留下的大多數單詞通常是拼寫錯誤的。在默認情況下,標記器還會過濾一些不需要的標記并將文本轉換為小寫。

一旦適合數據的標記器還會保留一個單詞索引(可以用來為單詞分配唯一編號的單詞字典),可以通過以下方式訪問它:

  1. tokenizer.word_index 

索引字典中的單詞按頻率排序。

所以使用標記器的整個代碼如下:

Python

  1. from keras.preprocessing.text import Tokenizer ## Tokenize the sentences tokenizer = Tokenizer(num_words=max_features) tokenizer.fit_on_texts(list(train_X)+list(test_X)) train_X = tokenizer.texts_to_sequences(train_X) test_X = tokenizer.texts_to_sequences(test_X) 

其中train_X和test_X是語料庫中的文檔列表。

(2)序列預處理

通常模型期望每個序列(每個訓練示例)具有相同的長度(相同數量的單詞/標記)。可以使用maxlen參數來控制它。

例如:

Python

  1. train_X = pad_sequences(train_X, maxlen=maxlen) test_X = pad_sequences(test_X, maxlen=maxlen) 

現在訓練數據包含一個數字列表。每個列表具有相同的長度。還有word_index,它是文本語料庫中出現次數最多的單詞的字典。

(3)嵌入富集

如上所述,將使用GLoVE Word2Vec嵌入來解釋富集。GLoVE預訓練向量在維基百科語料庫上進行訓練。

這意味著數據中可能出現的某些詞可能不會出現在嵌入中。那么怎么處理呢?先加載Glove Embeddings。

Python

  1. 1 def load_glove_index():    EMBEDDING_FILE = '../input/embeddings/glove.840B.300d/glove.840B.300d.txt'    def get_coefs(word,*arr): return word, np.asarray(arr, dtype='float32')[:300]    embeddings_index = dict(get_coefs(*o.split(" ")) for o in open(EMBEDDING_FILE))    return embeddings_index  
  2. 2 glove_embedding_index = load_glove_index() 

確保將下載這些GLoVE向量的文件夾的路徑。

這個glove_embedding_index包含什么?它只是一個字典,其中鍵是詞,值是詞向量,而一個長度為300的np.array,其字典的長度大約是10億。由于只需要word_index中單詞的嵌入,將創建一個只包含所需嵌入的矩陣。

Python

  1. 1 def create_glove(word_index,embeddings_index):    emb_mean,emb_std = -0.005838499,0.48782197    all_embs = np.stack(embeddings_index.values())    embed_size = all_embs.shape[1]    nb_words = min(max_features, len(word_index))    embedding_matrix = np.random.normal(emb_mean, emb_std, (nb_words, embed_size))    count_found = nb_words    for word, i in tqdm(word_index.items()):       if i >= max_features: continue       embedding_vector = embeddings_index.get(word)       if embedding_vector is not None:             embedding_matrix[i] =  embedding_vector       else:                count_found-=1    print("Got embedding for ",count_found," words.")    return embedding_matrix 

上面的代碼工作正常,但有沒有一種方法可以讓利用GLoVE中的預處理來發揮優勢?

是的。在為glove進行預處理時,創作者沒有將單詞轉換為小寫。這意味著它包含“USA”、“usa”和“Usa”等單詞的多種變體。這也意味著在某些情況下,雖然存在像“Word”這樣的單詞,但不存在小寫形式的類似物,即“word”。

在這里可以通過使用下面的代碼來解決這種情況。

Python

  1. 1 def create_glove(word_index,embeddings_index):    emb_mean,emb_std = -0.005838499,0.48782197    all_embs = np.stack(embeddings_index.values())    embed_size = all_embs.shape[1]    nb_words = min(max_features, len(word_index))    embedding_matrix = np.random.normal(emb_mean, emb_std, (nb_words, embed_size))     count_found = nb_words    for word, i in tqdm(word_index.items()):        if i >= max_features: continue        embedding_vector = embeddings_index.get(word)        if embedding_vector is not None:             embedding_matrix[i] =  embedding_vector        else:            if word.islower():                # try to get the embedding of word in titlecase if lowercase is not present                embedding_vector = embeddings_index.get(word.capitalize())                if embedding_vector is not None:                     embedding_matrix[i] = embedding_vector                else:                    count_found-=1            else:                count_found-=1    print("Got embedding for ",count_found," words.")    return embedding_matrix 

上面只是一個例子,說明如何利用嵌入知識來獲得更好的覆蓋率。有時,根據問題的不同,人們還可以通過使用一些領域知識和自然語言處理(NLP)技能向嵌入中添加額外信息來獲得價值。

例如,可以通過在Python中的TextBlob包中添加單詞的極性和主觀性,向嵌入本身添加外部知識。

Python

  1. from textblob import TextBlob word_sent = TextBlob("good").sentiment print(word_sent.polarity,word_sent.subjectivity) # 0.7 0.6 

可以使用TextBlob獲取任何單詞的極性和主觀性。因此,可以嘗試將這些額外信息添加到嵌入中。

Python

  1. 1 def create_glove(word_index,embeddings_index):    emb_mean,emb_std = -0.005838499,0.48782197    all_embs = np.stack(embeddings_index.values())    embed_size = all_embs.shape[1]    nb_words = min(max_features, len(word_index))    embedding_matrix = np.random.normal(emb_mean, emb_std, (nb_words, embed_size+4))        count_found = nb_words    for word, i in tqdm(word_index.items()):        if i >= max_features: continue        embedding_vector = embeddings_index.get(word)        word_sent = TextBlob(word).sentiment        # Extra information we are passing to our embeddings        extra_embed = [word_sent.polarity,word_sent.subjectivity]        if embedding_vector is not None:             embedding_matrix[i] =  np.append(embedding_vector,extra_embed)        else:            if word.islower():                embedding_vector = embeddings_index.get(word.capitalize())                if embedding_vector is not None:                     embedding_matrix[i] = np.append(embedding_vector,extra_embed)                else:                    embedding_matrix[i,300:] = extra_embed                    count_found-=1            else:                embedding_matrix[i,300:] = extra_embed                count_found-=1    print("Got embedding for ",count_found," words.")    return embedding_matrix 

工程嵌入是在后期從深度學習模型中獲得更好性能的重要組成部分。通常,會在項目階段多次重新訪問這部分代碼,同時嘗試進一步改進的模型。在這里可以展示很多創造力,以提高對word_index的覆蓋率,并在嵌入中包含額外的功能。

更多工程特性

嵌入矩陣的文本預處理方法

人們總是可以添加句子特定的特征,如句子長度、唯一詞的數量等,作為另一個輸入層,為深度神經網絡提供額外的信息。

例如,創建了這些額外的特征,作為Quora Insincerity分類挑戰的特征工程管道的一部分。

Python

  1. 1 def add_features(df):    df['question_text'] = df['question_text'].progress_apply(lambda x:str(x))    df["lower_question_text"] = df["question_text"].apply(lambda x: x.lower())    df['total_length'] = df['question_text'].progress_apply(len)    df['capitals'] = df['question_text'].progress_apply(lambda comment: sum(1 for c in comment if c.isupper()))    df['caps_vs_length'] = df.progress_apply(lambda row: float(row['capitals'])/float(row['total_length']),                                axis=1)    df['num_words'] = df.question_text.str.count('\S+')    df['num_unique_words'] = df['question_text'].progress_apply(lambda comment: len(set(w for w in comment.split())))    df['words_vs_unique'] = df['num_unique_words'] / df['num_words']     return df 

結論

自然語言處理(NLP)在深度學習領域仍然是一個非常有趣的問題,因此希望更多的人進行大量的實驗,看看哪些有效,哪些無效。而試圖為任何自然語言處理(NLP)問題的深度學習神經網絡的預處理步驟可以提供有益的視角。

原文標題:Text Preprocessing Methods for Deep Learning,作者:Kevin Vu

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:華軒 來源: 51CTO
相關推薦

2018-04-04 10:19:32

深度學習

2024-01-31 08:09:53

預處理器代碼C++

2020-12-23 11:08:10

Python代碼文本

2021-03-28 08:57:57

Python 文本數據

2024-12-20 13:00:00

Python文本清洗預處理

2020-11-06 17:20:14

PythonBAT代碼

2019-11-14 21:21:50

數據挖掘數據處理數據分析

2021-10-28 09:00:00

深度學習人工智能技術

2017-08-24 09:35:06

深度學習向量化Hash Trick

2023-05-26 08:39:44

深度學習Alluxio

2017-08-03 16:20:42

深度學習文本摘要遞歸神經網絡

2021-11-12 15:16:32

深度學習數據合成人工智能

2011-08-04 10:38:17

Objective-C 預處理程序

2017-05-02 08:40:36

機器學習預處理整理

2017-04-29 10:16:14

機器學習數據清洗數據整理

2024-05-17 13:17:39

2025-03-07 08:00:00

數據數據集集神經網絡數據預處理

2015-06-17 14:28:15

Java查詢處理方法

2020-04-29 16:49:33

機器學習人工智能計算機

2022-08-30 09:24:47

數據算法
點贊
收藏

51CTO技術棧公眾號

日韩网站在线| 国产中文在线播放| 激情丁香综合五月| 九九热r在线视频精品| 欧美一级片在线免费观看| 成人三级小说| 中文字幕av不卡| 99久久精品免费看国产一区二区三区| 日韩少妇高潮抽搐| 欧美成人精品一区二区三区在线看| 7777精品伊人久久久大香线蕉的| 岛国大片在线播放| 欧美精品日韩少妇| gogo大胆日本视频一区| 国产精品亚洲综合天堂夜夜| 男人的天堂久久久| 亚洲免费成人av在线| 制服丝袜亚洲播放| av动漫免费看| 在线午夜影院| 日本一区二区动态图| 成人欧美一区二区三区视频| 最近中文字幕在线观看视频| 伊人久久亚洲影院| 久久久久www| 人妻精品久久久久中文| 国产成人在线中文字幕| 在线观看91精品国产麻豆| 久久久久久久久久久久久久国产| 国产黄大片在线观看画质优化| 91免费看视频| 动漫精品视频| 国产美女精品视频国产| 日韩精品一级二级| 蜜桃在线一区| 精品日本高清在线播放| 色中文字幕在线观看| 激情小视频在线观看| 高清国产一区二区| 91在线观看免费网站| 涩涩视频在线观看| 老司机久久99久久精品播放免费| 欧美激情国产精品| 九九视频免费在线观看| 久久精品国产99久久| 亚洲一二在线观看| 久久成人激情视频| 亚洲动漫精品| 亚洲欧美成人网| 中文字幕在线观看网址| 久久九九热re6这里有精品| 日韩美女在线视频| 91香蕉视频免费看| 精品国产乱码久久久久久樱花| 欧美日韩精品一区二区在线播放 | 欧美日韩99| 欧美成在线视频| 欧美色图一区二区| 国产一区二区三区自拍| 高清一区二区三区四区五区| 在线看成人av| 国产精品日韩精品欧美精品| 69精品小视频| 国产性生活视频| 日韩精品每日更新| 国产美女主播一区| 国产露脸国语对白在线| 国产一区二区三区av电影| 亚洲精品日产aⅴ| 亚洲国产999| av午夜精品一区二区三区| 国内不卡一区二区三区| 日本在线一二三| 国产欧美一区二区精品秋霞影院 | 91黄视频在线| 午夜免费看视频| 日本一区二区三区视频在线看| 精品三级av在线| 久久久久久久久免费看无码| 免费久久精品| 久久夜色精品国产亚洲aⅴ| 欧美成人精品欧美一| 亚洲国产精品一区| 国产成人中文字幕| 精品国自产在线观看| 99热99精品| 亚洲精品在线免费看| 国产精品va在线观看视色 | 成年人视频网站免费| 国产免费拔擦拔擦8x在线播放| 欧美视频二区36p| av网站在线不卡| 亚洲图色一区二区三区| 亚洲黄一区二区| 91无套直看片红桃在线观看| 欧美午夜视频| 国产精品视频精品| 成人毛片在线精品国产| 亚洲国产精品黑人久久久| 9191国产视频| 欧美日韩免费看片| 日韩女优电影在线观看| 久久久久久亚洲中文字幕无码| 99精品美女| 欧美中文字幕在线播放| 国产情侣在线播放| 久久久一区二区三区捆绑**| 精品一区二区成人免费视频| 樱桃视频成人在线观看| 日韩一区二区免费在线电影| 一区二区黄色片| 国内精品久久久久久久影视蜜臀| 国产成人在线一区| 日韩一级在线播放| 亚洲色图都市小说| 久久久免费视频网站| 一区中文字幕电影| 少妇久久久久久| 福利网址在线观看| av一区二区三区四区| 精品一区二区成人免费视频 | 精品无码国产污污污免费网站| 欧美成人久久| 国产日韩在线看片| 国产三级视频在线播放线观看| 亚洲午夜久久久久久久久电影网 | eeuss国产一区二区三区四区| 最近2019年日本中文免费字幕| 欧美不卡视频在线观看| 国产精品资源在线| 亚洲永久一区二区三区在线| 欧美舌奴丨vk视频| 亚洲精品一区在线观看香蕉| 国产精品第一页在线观看| 国产久卡久卡久卡久卡视频精品| 亚洲国产精品一区在线观看不卡 | 久久久久久自在自线| 国产成人亚洲欧美| 香蕉成人app免费看片| 69堂成人精品免费视频| 成人午夜免费影院| 人人爽香蕉精品| 日韩欧美亚洲v片| 忘忧草在线www成人影院| 亚洲精品久久久久久久久久久久久 | 国产精品久久欧美久久一区| 国产精品污网站| 性生交免费视频| 国产一区二区三区站长工具| 97视频在线观看免费高清完整版在线观看 | 欧洲亚洲一区二区三区四区五区| 成人黄色动漫| 亚洲黄色在线看| 精品免费囯产一区二区三区| 97久久精品人人爽人人爽蜜臀| 国产精品久久..4399| 国产精品45p| 国内免费精品永久在线视频| 香蕉视频免费在线看| 精品久久香蕉国产线看观看gif| 免费黄色三级网站| 久久影院亚洲| 亚洲欧美日韩国产成人综合一二三区| 在线成人视屏| 精品精品国产国产自在线| 国产伦一区二区| 一区二区三区毛片| 中文字幕人妻一区二区三区| 国产日韩免费| 深夜福利成人| 国产专区精品| 97视频在线观看免费| 国产理论电影在线观看| 欧美日韩一二三区| 国产中文字幕久久| 国产精品一卡二| 妞干网在线观看视频| 自拍视频一区| 91欧美视频网站| 91九色美女在线视频| 亚洲美女www午夜| 亚洲网站免费观看| 亚洲香肠在线观看| 国产三级av在线播放| 精品无码三级在线观看视频| 大荫蒂性生交片| 国产日产精品一区二区三区四区的观看方式 | 一道本在线视频| 亚洲图片欧美色图| 国产三级av在线播放| 国产在线精品一区二区| 蜜桃传媒一区二区三区| 久久精品播放| 国外成人在线视频网站| 欧美激情三区| 91国产精品电影| 黄色片网站在线观看| 精品一区二区三区四区| 国产精品久久久久久久久久久久久久久久| 一区av在线播放| 国产三级黄色片| 99久久久国产精品| 不卡的在线视频| 亚洲永久在线| 超碰人人爱人人| 郴州新闻综合频道在线直播| 国产欧美日韩视频一区二区三区| 国产成人福利夜色影视| 亚洲2020天天堂在线观看| 尤物视频在线免费观看| 日韩va亚洲va欧洲va国产| 国产亲伦免费视频播放| 91极品美女在线| 在线看成人av| 一个色在线综合| 成年人免费视频播放| 久久只精品国产| 日本少妇xxxx| 丁香啪啪综合成人亚洲小说| 亚洲午夜精品一区| 免费一级片91| 丰满人妻中伦妇伦精品app| 合欧美一区二区三区| 亚洲永久激情精品| 精品视频日韩| 青青草原成人| 伊人久久大香线蕉| 玖玖玖精品中文字幕| 果冻天美麻豆一区二区国产| 5566av亚洲| 久久9999免费视频| 91视频免费在线| 亚洲欧美综合久久久久久v动漫| 日韩av手机在线| 欧美电影免费看| 欧美中文字幕视频在线观看| 毛片在线网站| 91av福利视频| 老色鬼在线视频| 国内精品久久久久| ****av在线网毛片| 久久免费少妇高潮久久精品99| 超碰在线网址| 欧美精品在线观看| 欧美人与性动交α欧美精品济南到 | 不卡视频一区二区三区| 久久久久毛片免费观看| 91在线观看免费观看 | 手机av在线| 国产91ⅴ在线精品免费观看| 日本不良网站在线观看| 2019中文字幕在线免费观看| 一本大道色婷婷在线| 97人人做人人爱| 中文av在线全新| 国产精品h片在线播放| 你懂得影院夜精品a| 国产精品普通话| 国产成人免费av一区二区午夜| 国产在线视频91| 精品国产一级| 国产精品免费在线| 希岛爱理av免费一区二区| 欧美日韩中文国产一区发布| 精品日产免费二区日产免费二区| 亚洲欧洲日韩精品| 欧美激情视频一区二区三区在线播放 | 少妇视频一区二区| 亚洲视频1区2区| 精品少妇一二三区| 日韩欧美国产高清91| 国产精品第6页| 这里只有精品免费| 国模人体一区二区| 亚洲精选在线观看| 午夜视频在线观看网站| 欧美激情一区二区三区高清视频| 美女扒开腿让男人桶爽久久软| 日韩男女性生活视频| 日韩电影免费观看高清完整版在线观看| 91九色综合久久| 国产区精品视频在线观看豆花| 欧美一区二区三区四区夜夜大片| 日韩伦理一区| 国产美女永久无遮挡| 日日夜夜一区二区| www.国产福利| 91理论电影在线观看| 亚洲精品国产精品乱码在线观看| 一级精品视频在线观看宜春院| 日本黄色一级视频| 日韩三级免费观看| 欧美精品少妇| 久久国产精品久久久| 97久久香蕉国产线看观看| 亚洲xxxx视频| 九热爱视频精品视频| 国产四区在线观看| 久久久久久9| 91精品啪在线观看国产| 国产精品色一区二区三区| 一级片免费网址| 日韩一区二区在线看| 国产人成在线视频| 国外色69视频在线观看| 亚洲免费看片| 日本精品一区二区| 亚洲午夜激情在线| 亚洲一区二区福利视频| 久久久五月婷婷| 国产成人无码精品久在线观看| 欧美日韩aaaaaa| 日本午夜在线| 国模吧一区二区三区| 国产精品日本一区二区三区在线| 久久艹中文字幕| 欧美日韩亚洲一区| 亚洲妇熟xx妇色黄蜜桃| 国产欧美日韩卡一| 超碰超碰超碰超碰| 精品久久久久久久久久久院品网| av在线电影院| 国产成人精品网站| 日本中文字幕在线一区| 人妻激情另类乱人伦人妻| 激情图片小说一区| 日韩精品久久久久久久的张开腿让| 欧美视频13p| 午夜黄色小视频| 久久久之久亚州精品露出| 欧美日本三级| 婷婷视频在线播放| 久久99国产精品久久99果冻传媒| 美女被到爽高潮视频| 欧美性猛交xxxx黑人猛交| 国产成人手机在线| 久久久久久国产精品久久| 久久久久毛片免费观看| 老汉色影院首页| 国产剧情在线观看一区二区| 欧美成人777| 欧美一区二区三区免费在线看| 免费高清在线观看| 成人在线国产精品| 91精品蜜臀一区二区三区在线| 粉色视频免费看| 亚洲码国产岛国毛片在线| 国产欧美日韩成人| 欧美高清视频在线观看| 三级欧美日韩| 丁香花在线影院观看在线播放| www.在线欧美| 亚洲精品中文字幕乱码三区91| 亚洲精品丝袜日韩| 日本一区二区电影| 伊人狠狠色丁香综合尤物| 精久久久久久久久久久| 真实国产乱子伦对白在线| 欧美mv日韩mv亚洲| www在线观看黄色| 欧美日韩另类综合| 青娱乐精品视频| 九九热最新地址| 精品粉嫩aⅴ一区二区三区四区| 国产精品25p| 天堂资源在线亚洲资源| 久久97超碰色| 亚洲一区二区91| 亚洲毛片在线免费观看| 欧美国产视频| 国产真实老熟女无套内射| 91亚洲精品乱码久久久久久蜜桃 | 波多野结衣中文在线| 久久精品综合一区| 另类专区欧美蜜桃臀第一页| 国产波霸爆乳一区二区| 日韩高清中文字幕| 欧美黄色a视频| 丰满少妇久久久| 国产女人18毛片水真多成人如厕 | 久久最新免费视频| 99久久免费视频.com| 中国女人一级一次看片| 欧美国产视频日韩| 少妇一区二区视频| 91视频福利网| 91福利视频久久久久| 中文字幕在线三区| 狼狼综合久久久久综合网| 韩国午夜理伦三级不卡影院| 国产精品自拍视频一区| 中文字幕在线精品| 国产毛片精品| 福利视频999| 日韩欧美在线视频免费观看| 国内外激情在线| 热re99久久精品国产99热| 国产91精品一区二区| 亚洲精品毛片一区二区三区| 欧美福利视频在线|