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

JavaScript全文搜索之相關度評分

開發 開發工具 前端
全文搜索,與機器學習領域其他大多數問題不同,是一個 Web 程序員在日常工作中經常遇到的問題。客戶可能要求你在某個地方提供一個搜索框,然后你會寫一個類似 WHERE title LIKE %:query% 的 SQL 語句實現搜索功能。一開始,這是沒問題,直到有一天,客戶找到你跟你說,“搜索出錯啦!”

全文搜索,與機器學習領域其他大多數問題不同,是一個 Web 程序員在日常工作中經常遇到的問題。客戶可能要求你在某個地方提供一個搜索框,然后你會寫一個類似 WHERE title LIKE %:query% 的 SQL 語句實現搜索功能。一開始,這是沒問題,直到有一天,客戶找到你跟你說,“搜索出錯啦!”

[[131215]]

當然,實際上搜索并沒有“出錯”,只是搜索的結果并不是客戶想要的。一般的用戶并不清楚如何做精確匹配,所以得到的搜索結果質量很差。為了解決問題,你決 定使用全文搜索。經過一陣枯燥的學習,你開啟了 MySQL 的 FULLTEXT 索引,并使用了更高級的查詢語法,如 “MATCH … AGAINST” 。

好了,問題解決,完結撒花!數據庫規模不大的時候是沒問題了。

但是當你的數據越來越多時,你會發現你的數據庫也越來越慢了。MySQL 不是一個非常好用的全文搜索工具。所以你決定使用 ElasticSearch,重構代碼,并部署 Lucene 驅動的全文搜索集群。你會發現它工作的非常好,又快又準確。

這時你不禁會想:為什么 Lucene 這么牛逼呢?

本篇文章(主要介紹 TF-IDF,Okapi BM-25 和普通的相關性評分 )和 下一篇文章 (主要介紹索引)將為你講述全文搜索背后的基本概念。

相關性

對每一個搜索查詢,我們很容易給每個文檔定義一個“相關分數”。當用戶進行搜索時,我們可以使用相關分數進行排序而不是使用文檔出現時間來進行排序。這樣,最相關的文檔將排在***個,無論它是多久之前創建的(當然,有的時候和文檔的創建時間也是有關的)。

有很多很多種計算文字之間相關性的方法,但是我們要從最簡單的、基于統計的方法說起。這種方法不需要理解語言本身,而是通過統計詞語的使用、匹配和基于文檔中特有詞的普及率的權重等情況來決定“相關分數”。

這個算法不關心詞語是名詞還是動詞,也不關心詞語的意義。它唯一關心的是哪些是常用詞,那些是稀有詞。如果一個搜索語句中包括常用詞和稀有詞,你***讓包含稀有詞的文檔的評分高一些,同時降低常用詞的權重。

這個算法被稱為Okapi BM25。它包含兩個基本概念 詞語頻率(term frequency) 簡稱詞頻(“TF”)和 文檔頻率倒數(inverse document frequency) 簡寫為(“IDF”).把它們放到一起,被稱為 “TF-IDF”,這是一種統計學測度,用來表示一個詞語 (term) 在文檔中有多重要。

TF-IDF

詞語頻率(Term Frequency), 簡稱“TF”, 是一個很簡單的度量標準:一個特定的詞語在文檔出現的次數。你可以把這個值除以該文檔中詞語的總數,得到一個分數。例如文檔中有 100 個詞, ‘the’ 這個詞出現了 8 次,那么 'the' 的 TF 為 8 或 8/100 或 8%(取決于你想怎么表示它)。

逆向文件頻率Inverse Document Frequency), 簡稱“IDF”,要復雜一些:一個詞越稀有,這個值越高。它由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到。越是稀有的詞,越會產生高的 “IDF”。

如果你將這兩個數字乘到一起 (TF*IDF), 你將會得到一個詞語在文檔中的權重。“權重”的定義是:這個詞有多稀有并且在文檔中出現的多么頻繁?

