【问题标题】:How to check whether a sentence is correct (simple grammar check in Python)?如何检查一个句子是否正确(Python中的简单语法检查)?
【发布时间】:2012-05-02 09:44:53
【问题描述】:

Python中如何判断一个句子是否有效?

例子:

I love Stackoverflow - Correct
I Stackoverflow love - Incorrect

【问题讨论】:

    标签: python nlp grammar


    【解决方案1】:

    有各种提供自动校对和语法检查的 Web 服务。有些有一个 Python 库来简化查询。

    据我所知,这些工具中的大多数(当然是在截止日期之后和 LanguageTool)都是基于规则的。将检查的文本与描述常见错误的大量规则进行比较。如果规则匹配,软件将其称为错误。如果规则不匹配,软件什么也不做(它无法检测到它没有规则的错误)。

    After the Deadline

    import ATD
    ATD.setDefaultKey("your API key")
    errors = ATD.checkDocument("Looking too the water. Fixing your writing typoss.")
    for error in errors:
     print "%s error for: %s **%s**" % (error.type, error.precontext, error.string)
     print "some suggestions: %s" % (", ".join(error.suggestions),)
    

    预期输出:

    grammar error for: Looking **too the**
    some suggestions: to the
    spelling error for: writing **typoss**
    some suggestions: typos
    

    可以在您自己的机器上运行服务器应用程序,建议使用 4 GB RAM。

    LanguageTool

    https://pypi.python.org/pypi/language-check

    >>> import language_check
    >>> tool = language_check.LanguageTool('en-US')
    >>> text = 'A sentence with a error in the Hitchhiker’s Guide tot he Galaxy'
    >>> matches = tool.check(text)
    
    >>> matches[0].fromy, matches[0].fromx
    (0, 16)
    >>> matches[0].ruleId, matches[0].replacements
    ('EN_A_VS_AN', ['an'])
    >>> matches[1].fromy, matches[1].fromx
    (0, 50)
    >>> matches[1].ruleId, matches[1].replacements
    ('TOT_HE', ['to the'])
    
    >>> print(matches[1])
    Line 1, column 51, Rule ID: TOT_HE[1]
    Message: Did you mean 'to the'?
    Suggestion: to the
    ...
    
    >>> language_check.correct(text, matches)
    'A sentence with an error in the Hitchhiker’s Guide to the Galaxy'
    

    也可以私下运行服务端。

    Ginger

    此外,this 是一个用于 Ginger 的 hacky(屏幕抓取)库,可以说是目前最完善的免费语法检查选项之一。

    微软Word

    应该可以编写 Microsoft Word 脚本并使用其语法检查功能。

    更多

    有一个curated list of grammar checkers on Open Office website。 Patrick 在 cmets 中注明。

    【讨论】:

    • 我还没有尝试过其他方法,但 FWIW LanguageTool 并没有完全 提供请求的行为。例如,I love you.I you love. 都解析为完全有效。
    • 只是补充一下,其中大多数显然使用Open Office Grammar 检查器;他们的网站上有一个类似服务的列表和some open source implementations。 (有趣的事实——他们的文档中有几个语法错误)。
    • @patrick 我的理解是这些项目大多是独立的。与 Open Office 的唯一关系是它们的集成。他们可以连接到 Open Office API 并从 Open Office 内部提供语法建议。不过,检查器列表很有用。谢谢。
    • 需要注意的是language-check需要Java。
    【解决方案2】:

    查看NLTK。它们支持可用于解析句子的语法。您可以定义语法,或使用提供的语法以及上下文无关的解析器。如果句子解析,则它具有有效的语法;如果不是,那么它不会。这些语法可能没有最广泛的覆盖范围(例如,它可能不知道如何处理像 StackOverflow 这样的单词),但是这种方法将允许您具体说明语法中的有效或无效。 NLTK 书籍的Chapter 8 涵盖了解析,应该解释您需要了解的内容。

    另一种方法是编写 Python 接口到覆盖范围广泛的解析器(如 Stanford parserC&C)。这些是统计解析器,即使他们以前没有看过所有的单词或所有的语法结构,也能理解句子。缺点是有时解析器仍然会返回一个语法错误的句子的解析,因为它会使用统计信息来做出最好的猜测。

    所以,这真的取决于你的目标是什么。如果您想非常精确地控制被认为是语法的内容,请使用带有 NLTK 的上下文无关解析器。如果您想要稳健性和广泛的覆盖范围,请使用统计解析器。

    【讨论】:

    • 我检查了 NLTK 文档 - nltk.googlecode.com/svn/trunk/doc/howto/parse.html。它表明我们首先定义了语法。但是如果我不知道输入的句子结构,我该怎么做呢?
    • @ChamingaD,你的意思是你不明白如何定义上下文无关语法(CFG)?如果是这种情况,您可能应该搜索有关 CFG 的信息并阅读,以便了解如何定义语法。
    • @ChamingaD 'dhg' 建议的链接是Chapter 8. 你可以找到通往'grammars' here ←的方法@
    • 感谢 @dhg 和诚实的 Abe。我几乎没有阅读文档并检查了样本。在那个 CFG 中,我们必须定义名词和动词吗?例如-N->“人”| “狗” | “猫” | “望远镜” | “公园”。
    • 这不是可用的建议(尤其是 cmets)。为不平凡的英语片段编写显式 CFG 是一项不可能完成的任务,除非您有一个庞大的团队和大量时间。几乎 NOBODY 对现实世界的文本使用手写规则。统计技术要强大得多,但它们不能轻易地说“这是不合语法的”。 OP 的问题比这个答案所暗示的要困难得多。
    【解决方案3】:

    其他一些答案提到了LanguageTool,最大的开源语法检查器。直到现在,它还没有可靠的、最新的 Python 端口。

    我推荐language_tool_python,这是一个支持 Python 3 和最新版本的 Java 和 LanguageTool 的语法检查器。它是唯一最新的、免费的 Python 语法检查器。 (完全公开,我做了这个库)

    【讨论】:

    • 非常好。 @jxmorris 推荐使用什么机器(RAM)?请指教。
    • @Serhiy language_tool_python 在我的笔记本电脑(Macbook Pro 15")上运行良好。我认为 RAM 不应该成为瓶颈。
    【解决方案4】:

    我建议language-tool-python。例如:

    import language_tool_python
    tool = language_tool_python.LanguageTool('en-US')
    
    text = "Your the best but their are allso  good !"
    matches = tool.check(text)
    len(matches)
    

    我们得到:

    4
    

    我们可以看看它发现的 4 个问题:

    第 1 期:

    matches[0]

    我们得到:

    Match({'ruleId': 'YOUR_YOU_RE', 'message': 'Did you mean "You\'re"?', 'replacements': ["You're"], 'context': 'Your the best but their are allso  good !', 'offset': 0, 'errorLength': 4, 'category': 'TYPOS', 'ruleIssueType': 'misspelling'})
    

    第二期:

    matches[1]

    我们得到:

    Match({'ruleId': 'THEIR_IS', 'message': 'Did you mean "there"?', 'replacements': ['there'], 'context': 'Your the best but their are allso  good !', 'offset': 18, 'errorLength': 5, 'category': 'CONFUSED_WORDS', 'ruleIssueType': 'misspelling'})
    

    第三期: matches[2] 我们得到:

    Match({'ruleId': 'MORFOLOGIK_RULE_EN_US', 'message': 'Possible spelling mistake found.', 'replacements': ['also', 'all so'], 'context': 'Your the best but their are allso  good !', 'offset': 28, 'errorLength': 5, 'category': 'TYPOS', 'ruleIssueType': 'misspelling'})
    

    第 4 期:

    matches[3]

    我们得到:

    Match({'ruleId': 'WHITESPACE_RULE', 'message': 'Possible typo: you repeated a whitespace', 'replacements': [' '], 'context': 'Your the best but their are allso  good!', 'offset': 33, 'errorLength': 2, 'category': 'TYPOGRAPHY', 'ruleIssueType': 'whitespace'})
    

    如果您正在寻找更详细的示例,可以查看Predictive Hacks的相关帖子

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 2019-01-06
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多