Если вам нужны только те данные, для которых включен blog_status, неправильно выбрать все и затем отфильтровать. Вы должны получить отфильтрованные данные из базы данных. изменить эту строку:
$get_blogposts = "SELECT * FROM blogs LIMIT " . $id_number . ", " . $result_num;
с помощью:
$get_blogposts = "SELECT * FROM blogs WHERE blog_status='on' LIMIT " . $id_number . ", " . $result_num;
Я думаю, что метод, используемый в спам-фильтрах, работал бы очень хорошо. Вы разделяете отрывок на слова. Тогда Вы сравниваете происшествия этих слов с известными отрывками и вычисляете вероятность, что этот отрывок записан на языке X для каждого языка, которым Вы интересуетесь.
http://en.wikipedia.org/wiki/Bayesian_spam_filtering
, Если у Вас есть основной механизм тогда, очень легко добавить новые языки: просто обучите детектор с несколькими отрывками на новом языке (Вы могли подать его проект с открытым исходным кодом). Таким образом, это узнает, что "Система", вероятно, появится в отрывках C# и "помещает" в отрывки Ruby.
я на самом деле использовал этот метод для добавления обнаружения языка к фрагментам кода для программного обеспечения форума. Это работало 100% времени, кроме неоднозначных случаев:
print "Hello"
Позволяют мне найти код.
я не мог найти код, таким образом, я сделал новый. Это немного упрощенно, но это работает на мои тесты. В настоящее время при питании его намного больше кода Python, чем код Ruby, это, вероятно, скажет что этот код:
def foo
puts "hi"
end
код Python (хотя это действительно - Ruby). Это вызвано тем, что Python имеет def
ключевое слово также. Таким образом, если это видело 1000x def
в Python, и 100x def
в Ruby тогда это может все еще сказать Python даже при том, что puts
и end
является определенным для Ruby. Вы могли зафиксировать это путем отслеживания слова, замеченные на язык и деления на тот где-нибудь (или путем питания его равные объемы кода на каждом языке).
я надеюсь, что это помогает Вам:
class Classifier
def initialize
@data = {}
@totals = Hash.new(1)
end
def words(code)
code.split(/[^a-z]/).reject{|w| w.empty?}
end
def train(code,lang)
@totals[lang] += 1
@data[lang] ||= Hash.new(1)
words(code).each {|w| @data[lang][w] += 1 }
end
def classify(code)
ws = words(code)
@data.keys.max_by do |lang|
# We really want to multiply here but I use logs
# to avoid floating point underflow
# (adding logs is equivalent to multiplication)
Math.log(@totals[lang]) +
ws.map{|w| Math.log(@data[lang][w])}.reduce(:+)
end
end
end
# Example usage
c = Classifier.new
# Train from files
c.train(open("code.rb").read, :ruby)
c.train(open("code.py").read, :python)
c.train(open("code.cs").read, :csharp)
# Test it on another file
c.classify(open("code2.py").read) # => :python (hopefully)
Это зависело бы от того, какой отрывок Вы имеете, но я выполнил бы его через серию токенизаторов и видел бы, против какого BNF языка это подошло как допустимое.
Я не думал бы, что будет простой способ выполнить это. Я, вероятно, генерировал бы списки символов/общих ключевых слов, уникальных для определенных языков/классов языков (например, фигурные скобки для языка C-стиля, ключевые слова Dim и Sub для языков Basic, ключевое слово определения для Python, ключевое слово, которому позволяют, для функциональных языков). Вы тогда могли бы быть в состоянии использовать функции базового синтаксиса для сужения его еще больше.
Это очень твердо и иногда невозможно. От которого язык является этим коротким отрывком?
int i = 5;
int k = 0;
for (int j = 100 ; j > i ; i++) {
j = j + 1000 / i;
k = k + i * j;
}
(Подсказка: Это мог быть любой из нескольких.)
можно попытаться проанализировать различные языки и попытаться решить частотный анализ использования ключевых слов. Если определенные наборы ключевых слов происходят с определенными частотами в тексте, вероятно, что язык является Java и т.д., Но я не думаю, что Вы получите что-либо, что абсолютно надежно, как Вы могли назвать, например, переменную в C тем же именем как ключевое слово в Java, и частотный анализ будут дурачить.
при взятии его на ступеньку выше в сложности Вы могли бы искать структуры, если определенное ключевое слово всегда прибывает после другого, который получит Вас больше подсказок. Но это также будет намного более твердо к разработке и реализации.
Во-первых, я попытался бы найти определенный keyworks языка, например,
"package, class, implements "=> JAVA
"<?php " => PHP
"include main fopen strcmp stdout "=>C
"cout"=> C++
etc...
Хорошая загадка.
я думаю, что невозможно обнаружить все языки. Но Вы могли включить ключевые маркеры. (определенные зарезервированные слова и часто используемые символьные комбинации).
Ben там много языков с подобным синтаксисом. Таким образом, это зависит от размера отрывка.
Вы можете найти полезный материал здесь: http://alexgorbatchev.com/wiki/SyntaxHighlighter . Алекс потратил много времени, выясняя, как разобрать большое количество разные языки и каковы ключевые элементы синтаксиса.