gpt4 book ai didi

programming-languages - 从代码片段中检测编程语言

转载 作者:行者123 更新时间:2023-12-03 04:42:12 25 4
gpt4 key购买 nike

检测代码片段中使用的编程语言的最佳方法是什么?

最佳答案

我认为垃圾邮件过滤器中使用的方法会非常有效。您将片段拆分为单词。然后,您将这些单词的出现次数与已知片段进行比较,并针对您感兴趣的每种语言计算该片段是用 X 语言编写的概率。

http://en.wikipedia.org/wiki/Bayesian_spam_filtering

如果您拥有基 native 制,那么添加新语言就非常容易:只需使用新语言的一些片段来训练检测器(您可以为其提供一个开源项目)。通过这种方式,它了解到“System”可能出现在 C# 代码片段中,而“puts”可能出现在 Ruby 代码片段中。

我实际上已经使用此方法将语言检测添加到论坛软件的代码片段中。它 100% 有效,除了不明确的情况:

print "Hello"

让我找到代码。

我找不到代码,所以我制作了一个新代码。这有点简单,但它适用于我的测试。目前,如果您向其提供的 Python 代码多于 Ruby 代码,它可能会显示以下代码:

def foo
puts "hi"
end

是Python代码(尽管它实际上是Ruby)。这是因为Python有一个def关键字也。因此,如果它看到了 1000x def在 Python 和 100x 中 def在 Ruby 中,它可能仍然会显示 Python,尽管 putsend是 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)

关于programming-languages - 从代码片段中检测编程语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/475033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com