关于nlp:哪种编程语言最像自然语言?

What programming language is most like natural language?

我有许多的想法对于这个问题的情况下,从那里我不明白的人是在说当别人不理解我。

所以,一个"聪明"的解决方案将是一个大的说计算机语言。:)

我是一个编程语言的兴趣的多远都能获得大的自然语言(英语)附近。当我靠近我的意思是说,不只是为了使用的话和句子,但能大的事情",因为"自然语言可以由"自由",因为"和"我的意思是它可以用来(在一个非常有限的方式)作为一个更换为自然语言。

我知道这是impossible(是谁?)但我认为这可以是有趣的。


有一种叫做通知的编程语言,在它最近的化身中,通知7看起来很像自然语言……特别是书面语言。

Information是专门为创建文本冒险游戏而设计的,但并没有固有的理由不能将这些概念扩展到其他领域。

以下是艾米丽·肖特从游戏杯中提取的一小段信息7代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Stage is a room.

The old lady is a woman in the Stage. Understand"mother" or
"stepmother" as the old lady. The old lady is active. The description
of the lady is"She looks plucked: thin neck with folds of skin
exposed, nose beaky, lips white. Perhaps when her fortunes are mended
her cosmetics too will improve."

The Prince is a man in the Stage. The description of the prince is
"He's tolerably attractive, in his flightless way. It's hard not to
pity him a little." The prince carries a glass slipper. The glass
slipper is wearable. Understand"shoe" or"heel" or"toe" or"foot"
as the slipper. The description of the slipper is"It is very small
for an adult woman's foot."

完整的代码可以在这里找到。

这是一个简单的小例子……它实际上可以处理一组惊人的健壮的想法。

应该指出的是,代码并不是一个真正奇怪的密码器,在这个密码器中,构造具有隐藏的含义……这段代码或多或少达到了您所期望的效果。例如:

1
2
The old lady is a woman in the Stage. Understand"mother" or
"stepmother" as the old lady.

创建一个碰巧是女性的对象,将该对象命名为"老太太",并将该对象放置在称为"舞台"的房间对象中。然后创建两个别名("母亲"和"继母",它们都引用"老太太"对象。

当然,随着例子变得越来越复杂,需要跳过的篮球也变得越来越复杂。从本质上讲,英语是模棱两可的,而计算机代码则不是。所以我们永远不会得到"完美的婚姻"。


取决于你进入的圈子,但是lolcode可以被看作是自然语言;)

示例循环:

1
2
3
4
5
6
7
8
9
HAI
    CAN HAS STDIO?
    I HAS A VAR
    IM IN YR LOOP
        UP VAR!!1
        VISIBLE VAR
        IZ VAR BIGGER THAN 10? KTHXBYE
    IM OUTTA YR LOOP
KTHXBYE

严肃地说,vb是一种非常自然的语言。非程序员类型很容易学习,所以语法必须非常容易理解。


理查德·普赖尔在《超人三世》中用过的语言非常接近:

1
> TRANSFER $1,000,000 DOLLARS TO WEBSTER'S ACCOUNT.... NOW

;-)

编辑:更正的字符;-)


COBOL读起来很像英语

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.     HELLOWORLD.
000300
000400*
000500 ENVIRONMENT DIVISION.
000600 CONFIGURATION SECTION.
000700 SOURCE-COMPUTER. RM-COBOL.
000800 OBJECT-COMPUTER. RM-COBOL.
000900
001000 DATA DIVISION.
001100 FILE SECTION.
001200
100000 PROCEDURE DIVISION.
100100
100200 MAIN-LOGIC SECTION.
100300 BEGIN.
100400     DISPLAY"" LINE 1 POSITION 1 ERASE EOS.
100500     DISPLAY"Hello world!" LINE 15 POSITION 10.
100600     STOP RUN.
100700 MAIN-LOGIC-EXIT.
100800     EXIT.

来源


Lisp(当然(如果你知道我的意思(lol)))


如果你是鉴赏家,莎士比亚的编程语言是相当自然的;)

但是,在编程中,您可以获得的"自然"程度是有限制的。人类语言太开放,无法解释——一种编程语言需要具体和精确,我认为这与拥有一种"自然"的编程语言格格不入。


好的苹果脚本把它和英语的相似性吹捧为它的优势之一。但是,和他一起工作不是很有趣。


hypertalk——苹果公司hypercard背后的语言。

1
2
3
4
5
6
7
 on mouseUp
   put"100,100" into pos
   repeat with x = 1 to the number of card buttons
     set the location of card button x to pos
     add 15 to item 1 of pos
   end repeat
 end mouseUp

维基百科上的hypertalk


当然,简单的英语!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
To sing the beer song:
  Put 99 into a number.
  Loop.
  If the number is 0, break.
  Format a string given the number and"bottle" and"bottles".
  Write the string then" of beer on the wall," then the string then" of beer.".
  Format another string given the number minus 1 and"bottle" and"bottles".
  Write"Take one down and pass it around," then the other string then" of beer on the wall.".
  Skip a line.
  Subtract 1 from the number.
  Repeat.
  Write"No more bottles of beer on the wall, no more bottles of beer.".
  Write"Go to the store and buy some more, 99 bottles of beer on the wall.".

To format a string given a number and a singular string and a plural string:
  If the number is 0, put"no more" then the plural into the string; exit.
  If the number is 1, put"1" then the singular into the string; exit.
  Put the number then"" then the plural into the string.

我没用过这个-我在这里找到的。


我不知道我会说vb.net和英语很接近,但我认为它和你真正接近。当然,一旦你对它进行了一段时间的编程,它看起来就像是英语——对一个经验丰富的VB程序员来说,它的确像一本书,但是如果你停下来想想真实世界的英语:

1
2
3
For i As Integer = 1 To 10
  Console.WriteLine("Hello World")
Next

距离:

Write"Hello World" and move to the next line of the console 10 times.

当然,英语是模棱两可的——它是想让你做整件事10次,还是只写一次"你好世界",然后移到下一行10次?

我想我们需要学会用一种不那么模棱两可的方式说话:

Do this 10 times: In the console, write"Hello World" and move to the next line.

但我非常怀疑有一种编程语言真的读起来像英语。即使是那些说它像自然语言的COBOL狂热分子,如果你停下来思考你是如何用真实的方式来思考事情的,而不是用编程语言定义的方式来思考的,那也不是真的。

即使在vb中,你也被限制在框架规定你做事方式的方式上…


Gherkin是一种特定于领域的语言描述可执行的BDD规范。它被黄瓜(Ruby)和SpecFlow(Dotnet)所使用。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    Feature: Browsing
        In order to see who's been on the site
        As a user
        I want to be able to view the list of posts

    Scenario: Navigation to homepage
        When I navigate to /Guestbook
        Then I should be on the guestbook page

    Scenario: Viewing existing entries
        Given I am on the guestbook page
        Then I should see a list of guestbook entries
            And guestbook entries have an author
            And guestbook entries have a posted date
            And guestbook entries have a comment

    Scenario: Most recent entries are displayed first
        Given we have the following existing entries
            | Name      | Comment      | Posted date       |
            | Mr. A     | I like A     | 2008-10-01 09:20  |
            | Mrs. B    | I like B     | 2010-03-05 02:15  |
            | Dr. C     | I like C     | 2010-02-20 12:21  |
          And I am on the guestbook page
        Then the guestbook entries includes the following, in this order
            | Name      | Comment      | Posted date       |
            | Mrs. B    | I like B     | 2010-03-05 02:15  |
            | Dr. C     | I like C     | 2010-02-20 12:21  |
            | Mr. A     | I like A     | 2008-10-01 09:20  |


Perl有一些基于人类如何处理自然语言的设计原则(参见http://www.wall.org/~larry/natural.html)。

这是一个不同的东西,从句法黑客使代码读起来像英语或其他语言的句子。我并不完全相信这些是有用的。作为一个类比,我也可以用我的代码来制作ASCII艺术,但这并不意味着我的语言是基于视觉合成的原则。

举一个例子说明它在哪里可能不有用,假设它在一些浅色/小语调的语言中看起来是这样的:

1
3.times say"hello!"

这很好,它使我的代码更易读,而且它也有类似的乐趣,有一只鹦鹉可以说话,但它只有在我知道计算机语言的基本规则的情况下才有用。事实上,它恰巧看起来像英语,没有给我额外的杠杆作用或洞察力。我不能用大脑中的英语语法处理引擎生成如下句子:

1
2
3
4
5
6
7
8
9
10
// The dot looks like misplaced punctuation
// in the"English" above, but it's essential in
// the computer language
3 times say"hello!" // syntax error

// In a natural language, a reordering might make
// sense, but it's impossible here because the word
// order was essential to carrying the parameters
// to the method invocation in the right order.
say"hello" 3 times // syntax error


我会说SQL或COBOL。


好吧,Ruby和Python应该相当接近。Ruby甚至增加了模拟现实生活的特殊关键字。如"除非"关键字等。

当然,如果你用这两种语言中的任何一种输入真正的代码,它就不是真正的自然语言,但又是什么呢?


第四种是反向抛光,对某些人来说很自然。

"快点学,我会的。"尤达。


vb.net的语法非常接近英语。


虽然不是你所要求的,但是有一些语言可以实现你想要的,但是来自另一个方向。例如,lojban是一种被用作自然语言的语言,但没有歧义。

Lojban (pronounced [?lo?ban]) is a
constructed, syntactically unambiguous
human language based on predicate
logic.


自然语言是模棱两可的,要理解它需要的不仅仅是字面上的线性阅读。但是,在这一点上,vb.net已经接近了一些构造。我见过的最接近的。

对于vb.net中的循环

1
2
3
For i = 0 To 2
  'loop time!
Next i

它就像我看到的那样"自然",没有太冗长。


这就是所谓的"伪代码"。您可以使用任何必要的方法来传达代码的意图(您已经编写了代码,或者稍后将要编写代码)。

任何编程语言都有一些对外界不明确的特性。


我相信你的问题是基于一个谬论。编程不主要是从人类语言到计算机语言的翻译。理解技术问题和设计程序是很困难的,输入代码是次要的部分。学习编程语言不会使人成为程序员,就像学习音乐符号会使人成为作曲家一样。

也就是说,如果你用几乎任何一种语言在足够高的水平上写作,花几分钟解释语法,你就可以把一段代码的要点传达给一个专门的非程序员。相反,一个足够精确的自然语言规范有时可以被翻译成高层次的功能(尽管人们很少愿意付出努力来编写这样的规范)。


AppleScript看起来像自然语言。


我相信威廉·莎士比亚是世界上最好的程序员…

莎士比亚的编程语言


创建COBOL的目的是为了像自然语言一样(在本例中是英语)。


有了Ruby和Oslo(可能还有F),您可以构建一个非常语言友好的DSL。这至少是奥斯陆的承诺。您可以在这里找到一个奥斯陆BDD语法的例子。


梵文接近你所描述的。它没有冗余,是第一种遵循BNF的语言,而BNF是所有现代程序的基础。语言语法,它与英语有着共同的印欧语系血统


我希望有一种通用的面向业务的语言,读起来像英语,这样每个人,即使是非程序员也无法忍受…也许我们应该创造一个!(从这里被偷)


COBOL接近英语

我相信标志也离英语不远


我想起了埃菲尔。引自此处:

Raphael Simon, lead software engineer
for Eiffel Software, said the language
was designed so that one could use
natural language to write the program.

例如,参见99瓶啤酒计划。

我不认为这是最自然的,但我觉得这很自然。


我们通常所说的"伪代码"非常非常接近帕斯卡。这可能不会使它特别接近自然英语,但如果它不比大多数语言简单,我们根本不会写伪代码(我们只写代码)。


我提议卢亚。样例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function modulus(num, mod)
    return num % mod
end
for i = 1, 1000 do
    local done = false
    if modulus(i, 3) == 0 then
        print("Fizz")
    else if modulus(i, 5) == 0 then
        done = true
        print("Buzz")
    end
    if modulus(i, 5) == 0 and not done then
        print("Buzz")
    end
    print("")
end

不是最喜欢的英语,但很难读,即使我自己也这么说!


对我来说,它是Python。

牛传染性胃肠炎病毒


当然,它还必须有能力生成概念,然后"命名"这些概念,这样这些概念就可以用来表示更复杂的结构,也就是说,基本上需要对世界本体有某种支持,它应该被用于。我认为,如果像早期文章中描述的"通知"语言,再加上一些后端概念网络或本体数据库,将是一个很好的开始方式。


自然语言因其语法不一致而臭名昭著。任何自然语言中最一致的语法都是梵语。事实上,这种语言的结构是如此稳固,以至于有可能有一个基于发音的突出搜索引擎。唉,这种语言或多或少是死的。