你可以將這個概念用于文檔的搜索查詢。在查詢中的對于查詢中的每個關鍵字,計算他們的 TF-IDF 分數,并把它們相加。得分***的就是與查詢語句***的文檔。

Okapi BM25

上述算法是一個可用的算法,但并不太***。它給出了一個基于統計學的相關分數算法,我們還可以進一步改進它。

Okapi BM25 是到目前為止被認為***進的排名算法之一(所以被稱為ElasticSearch)。Okapi BM25 在 TF-IDF 的基礎上增加了兩個可調參數,k1 和 b,, 分別代表 “詞語頻率飽和度(term frequency saturation)” 和 “字段長度規約”。這是什么鬼?

為 了能直觀的理解“詞語頻率飽和度”,請想象兩篇差不多長度的討論棒球的文章。另外,我們假設所有文檔(除去這兩篇)并沒有多少與棒球相關的內容,因此 “棒球” 這個詞將具有很高的 IDF - 它極***而且很重要。 這兩篇文章都是討論棒球的,而且都花了大量的篇幅討論它,但是其中一篇比另一篇更多的使用了“棒球”這個詞。那么在這種情況,是否一篇文章真的要比另一篇 文章相差很多的分數呢?既然兩個兩個文檔都是大篇幅討論棒球的,那么“棒球”這個詞出現 40 次還是 80 次都是一樣的。事實上,30 次就該封頂啦!

這就是 “詞語頻率飽和度。原生的 TF-IDF 算法沒有飽和的概念,所以出現 80 次“棒球”的文檔要比出現 40 次的得分高一倍。有些時候,這時我們所希望的,但有些時候我們并不希望這樣。

此外,Okapi BM25 還有個 k1 參數,它用于調節飽和度變化的速率。k1 參數的值一般介于 1.2 到 2.0 之間。數值越低則飽和的過程越快速。(意味著兩個上面兩個文檔有相同的分數,因為他們都包含大量的“棒球”這個詞語)

字 段長度歸約(Field-length normalization)將文檔的長度歸約化到全部文檔的平均長度上。這對于單字段集合(single-field collections)(例如 ours)很有用,可以將不同長度的文檔統一到相同的比較條件上。對于雙字段集合(例如 “title” 和 "body")更加有意義,它同樣可以將 title 和 body 字段統一到相同的比較條件上。字段長度歸約用 b 來表示,它的值在 0 和 1 之間,1 意味著全部歸約化,0 則不進行歸約化。

