如何以编程方式处理英文缩写 [Regex, JS, Ruby]
Posted
技术标签:
【中文标题】如何以编程方式处理英文缩写 [Regex, JS, Ruby]【英文标题】:How to deal with English contractions programmatically [Regex, JS, Ruby] 【发布时间】:2017-09-04 06:01:13 【问题描述】:我正在捕获自然语言用户输入,我需要根据预定义的“正确”版本对其进行检查。这是微不足道的,但我不确定如何处理英语中的收缩变化。
假设我期待句子 I'm positive you don't know what you're doing.
匹配需要准确,但我不想将用户锁定在一个变体中,因为那样会很快让人沮丧。
那么,我是否应该手动输入该句子的所有可能变体作为有效匹配项?像这样:
"I'm positive you don't know what you're doing."
"I am positive you don't know what you're doing."
"I am positive you do not know what you're doing."
"I am positive you do not know what you are doing."
"I'm positive you don't know what you are doing."
...
等等等等。想想更复杂的句子,你会发现这有多令人抓狂。
或者,有没有一种程序化的方式可以处理这个问题?使用 Regex、JS、Ruby 或 Rails(我正在使用的工具)?
任何帮助表示赞赏,谢谢。
【问题讨论】:
如何选择关键词和短语 - 所以在你上面的例子中,这将是积极的,不知道和正在做 为什么在检查句子之前不执行简单的正则表达式替换?像\bdo not\b
=> don't
, \bI am\b
=> I'm
等。
见javascript fuzzy search that makes sense
@CasimiretHippolyte 好主意,我没想到。它可能会起作用,谢谢。
@user2182349 不幸的是,检查每个单词很重要。
【参考方案1】:
不可能有那么多English contractions。我会将每个变体存储为指向相同值的键,例如(伪 Ruby 风格,但当然可以用 JS 完成)
"aren't" => :arent
"are not" => :arent
etc.
然后使用共享值存储正确的句子。
":im positive you :dont know what :youre doing"
当您收到输入时,将匹配的键替换为其存储的值,然后将转换后的句子与正确的句子进行对比,并以特殊标记的缩写形式存储。
(注意:对于少数情况,您可能希望单独回应具有相同缩写的不同短语,请做出特殊规定。)
【讨论】:
我非常喜欢这种方法,非常聪明。我会花一些时间来获得更多想法,因为我现在要睡觉了,但我可能会接受你的回答。谢谢! @SanDiago 感谢您的评论。我们都可以从不同的想法和答案中学到更多。好问题。 附注's
可以作为“is”或“has”的缩写形式附加到几乎任何英语名词之后。 “那条狗的眼睛很漂亮。”是第二个例子。另外,比较“约翰不在这里”。 “约翰不在这里。”所以说收缩可以很容易地列举出来并不十分准确,也不能说它们是明确的。
@rici 您提到的缩略语是口语而非书面英语的一部分(请参阅这篇文章,其中说:“在名词、名称、here、there 和 now 以及疑问词之后可以出现收缩。这些缩写在正式写作中被认为是不合适的。”(dictionary.cambridge.org/us/grammar/british-grammar/writing/…) 实际上,它们可能会使这项任务变得更有趣和更具挑战性,并且取决于 OP 对“正确句子”的规范。
@rici 但是既然你提出来了……为[name] + 's not
和[name] + isn't
以及其他类似的示例进行共享匹配似乎并不牵强。由于 OP 可能对特定句子进行了硬编码,而不是尝试使用英语语法 AI,因此可能会像其他人一样关注这些。以上是关于如何以编程方式处理英文缩写 [Regex, JS, Ruby]的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将 ethers.js 库与 Rinkeby 连接?