Обнаружение языка программирования от отрывка

Если вам нужны только те данные, для которых включен 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;
110
задан Ilmari Karonen 26 October 2013 в 17:31
поделиться

7 ответов

Я думаю, что метод, используемый в спам-фильтрах, работал бы очень хорошо. Вы разделяете отрывок на слова. Тогда Вы сравниваете происшествия этих слов с известными отрывками и вычисляете вероятность, что этот отрывок записан на языке 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)
98
ответ дан Michael Myers 24 November 2019 в 03:15
поделиться

Это зависело бы от того, какой отрывок Вы имеете, но я выполнил бы его через серию токенизаторов и видел бы, против какого BNF языка это подошло как допустимое.

2
ответ дан Yes - that Jake. 24 November 2019 в 03:15
поделиться

Я не думал бы, что будет простой способ выполнить это. Я, вероятно, генерировал бы списки символов/общих ключевых слов, уникальных для определенных языков/классов языков (например, фигурные скобки для языка C-стиля, ключевые слова Dim и Sub для языков Basic, ключевое слово определения для Python, ключевое слово, которому позволяют, для функциональных языков). Вы тогда могли бы быть в состоянии использовать функции базового синтаксиса для сужения его еще больше.

0
ответ дан Noldorin 24 November 2019 в 03:15
поделиться

Это очень твердо и иногда невозможно. От которого язык является этим коротким отрывком?

int i = 5;
int k = 0;
for (int j = 100 ; j > i ; i++) {
    j = j + 1000 / i;
    k = k + i * j;
}

(Подсказка: Это мог быть любой из нескольких.)

можно попытаться проанализировать различные языки и попытаться решить частотный анализ использования ключевых слов. Если определенные наборы ключевых слов происходят с определенными частотами в тексте, вероятно, что язык является Java и т.д., Но я не думаю, что Вы получите что-либо, что абсолютно надежно, как Вы могли назвать, например, переменную в C тем же именем как ключевое слово в Java, и частотный анализ будут дурачить.

при взятии его на ступеньку выше в сложности Вы могли бы искать структуры, если определенное ключевое слово всегда прибывает после другого, который получит Вас больше подсказок. Но это также будет намного более твердо к разработке и реализации.

5
ответ дан 24 November 2019 в 03:15
поделиться

Во-первых, я попытался бы найти определенный keyworks языка, например,

"package, class, implements "=> JAVA
"<?php " => PHP
"include main fopen strcmp stdout "=>C
"cout"=> C++
etc...
3
ответ дан Pierre 24 November 2019 в 03:15
поделиться

Хорошая загадка.

я думаю, что невозможно обнаружить все языки. Но Вы могли включить ключевые маркеры. (определенные зарезервированные слова и часто используемые символьные комбинации).

Ben там много языков с подобным синтаксисом. Таким образом, это зависит от размера отрывка.

1
ответ дан Toon Krijthe 24 November 2019 в 03:15
поделиться

Вы можете найти полезный материал здесь: http://alexgorbatchev.com/wiki/SyntaxHighlighter . Алекс потратил много времени, выясняя, как разобрать большое количество разные языки и каковы ключевые элементы синтаксиса.

7
ответ дан 24 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: