小编dri*_*her的帖子

通过语法检查从一组可能性中选择最流畅的文本(Python)

一些背景

我是佛罗里达新学院的文学专业学生,目前正致力于一个过于雄心勃勃的创意项目.该项目旨在实现诗歌的算法生成.它是用Python编写的.我的Python知识和自然语言处理知识只来自于通过互联网自学.我已经使用这些东西大约一年了,所以我并非无助,但在不同的方面,我在这个项目中遇到了麻烦.目前,我正在进入最后的发展阶段,并且遇到了一些障碍.

我需要实现某种形式的语法规范化,这样输出就不会像未绑定/变形的穴居人那样出现.大约一个月前SO上的一些友好人员给了我一些关于如何通过使用ngram语言建模器解决这个问题建议,基本上 - 但我正在寻找其他解决方案,因为看起来NLTK的NgramModeler不适合我的需要.(也提到了POS标签的可能性,但是我的文字可能太过零碎而且很奇怪,因为我的业余爱好者可以很容易地实现这一点.)

也许我需要像AtD这样的东西,但希望不那么复杂

我认为需要一些像截止日期Queequeg之类的东西,但这些都不是完全正确的.Queequeg可能不太合适 - 它是2003年为Unix编写的,我无法让它在Windows上工作(我已经尝试了一切).但我喜欢它所检查的是正确的动词共轭和数字协议.

另一方面,AtD更严格,提供的功能超出了我的需求.但我似乎无法得到它的python绑定工作.(我从AtD服务器得到502错误,我肯定很容易修复,但我的应用程序将在线,我宁愿避免依赖另一台服务器.我负担不起运行AtD服务器我自己,因为我的应用程序需要我的网站主机的"服务"数量已经威胁到导致这个应用程序廉价托管的问题.)

我想避免的事情

自己构建Ngram语言模型似乎不适合这项任务.我的应用程序抛出了许多未知的词汇,扭曲了所有的结果.(除非我使用的语料库太大而且对我的应用程序运行速度太慢 - 应用程序需要非常活泼.)

严格检查语法既不适合完成任务.语法不需要是完美的,并且句子不必比使用ngrams生成的类似英语的乱码更合理.即使它是乱七八糟的,我只需要强制动词共轭,数字协议,并做一些事情,如删除额外的文章.

事实上,我甚至不需要任何修正建议.我认为我需要的只是为了计算一组可能句子中每个句子中出现的错误数量,所以我可以按照他们的分数进行排序并选择语法问题最少的句子.

简单的解决方案?通过检测明显的错误来评分流畅度

如果存在一个处理所有这些的脚本,我会高兴极了(我还没有找到).当然,我可以为我找不到的代码编写代码; 我正在寻找有关如何优化我的方法的建议.

假设我们已经列出了一些文字:

existing_text = "The old river"

现在让我们说我的剧本需要弄清楚接下来可能会出现哪些动词"承受".我对这个例程的建议持开放态度.但我主要通过步骤#2获得帮助,通过计算语法错误来评定流畅度:

  1. 使用NodeBox语言学中的动词共轭方法来提出这个动词的所有结合; ['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. 迭代可能性,(浅)检查由existing_text + " " + possibility("老河熊","老河熊"等)产生的字符串的语法.计算每个构造的错误计数.在这种情况下,似乎唯一提出错误的建筑是"老河熊".
  3. 包装应该很容易......在错误计数最低的可能性中,随机选择.

python grammar nlp linguistics nltk

30
推荐指数
2
解决办法
2838
查看次数

Celery + Django:无法在Windows 7上启动celerybeat

奇怪的问题在这里.我一直在开发Django应用程序,现在我正在尝试实现Celery.我需要排队正常任务和定期任务.我可以很好地启动celeryd,并用它执行任务(我用命令启动它python manage.py celeryd start --settings=settings --loglevel=INFO).

在Windows上,您无法执行-beat/ -b启用节拍模式; 您需要将celerybeat作为单独的服务启动(这在Celery文档的FAQ部分中说明).如果我在命令行输入 - python manage.py celerybeat -s djcelery.schedulers.DatabaseScheduler --settings=settings --loglevel=INFO- 我得到这样的错误:

[2012-01-02 19:06:52,009: WARNING/MainProcess] ERROR: Pidfile (celerybeat.pid) a
lready exists.
Seems we're already running? (PID: 2364)
[2012-01-02 19:06:52,012: INFO/MainProcess] process shutting down
Run Code Online (Sandbox Code Playgroud)

而celerybeat从未真正开始.所以我不能执行任何定期任务......任何想法?我只找到另一个页面,其中有人突出显示类似的错误,但没有提供解决方案.

如果需要进一步的信息,请告诉我.我很困惑,因为我找不到关于这个主题的任何信息,我一直在努力解决这个问题今天...谢谢.

python windows django celery django-celery

12
推荐指数
2
解决办法
5061
查看次数

一些NLP与Python中的语法,标记,词干和词义消歧有关

背景(TLDR;为完成而提供)

寻求针对奇怪要求的最佳解决方案的建议. 我是大学四年级的(文学)学生,只有我自己的编程指导.我对Python有足够的能力,我不会在实现我发现的解决方案(大部分时间)和开发它们时遇到麻烦,但是由于我的新意,我正在寻找有关解决这个特殊问题的最佳方法的建议.

已经使用NLTK,但与NLTK书中的示例不同.我已经在使用NLTK的很多东西了,特别是WordNet,所以这些材料对我来说并不陌生.我读过大部分的NLTK书.我更懂得如何处理,如果我试图分析现有的文本,或者目标文本是散文般的-但我的应用程序是专注于诗歌,特别是对即时构建诗意文本的基础上,不可预见的输入来自用户.

我正在使用零碎的原子语言.我的应用程序逐字移动:每轮,几个用户输入单词(每个用户一个单词).我的程序试图统一或组合这些输入词以产生单个输出词.我已经开发了字选择算法 - 它利用WordNet的各种功能来提出单字结果.结果是WordNet synset的形式 - 一个未反射的单词(剥离多个和紧张).结果被附加到"诗"的文本中(在一些空格之后).添加所产生的字会影响用户对什么词来扔进锅里下一个选择,那就是如何这个游戏/程序一起运动,在每次添加一个机器演变字的诗句.

问题:如何以语法合理的方式影响结果?没有任何语法处理,结果只是一个字典可搜索的单词列表,没有单词之间的协议.第一步是我的应用程序根据上下文来阻止/复数/共轭/变形根词.(我所说的"根词"是来自WordNet和/或其人类可读等同物的同义词.)想象一下,诗中已经有一些语法敏感的文本开始,我的应用程序需要反映一个新的结果 - 同意现有序列的词.如果它只是像一个3字的窗口或其他东西一样工作,这很好,但我正在寻找有关最佳操作顺序的建议.我希望有人可以给我一些指示(我希望它很难实现,但我想确保我从正确的想法开始).

示例场景(更少上下文更多问题)

让我们假设我们已经有了一首诗,用户正在向其中添加新的输入.新结果需要以语法合理的方式进行变换.

The river bears no empty bottles, sandwich papers,   
Silk handkerchiefs, cardboard boxes, cigarette ends  
Or other testimony of summer nights. The nymphs
Run Code Online (Sandbox Code Playgroud)

比方说,我的算法已经采取了一批从输入的用户,现在需要打印的4个可能接下来的话1 /同义集(非正式代表): ['departure', 'to have', 'blue', 'quick'].在我看来'blue'应该被抛弃; 'The nymphs blue'似乎语法奇怪/不太可能.从那里它可以使用这些动词中的任何一个.

如果它选择'to have'的结果可以被合理地活用为'had','have','having','will have','would have',等(但不包括'has').(由此产生的结果将是类似的'The nymphs have',明智的结果将为未来的结果提供更好的背景......)

'depature'在这种情况下,我希望成为一个有效的可能性; …

python tagging grammar nlp nltk

10
推荐指数
1
解决办法
2404
查看次数

RegEx Tokenizer:将文本拆分为单词,数字,标点符号和间距(不要删除任何内容)

几乎这个帖子中找到了这个问题的答案(samplebias的回答); 但是我需要将一个短语分成单词,数字,标点符号和空格/制表符.我还需要这个来保持每个事件发生的顺序(该线程中的代码已经完成).

所以,我发现的是这样的:

    from nltk.tokenize import *
    txt = "Today it's   07.May 2011. Or 2.999."
    regexp_tokenize(txt, pattern=r'\w+([.,]\w+)*|\S+')
    ['Today', 'it', "'s", '07.May', '2011', '.', 'Or', '2.999', '.']
Run Code Online (Sandbox Code Playgroud)

但这是我需要提供的那种列表:

    ['Today', ' ', 'it', "'s", ' ', '\t', '07.May', ' ', '2011', '.', ' ', 'Or', ' ', '2.999', '.']
Run Code Online (Sandbox Code Playgroud)

正则表达式一直是我的弱点之一,所以经过几个小时的研究后,我仍然感到难过.谢谢!!

python regex tokenize nltk

8
推荐指数
1
解决办法
3821
查看次数

Django - 测试 - @login_required装饰器的问题

问题

更新:事实证明,这个问题与@login_required装饰者没什么关系!

当我尝试测试装饰的视图时,我会遇到挑剔的行为@login_required.

我有一个测试实际上可以进入装饰的视图@login_required(密码更改视图).但是,不同的测试总是被重定向到登录.无论我尝试重写它的哪种方式,它都不会让我的测试用户通过,即使我正在记录用户并user.is_authenticated()事先断言.

以下是有问题的相关测试片段:

# Log user in
self.client.login(username=user.username, password=user.password)
self.assertTrue(user.is_authenticated())

# Go to account_edit view
url = reverse('account_edit')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'users/account_edit_form.html')
Run Code Online (Sandbox Code Playgroud)

这不可避免地会重定向到登录视图,就好像用户没有登录一样.

我可以确认这种行为没有反映在应用程序的"正常"功能中; 当我实际运行服务器然后导航到此视图时,装饰器的工作方式完全正常(即,它允许在登录时访问,并重定向到登录视图).

使用Django 1.3.1.我正在使用来自django-nose的testrunner,但我可以确认无论我使用哪个testrunner都会发生这个问题.

此外,我发现了之前的几个问题,但建议的解决方案要么特别适用于旧版本的Django,要么在这种情况下没有帮助(例如,请参见此处).

解决方案(结合两个好的答案)

我收到了两个非常好的答案,这两个问题突出了我发布的片段中的重要疏忽.这个问题与@login_required行为无关,而且与(a)用户签名错误和(b)检查用户身份验证错误有关.

我很难选择接受哪个答案,但经过一番思考后,我决定接受KonradHałas的答案,因为它确定了我的关键疏忽,这是意外行为的根源.

尽管如此,如果我没有使用错误的测试线,我会更早地想出来self.assertTrue(user.is_authenticated()).因此,要强调解决方案实际上是两个部分,以下是修复有问题代码的两个步骤:

# Log user in *NOTE: Password needs to be raw (from Konrad's answer)
self.client.login(username=user.username, password="pass")
self.assertTrue(user.is_authenticated()) # <-- still not correct
Run Code Online (Sandbox Code Playgroud)

断言行仍然有问题,因为有效用户总是满足user.is_authenticated().有关此问题的解释,请参阅Alasdair的信息.因此修复此代码的第二步是:

# Log user in …
Run Code Online (Sandbox Code Playgroud)

python testing django unit-testing django-authentication

8
推荐指数
1
解决办法
2504
查看次数

在任意深度的嵌套字典上行走/迭代(字典代表目录树)

我几乎可以肯定有一个简单的解决方案,但我现在花了几个小时阅读和重读相同的一组相关结果,这些结果并没有完全解决我的问题.

这个问题的背景(包括完成但可以跳过这个)

出现这种情况是因为我希望用户能够从目录(以及任何子目录)中选择一组文件,不幸的是,Tkinter在文件对话框中选择多个文件的默认功能在Windows 7上被破坏(http:/ /bugs.python.org/issue8010).

因此,我试图通过另一种方法(仍然使用Tkinter)来表示目录结构:构建目录结构的传真,由标记和缩进复选框(在树中组织)组成.因此像这样的目录:

\SomeRootDirectory
    \foo.txt
    \bar.txt
    \Stories
        \Horror
            \scary.txt
            \Trash
                \notscary.txt
        \Cyberpunk
    \Poems
        \doyoureadme.txt
Run Code Online (Sandbox Code Playgroud)

看起来像这样(其中#代表一个checkbutton):

SomeRootDirectory
    # foo.txt
    # bar.txt
    Stories
        Horror
            # scary.txt
            Trash
                # notscary.txt
        Cyberpunk
    Poems
        # doyoureadme.txt
Run Code Online (Sandbox Code Playgroud)

使用我在ActiveState中找到的某个配方(见下文),可以很容易地从目录结构构建原始字典,但是当我尝试迭代我留下的精美嵌套字典时,我遇到了问题.而且我认为我需要迭代它以便使用树的漂亮网格表示来填充Tkinter帧.然后我希望通过解释哪些复选框为true或false来加载用户选择的各种文本文件.除了在修复深度的情况下迭代字典外,一切看起来都相当容易.

用更抽象的术语来说

要制作这些嵌套的词典,我使用的是ActiveState配方 - http://code.activestate.com/recipes/577879/.它实现了os.walk来制作如下的字典:

a={
    'SomeRootDirectory': {
        'foo.txt': None,
        'bar.txt': None,
        'Stories': {
            'Horror': {
                'horror.txt' : None,
                'Trash' : {
                    'notscary.txt' : None,
                    },
                },
            'Cyberpunk' : None
            },
        'Poems' : {
            'doyoureadme.txt' : None
        }
    } …
Run Code Online (Sandbox Code Playgroud)

python iteration tree recursion dictionary

7
推荐指数
2
解决办法
1万
查看次数