Okapi BM25 維基百科中你可以了解Okapi算法的公式。既然都知道了式子中的每一項是什么,這肯定是很容易地就理解了。所以我們就不提公式,直接進入代碼:

 

  1. BM25.Tokenize = function(text) { 
  2.  
  3. text = text 
  4.  
  5. .toLowerCase 
  6.  
  7. .replace(/\W/g, ' '
  8.  
  9. .replace(/\s+/g, ' '
  10.  
  11. .trim 
  12.  
  13. .split(' '
  14.  
  15. .map(function(a) { returnstemmer(a); }); 
  16.  
  17. //Filter out stopStems 
  18.  
  19. var out = ; 
  20.  
  21. for(var i = 0, len = text.length; i < len; i++) { 
  22.  
  23. if(stopStems.indexOf(text[i]) === -1) { 
  24.  
  25. out.push(text[i]); 
  26.  
  27.  

我 們定義了一個簡單的靜態方法Tokenize,目的是為了解析字符串到tokens的數組中。就這樣,我們小寫所有的tokens(為了減少熵)。我們運 行Porter Stemmer 算法來減少熵的量同時也提高匹配程度(“walking”和"walk"匹配是相同的)。而且我們也過濾掉停用詞(很普通的詞)為了更近一步減少熵值。在 我所寫的概念深入之前,如果我過于解釋這一節就請多擔待。

  1. BM25.prototype.addDocument = function(doc) { 
  2.  
  3. if(typeof doc.id=== 'undefined') { throw new Error(1000, 'ID is a required property of documents.'); }; 
  4.  
  5. if(typeof doc.body === 'undefined') { throw new Error(1001, 'Body is a required property of documents.'); }; 
  6.  
  7. //Raw tokenized list of words 
  8.  
  9. var tokens = BM25.Tokenize(doc.body); 
  10.  
  11. //Will hold unique terms and their counts and frequencies 
  12.  
  13. var _terms = {}; 
  14.  
  15. //docObj will eventually be added to the documents database 
  16.  
  17. var docObj = {id: doc.id, tokens: tokens, body: doc.body}; 
  18.  
  19. //Count number of terms 
  20.  
  21. docObj.termCount = tokens.length; 
  22.  
  23. //Increment totalDocuments 
  24.  
  25. this.totalDocuments++; 
  26.  
  27. //Readjust averageDocumentLength 
  28.  
  29. this.totalDocumentTermLength += docObj.termCount; 
  30.  
  31. this.averageDocumentLength = this.totalDocumentTermLength / this.totalDocuments; 
  32.  
  33. //Calculate term frequency 
  34.  
  35. //First get terms count 
  36.  
  37. for(var i = 0, len = tokens.length; i < len; i++) { 
  38.  
  39. var term = tokens[i]; 
  40.  
  41. if(!_terms[term]) { 
  42.  
  43. _terms[term] = { 
  44.  
  45. count: 0, 
  46.  
  47. freq: 0 
  48.  
  49. }; 
  50.  
  51. }; 
  52.  
  53. _terms[term].count++; 
  54.  
  55.  
  56. //Then re-loop to calculate term frequency. 
  57.  
  58. //We'll also update inverse document frequencies here. 
  59.  
  60. var keys = Object.keys(_terms); 
  61.  
  62. for(var i = 0, len = keys.length; i < len; i++) { 
  63.  
  64. var term = keys[i]; 
  65.  
  66. //Term Frequency forthis document. 
  67.  
  68. _terms[term].freq = _terms[term].count / docObj.termCount; 
  69.  
  70. //Inverse Document Frequency initialization 
  71.  
  72. if(!this.terms[term]) { 
  73.  
  74. this.terms[term] = { 
  75.  
  76. n: 0, //Number of docs this term appears in, uniquely 
  77.  
  78. idf: 0 
  79.  
  80. }; 
  81.  
  82.  
  83. this.terms[term].n++; 
  84.  
  85. }; 
  86.  
  87. //Calculate inverse document frequencies 
  88.  
  89. //This is SLOWish so ifyou want to index a big batch of documents, 
  90.  
  91. //comment this out and run it once at the end of your addDocuments run 
  92.  
  93. //If you're only indexing a document or two at a timeyou can leave this in. 
  94.  
  95. //this.updateIdf; 
  96.  
  97. //Add docObj to docs db 
  98.  
  99. docObj.terms = _terms; 
  100.  
  101. this.documents[docObj.id] = docObj; 
  102.  
  103. }; 

這就是addDocument這種方法會奇跡般出現的地方。我們基本上建立和維護兩個類似的數據結構:this.documents.和this.terms。

this.documentsis 是一個保存著所有文檔的數據庫,它保存著文檔的全部原始文字,文檔的長度信息和一個列表,列表里面保存著文檔中的所有詞語和詞語的數量與出現頻率。使用這 個數據結構,我們可以很容易的和快速的(是的,非常快速,只需要時間復雜度為O(1)的哈表查詢時間)回答如下問題:在文檔 #3 中,'walk' 這個詞語出現了多少次?

我們在還使用了另一個數據結構,this.terms。它表示語料庫中的所有詞語。通過這個數據結構,我們可以在O(1)時間內回答如下問題:'walk' 這個詞在多少個文檔中出現過?他們的 id 是什么?

***,我們記錄了每個文檔的長度,并記錄了整個語料庫中文檔的平均長度。

注 意,上面的代碼中, idf 被初始化 0,而且 updateidf 方法被注釋掉了。這是因為這個方法運行的非常慢,并且只需在建立索引之后運行一次就可以了。既然運行一次就能滿足需求,就沒有必要運行5000次。先把它 注釋掉,然后在大批量的索引操作之后運行,就可以節省很多時間。下面是這個函數的代碼:

 

  1. BM25.prototype.updateIdf = function { 
  2.  
  3. varkeys = Object.keys(this.terms); 
  4.  
  5. for(vari = 0, len = keys.length; i < len; i++) { 
  6.  
  7. varnum = (this.totalDocuments - this.terms[term].n + 0.5); 
  8.  
  9. vardenom = (this.terms[term].n + 0.5); 
  10.  
  11. this.terms[term].idf = Math.max(Math.log10(num / denom), 0.01); 

這是一個非常簡單的函數,但是由于它需要遍歷整個語料庫中的所有詞語,并更新所有詞語的值,這就導致它工作的就有點慢。這個方法的實現采用了逆向文檔頻率 (inverse document frequency) 的標準公式(你可以在Wikipedia上找到這個公式)— 由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到。我做了一些修改,讓返回值一直大于0。

 

  1. BM25.prototype.search = function(query) { 
  2.  
  3. varqueryTerms = BM25.Tokenize(query); 
  4.  
  5. varresults = ; 
  6.  
  7. // Look at each document in turn. There are better ways to do this with inverted indices. 
  8.  
  9. varkeys = Object.keys(this.documents); 
  10.  
  11. for(varj = 0, nDocs = keys.length; j < nDocs; j++) { 
  12.  
  13. varid = keys[j]; 
  14.  
  15. // The relevance score for a document is the sum of a tf-idf-like 
  16.  
  17. // calculation for each query term. 
  18.  
  19. this.documents[id]._score = 0; 
  20.  
  21. // Calculate the score for each query term 
  22.  
  23. for(vari = 0, len = queryTerms.length; i < len; i++) { 
  24.  
  25. varqueryTerm = queryTerms[i]; 
  26.  
  27. // We've never seen this term before so IDF will be 0. 
  28.  
  29. // Means we can skip the whole term, it adds nothing to the score 
  30.  
  31. // and isn't in any document. 
  32.  
  33. if(typeofthis.terms[queryTerm] === 'undefined') { 
  34.  
  35. continue
  36.  
  37.  
  38. // This term isn't in the document, so the TF portion is 0 and this 
  39.  
  40. // term contributes nothing to the search score. 
  41.  
  42. if(typeofthis.documents[id].terms[queryTerm] === 'undefined') { 
  43.  
  44. continue
  45.  
  46.  
  47. // The term is in the document, let's go. 
  48.  
  49. // The whole term is : 
  50.  
  51. // IDF * (TF * (k1 + 1)) / (TF + k1 * (1 - b + b * docLength / avgDocLength)) 
  52.  
  53. // IDF is pre-calculated for the whole docset. 
  54.  
  55. varidf = this.terms[queryTerm].idf; 
  56.  
  57. // Numerator of the TF portion. 
  58.  
  59. varnum = this.documents[id].terms[queryTerm].count * (this.k1 + 1); 
  60.  
  61. // Denomerator of the TF portion. 
  62.  
  63. vardenom = this.documents[id].terms[queryTerm].count 
  64.  
  65. + (this.k1 * (1 - this.b + (this.b * this.documents[id].termCount / this.averageDocumentLength))); 
  66.  
  67. // Add this query term to the score 
  68.  
  69. this.documents[id]._score += idf * num / denom; 
  70.  
  71. if(!isNaN(this.documents[id]._score) && this.documents[id]._score > 0) { 
  72.  
  73. results.push(this.documents[id]); 
  74.  
  75.  
  76.  
  77. results.sort(function(a, b) { returnb._score - a._score; }); 
  78.  
  79. returnresults.slice(0, 10); 
  80.  
  81. }; 

***,search 方法遍歷所有的文檔,并給出每個文檔的 BM25 分數,然后按照由大到小的順序進行排序。當然了,在搜索過程中遍歷語料庫中的每個文檔實是不明智。這個問題在 Part Two (反向索引和性能)中得到解決。

上 面的代碼已經做了很好的注釋,其要點如下:為每個文檔和每個詞語計算 BM25 分數。詞語的 idf 分數已經預先計算好了,使用的時候只需要查詢即可。詞語頻率作為文檔屬性的一部分也已經預先計算好了。之后只需要簡單的四則運算即可。***給每個文檔增加 一個臨時變量 _score,然后根據 score 做降序排列并返回前 10 個結果。

示例,源代碼,注意事項和下一步計劃

上面的示例有很多方法進行優化,我們將在 “全文搜索”的第二部分中介紹它們,歡迎繼續收看。我希望我能在幾個星期之后完成它。下面列了下次將要提到的內容:

  • 反向索引和快速搜索

  • 快速索引

  • 更好的搜索結果

為了這個演示,我編了一個小的維基百科爬蟲,爬到相當多(85000)維基百科文章的***段。由于索引到所有85K文件需要90秒左右,在我的電腦我已經削減了一半。不想讓你們僅僅為了一個簡單的全文本演示浪費你的筆記本電腦電量。

因為索引是一個繁重的、模塊化的CPU操作,我把它當成一個網絡工作者。索引運行在一個后臺線程上--在這里你可以找到完整的源代碼。你也會發現到詞干算法和我的停用詞列表中的源代碼參考。至于代碼許可,還是一如既往為教育目的而免費,而不用于任何商業目的。

***是演示。一旦索引完成,嘗試尋找隨機的東西和短語,維基百科會知道的。注意,只有40000段的索引,所以你可能要嘗試一些新的話題。

責任編輯:王雪燕 來源: 人才芯片工程
相關推薦

2009-02-25 13:59:57

布爾全文搜索全文搜索內置函數

2018-08-22 14:25:42

搜索LuceneQuery

2020-06-10 08:23:44

JavaScript開發Web

2022-03-22 15:20:32

微信全文搜索

2025-02-05 07:26:45

2009-02-25 13:41:49

全文搜索內置函數MySQL

2023-12-10 20:33:50

Redis搜索全文

2010-06-11 17:00:34

2014-10-14 09:49:47

Postgres數據庫

2010-06-10 13:54:10

MySQL全文搜索

2025-01-06 09:03:41

2010-10-27 09:03:01

移動搜索百度

2017-08-17 16:42:38

Elastic 全文搜索服務器

2011-05-16 13:24:00

MySQL全文搜索效率

2018-12-28 09:48:11

SolrElasticSear搜索

2011-06-02 16:48:12

SEO

2013-11-15 17:34:14

UnixLinuxRecoll

2021-04-12 10:38:17

ElasticSearSolrJava

2011-10-28 16:19:21

百度搜索

2009-01-11 09:14:45

Javascript開發總結
點贊
收藏

51CTO技術棧公眾號

欧美一区中文字幕| 26uuu色噜噜精品一区| 久久精品福利视频| 一本之道在线视频| 香蕉伊大人中文在线观看| 国产日韩欧美麻豆| 亚洲伊人一本大道中文字幕| 日本少妇激情视频| 国产精品视频一区二区三区四蜜臂| 欧美日本一区二区三区| 奇米影视亚洲色图| 成人jjav| 99久久er热在这里只有精品66| 国产精品久久婷婷六月丁香| 国产一级二级三级| 精品无人区麻豆乱码久久久| 欧美va在线播放| 国产精品一区二区羞羞答答| av电影在线免费| 国产精品久线观看视频| 久久久久久一区| 国产99对白在线播放| 久久aⅴ国产紧身牛仔裤| 久久久精品电影| 91精彩刺激对白露脸偷拍| 欧美高清免费| 色网综合在线观看| www.国产在线视频| 岛国成人毛片| 国产精品免费丝袜| 欧洲高清一区二区| 外国精品视频在线观看 | 天天摸夜夜添狠狠添婷婷| 看国产成人h片视频| 日本午夜在线亚洲.国产| 精国产品一区二区三区a片| 热久久天天拍国产| 亚洲天堂av电影| 欧类av怡春院| 精品在线网站观看| 欧美tk—视频vk| 久久无码人妻一区二区三区| 欧美爱爱视频| 欧美久久一区二区| 久久婷五月综合| 欧洲一级精品| 色婷婷一区二区三区四区| 男人添女人下面高潮视频| 牛牛电影国产一区二区| 亚洲综合在线视频| 久久久久久久香蕉| 在线观看免费视频你懂的| 亚洲日本在线看| 中文字幕中文字幕在线中一区高清| 福利成人在线观看| 亚洲国产精品v| 亚洲精品影院| 五月婷婷在线观看| 亚洲欧美一区二区视频| 色中文字幕在线观看| 在线观看二区| 综合色天天鬼久久鬼色| www.-级毛片线天内射视视| 国产在线一区二区视频| 亚洲精品久久嫩草网站秘色| 99久久99久久精品| 成人免费一区二区三区牛牛| 亚洲国产日产av| 成人在线免费观看av| 少妇视频在线观看| 在线亚洲精品福利网址导航| 日本熟妇人妻中出| 日韩一区二区三区四区五区| 欧美精品成人一区二区三区四区| 亚洲高清在线不卡| 91九色鹿精品国产综合久久香蕉| 欧美精品一区二区三区四区| 久久无码人妻精品一区二区三区| 久9久9色综合| 久久视频在线看| 日本少妇性高潮| 久久激情一区| 成人黄色免费看| 六月丁香综合网| 久久久精品黄色| 视频一区不卡| 大片免费在线观看| 疯狂做受xxxx高潮欧美日本| 成年人在线观看视频免费| 日本成人在线网站| 亚洲成人精品在线| 日本理论中文字幕| 欧美先锋影音| 国产精品国产自产拍高清av水多| 99久久亚洲精品日本无码| 成人性视频免费网站| 日韩欧美国产二区| 在线黄色网页| 欧美性色aⅴ视频一区日韩精品| www.桃色.com| 久久av综合| 欧美精品一区三区| 国产成人精品777777| 国产麻豆成人传媒免费观看| 久久久福利视频| 尤物yw193can在线观看| 日韩欧美综合在线视频| a级大片免费看| 成人精品天堂一区二区三区| 欧美激情视频免费观看| 国产无遮挡又黄又爽又色视频| 国产二区国产一区在线观看| 日韩欧美视频一区二区三区四区| 丰满的护士2在线观看高清| 在线免费观看日韩欧美| 午夜不卡久久精品无码免费| 欧美gay男男猛男无套| 91大神福利视频在线| 国产普通话bbwbbwbbw| 久久精品夜色噜噜亚洲a∨ | 久久精品123| 成人免费91在线看| 日本视频不卡| 91久久香蕉国产日韩欧美9色| 人妻 丝袜美腿 中文字幕| 成人精品视频| 国产精品成久久久久三级| 色欲av永久无码精品无码蜜桃| 亚洲欧美国产三级| 国产喷水theporn| 九九亚洲精品| 欧美一区亚洲一区| 三级视频在线看| 亚洲综合在线第一页| 激情成人在线观看| 婷婷久久综合| 国产日韩在线免费| 日本中文在线| 欧美日韩高清影院| 亚洲黄色网址大全| 日韩制服丝袜先锋影音| 欧美aaaaa喷水| 中文在线аv在线| 亚洲国产精品福利| 日本污视频在线观看| 国产盗摄一区二区三区| 国产精品88久久久久久妇女 | 日韩成人一区二区| 欧美成熟毛茸茸复古| 久久青草伊人| 亚洲精品乱码久久久久久金桔影视| 久久久久亚洲天堂| 懂色av中文一区二区三区| 日本久久久网站| 国产精品nxnn| 91国在线精品国内播放| 亚洲欧美日本在线观看| 欧美午夜激情在线| 日韩乱码人妻无码中文字幕久久 | 国产三级三级看三级| 日韩在线第七页| 成人网欧美在线视频| av片哪里在线观看| 日韩欧美精品在线| 日本少妇xxxx动漫| 91毛片在线观看| 9久久婷婷国产综合精品性色 | 欧美国产国产综合| 九九精品久久久| 国产精品国产一区| 99精品欧美一区二区三区| 国产蜜臀在线| 精品一区二区三区电影| 综合久久中文字幕| 亚洲欧美经典视频| 国产又粗又猛又色| 视频一区二区欧美| 中文字幕一区二区三区在线乱码 | 五月天亚洲综合| 伊人久久大香| 国产做受69高潮| 国产香蕉在线| 欧美一级精品大片| 狠狠躁夜夜躁人人爽天天高潮| 久久精子c满五个校花| 999久久久精品视频| 伊人成人在线| 午夜精品福利一区二区| 精品亚洲二区| 奇米四色中文综合久久| 日本中文字幕在线看| 精品国产91乱码一区二区三区| 区一区二在线观看| 亚洲精品一二三四区| av无码av天天av天天爽| 国内精品伊人久久久久av一坑| 免费一级特黄特色毛片久久看| 欧美在线色图| 国产精品99久久久久久久 | 欧美最猛黑人xxxxx猛交| caoporn91| 久久综合狠狠综合久久综合88 | 中文字幕日韩免费| 一区二区欧美精品| 免费一级特黄3大片视频| 成人动漫av在线| 97超碰成人在线| 亚洲一区国产| 亚洲高潮无码久久| 不卡中文一二三区| 国产在线一区二| 国产一区二区三区亚洲综合| 日本欧美一级片| gogo久久| 九九精品在线视频| 999国产在线视频| 亚洲欧美日韩中文视频| 日本高清视频网站| 欧美一级理论片| 91麻豆成人精品国产| 精品成人在线视频| 丁香花五月激情| 国产精品日韩成人| 免费看污黄网站在线观看| 高清在线不卡av| 51自拍视频在线观看| 男人操女人的视频在线观看欧美 | 美国三级日本三级久久99| 成年人网站免费视频| 欧美日韩影院| 91传媒免费视频| 中文字幕一区二区av| 亚洲一区二区三区午夜| 精品盗摄女厕tp美女嘘嘘| 久久久久久久久久久久久久一区 | 五月天婷婷导航| 精品国产电影一区| 国产精品6666| 亚洲国产综合色| 久久久久久久久久综合| 一级日本不卡的影视| 五月天婷婷色综合| ㊣最新国产の精品bt伙计久久| www.日本高清视频| 中文文精品字幕一区二区| 黄色片在线观看免费| 国产精品日产欧美久久久久| 亚洲精品91在线| 国产精品免费视频一区| 免费黄色国产视频| 亚洲欧美中日韩| 国产探花在线免费观看| 亚洲激情在线激情| 国产一级性生活| 天天做天天摸天天爽国产一区| 一区二区三区视频免费看| 午夜影院在线观看欧美| 精品国产乱码一区二区| 欧美性20hd另类| 中文字幕 视频一区| 欧美老人xxxx18| 国产成人毛毛毛片| 精品国产乱码久久久久久浪潮| 粉嫩小泬无遮挡久久久久久| 亚洲国产精品热久久| 香蕉国产在线视频| 国产亚洲成精品久久| 午夜视频在线观看免费视频| 久久电影一区二区| 国产www视频在线观看| 欧美亚洲国产视频小说| 成人国产一区| 亚洲中国色老太| 久久夜色电影| 日韩资源av在线| 欧美视频免费| 日韩成人三级视频| 久久精品导航| 亚洲国产日韩在线一区| 99国产欧美另类久久久精品| 久久久久久久久福利| 一区二区三区美女| 黄色一级视频免费看| 这里只有精品99re| 天堂在线观看免费视频| 中文字幕日韩视频| 男女视频在线| 国产精品男女猛烈高潮激情| 亚洲精品视频一二三区| 日本一区二区三区视频免费看| 亚洲成人一区| 无码人妻丰满熟妇区毛片| 久久超碰97中文字幕| 波多野结衣先锋影音| 国产精品久久久久一区二区三区| 免费在线观看国产精品| 日韩欧美黄色动漫| 精品人妻一区二区三区四区不卡| 亚洲男人的天堂网站| 亚洲国产精品精华素| 国产精品久久久久av免费| 成人午夜三级| 综合视频免费看| 免费亚洲视频| 911亚洲精选| 日韩美女视频一区| 国产精品久久久久久人| 欧美成人r级一区二区三区| 国产三级在线观看| 国内成人精品一区| 国产亚洲久久| 亚洲国产精品123| 性欧美长视频| 国产成人精品无码片区在线| 亚洲手机成人高清视频| 亚洲av无码不卡| 日韩成人小视频| 后进极品白嫩翘臀在线播放| 国产精品一久久香蕉国产线看观看| 久久a爱视频| 成人一级生活片| 蓝色福利精品导航| 黄色片网站免费| 欧美日韩一区二区三区| 国产 日韩 欧美 综合| 久久伊人精品天天| 国产精品xxx| 午夜久久资源| 日韩av午夜在线观看| 久久亚洲AV成人无码国产野外| 亚洲影视资源网| 亚洲av无码乱码在线观看性色| 日韩亚洲欧美中文高清在线| 成人免费av电影| 色一情一区二区三区四区| 美女久久一区| 亚洲性猛交xxxx乱大交| 欧美午夜电影在线| 欧美女v视频| 欧美怡春院一区二区三区| 精品精品国产毛片在线看| 日韩欧美猛交xxxxx无码| 国产麻豆视频精品| 免费一级黄色大片| 亚洲精品在线免费观看视频| 在线观看中文字幕的网站| 99久久精品久久久久久ai换脸| 综合av在线| 国产乱淫av麻豆国产免费| 亚洲一区二区三区自拍| 亚洲高清在线观看视频| 久久久久久久久中文字幕| 久久99精品国产自在现线| 午夜免费福利小电影| 91视频精品在这里| 在线观看日本视频| 亚洲视频一区二区| 97久久网站| 97超碰免费观看| 成人免费看黄yyy456| 日本三级2019| 亚洲欧美一区二区三区在线| 欧美韩国亚洲| 国产又爽又黄ai换脸| 国产精品影视网| 中文字幕亚洲精品一区| 亚洲欧美成人网| 精品69视频一区二区三区| av磁力番号网| 北条麻妃国产九九精品视频| 免费黄色网址在线| 一本一道久久a久久精品逆3p | 九九精品视频在线看| 中文字幕av久久爽av| 亚洲高清久久网| 欧美精品资源| 懂色av粉嫩av蜜臀av| 91在线视频播放| 中文字幕一区二区免费| 欧美成人第一页| 国产精品自拍区| 一级日本黄色片| 一本一本大道香蕉久在线精品 | 国产精品成人在线观看| 精品久久久久久亚洲综合网站| 97在线观看免费| 成人系列视频| 国产免费a级片| 欧美羞羞免费网站| 免费电影视频在线看 | 亚洲国产一区二区三区在线播放| 麻豆精品国产传媒av| 欧美性一级生活| av资源中文在线| 伊人久久大香线蕉综合75| 成人国产一区二区三区精品| wwwwww在线观看| 高清亚洲成在人网站天堂| 成人一区二区| 国产吞精囗交久久久|