6

Lunr.js là một công cụ toàn văn đơn giản trong Javascript. Tìm kiếm toàn văn xếp các tài liệu được trả về từ một truy vấn bằng cách chúng gần giống với truy vấn đó, dựa trên tần suất từ ​​và các cân nhắc về ngữ pháp - các từ xuất hiện thường xuyên có tác dụng tối thiểu, trong khi nếu một từ hiếm xảy ra trong tài liệu nhiều lần, nó sẽ tăng thứ hạng đáng kể. Điều này đã trở lại thời kỳ của những công cụ tìm kiếm thập niên 90, trong đó nhồi nhét từ khóa là một chiến thuật SEO có giá trị.

Công thức xếp hạng trong toàn văn bản được gọi là tf-idf, viết tắt của tần số văn bản / tần số tài liệu nghịch đảo - một dấu hiệu cho thấy mức độ liên quan được tính toán. Điều này đòi hỏi phần mềm lập chỉ mục để đo tần số từ trong tài liệu, truy vấn và trên toàn bộ kho văn bản. Lunr.js có một loạt các chức năng và đối tượng bên trong để theo dõi tần số từ và rất dễ tùy chỉnh:

lunr.Index.prototype.idf = function (term) {
  if (this._idfCache[term]) return this._idfCache[term]
 
 // var documentFrequency = this.tokenStore.count(term)
  var documentFrequency = blekko(term),
      idf = 1
 
  if (term === "") documentFrequency = 1
 
  if (documentFrequency > 0) {
    idf = 1 + Math.log(this.tokenStore.length / documentFrequency)
  }
 
  return this._idfCache[term] = idf
};

Tôi nghĩ thật thú vị khi trích xuất tần số từ từ một công cụ tìm kiếm - đối với một số lượng nhỏ tài liệu, thật khó để có được những con số tốt. Mục đích là để hiển thị các từ khóa có liên quan của Nhật Bản cho nội dung trang web - kỹ thuật này có một đặc tính tốt là có xu hướng bỏ qua các từ rất phổ biến và các cụm từ đã bị spam đến chết. Mã dưới đây cho thấy việc truy xuất các số từ API của Blekko - để tránh các vấn đề AJAX tên miền chéo tôi chạy các truy vấn thông qua proxy.

function blekko(query) {
  var result = blekko_cache[query];
  if (result !== undefined) return result;
 
  $.ajax({
    url: 'http://www.garysieling.com/poc/lunrkw/proxy.php?query=' + query,
    async: false
  }).done(function (data) {
    if (data === "") {
      result = 1000000000000000000000;
    } else {
      var json = JSON.parse(data);
 
      result = json.universal_total_results;
      if (result) {
        result = result.replace('M', '000000');
        result = result.replace('K', '000');
        result = parseInt(result);
      } else {
        result = 1000000000000000000000;
      }
    }
  });
 
  blekko_cache[query] = result;
 
  return result;
}

Để điền chỉ mục, hãy thực hiện các bước sau:

  • Tạo một danh sách các từ duy nhất.
  • Thu thập tất cả các cách sử dụng của mỗi từ vào một 'tài liệu'
  • Dán từng lô từ vào chỉ mục

Cũng lưu ý rằng tôi đã loại bỏ trình gốc, nếu không, các từ được gửi đến Blekko trong quá trình xếp hạng, làm sai lệch kết quả. Không có khái niệm về bối cảnh. Kỹ thuật này không có khái niệm về bối cảnh - ví dụ như D3 ″ là một mô hình của Cadillac, một vitamin, Mô hình máy ảnh DSLR và Thư viện Javascript.

var index = lunr(function () {
  this.field('word')
  this.ref('id')
});
 
index.pipeline.remove(lunr.stemmer);
 
var items = text.split(/[ ()'{0123456789}"\[\].:;+$,..-]/);
var words = {};
$.each(items, function (index, word) {
  if (word.length < 4) {
    return;
  }
  if ("" !== word) {
    var lword = word.toLowerCase();
    words[lword] = (words[lword] ? words[lword] : 0) + 1;
  }
});
 
var docs = [];
var id = 0;
$.each(words, function (k, v) {
  var wordlist = '';
  for (var i = 0; i < v * v; i++) {
    wordlist = wordlist + ' ' + k;
  }
 
 
  docs[id] = k;
  index.add({
    id: id++,
    word: wordlist
  });
 
});

Để lấy kết quả, hãy tìm kiếm chỉ số lunr cho tất cả các kết quả - thông thường nếu bạn gửi một truy vấn trống, nó sẽ không trả về gì, vì vậy tôi đã sửa đổi nó để trả về tất cả các kết quả.

var printed = {};
var topcnt = 250;
$.each(index.search(""),
  function (i, d) {
    var ref = parseInt(d.ref);
    var word = docs[ref];
    if (printed[word]) return;
    if (blekko_cache[word] === undefined) return;
    if (word.substr(word.length - 2) === 'ly') return;
    if (topcnt < 0) return;
 
    topcnt--;
    console.log(word + " (" + blekko_cache[word] + ")")
    printed[word] = true;
  }
);

Đây là kết quả trông như thế nào:

hooks (980)
stumbled (968)
doc_num (963)
splits (957)
paints (948)
parameters (939)
indexed (927)
realm (916)
minifies (915)
python (912)
underscores (907)
unrelated (905)
replacements (903)
irrelevant (900)
closures (888)
unfinished (878)
summaries (877)
algorithms (873)
metrics (870)
painters (869)
manipulation (864)
facet (852)
clone (849)
occurrence (843)
defects (840)
brennan (837)
stains (830)
risen (824)
catenate (823)
richer (821)
packets (815)
commits (804)
mock (802)
sorting (775)
documenting (771)
visualization (768)
twitter (762)
recursed (761)
clicked (760)
lends (757)
hacked (755)
listens (747)
folders (745)
variables (742)
encrypted (736)
differs (736)
litigation (733)
tighter (729)
naive (725)
whipped (718)
smoother (714)
numpages (709)
loser (707)
override (703)
bins (693)
protections (691)
exposes (689)
ceramic (677)
programmer (676)
buttongroup (674)
wrapper (661)
facets (652)
oracle (644)
|