【发布时间】:2009-11-07 14:41:42
【问题描述】:
我正在编写一个脚本来反转一段文本中的所有性别,所以所有的性别词都被交换了——“man”与“woman”交换,“she”与“he”交换,等等。但是有关于“her”应该替换为“him”还是“his”的歧义。
【问题讨论】:
-
到目前为止,您的脚本是简单的文本替换,还是进行任何语法分析?
标签: regex nlp linguistics
我正在编写一个脚本来反转一段文本中的所有性别,所以所有的性别词都被交换了——“man”与“woman”交换,“she”与“he”交换,等等。但是有关于“her”应该替换为“him”还是“his”的歧义。
【问题讨论】:
标签: regex nlp linguistics
好的。让我们像语言学家一样看待这个问题。我在这里大声思考。
“Her”是代词。它可以是:
1.所有格代词
这是她的书。
2.人称代词
给她。(在介词之后)
他给她写了一封信。(间接宾语)
他治疗她感冒了。(直接宾语)
让我们看一下情况(1),所有格代词。那就是它是“属格”情况下的代词(意思是,它是“所有格”的名词。好吧,那个细节并不像下一个那么重要。)
在这种情况下,“她”扮演着“决定者”的角色。限定词可能出现在一个句子的两个地方(这是一种简化):
Det + 名词(“她的书”)
Det + Adj + 名词(“她的好书”)
所以要判断她是否是决定者,你可以有这样的逻辑:
一个。如果“her”后面的词是名词,那么“her”是限定词。
b.如果“her”后面的两个词是形容词,那么是名词,那么“her”是限定词”
如果您确定“her”是限定词,那么您就知道必须将其替换为“his”,它也是一个限定词(又名属格名词,又名所有格代词)。
如果它不符合上述标准 (a) 和 (b),那么您可能会得出结论,它 不是 一个判定器,这意味着它必须是人称代词。在这种情况下,您可以将“her”替换为“him”。
您甚至不必进行以下测试,但我还是会尝试描述它们。
从上面看(2):人称代词,而不是所有格。这变得更棘手了。
上面的例子显示了“她”以 3 种方式出现:
(1) 给她。(在介词之后。我们称之为“介词宾语”。)
因此,您也许可以设计一个规则:“如果 'her' 紧跟在介词之后,则应将其视为名词,因此我们将其替换为 'him'”。
接下来的两个很棘手。 “她”可以是直接对象或间接对象。
(2) 他给她写了一封信。(间接宾语)
(3) 他对待她感冒了。(直接宾语)
在语法上,我们如何区分?
直接宾语出现在动词之后。
如果你有一个动词,后面跟着一个名词,那么这个名词就是一个直接宾语。例如:
他对待了 她。*
如果你有一个动词,后面跟着一个名词,然后是一个介词短语,那么这个名词就是一个直接宾语。
他为 her 感冒了。(“her”是名词,紧跟在动词“treated”之后。“for a cold”是介词短语。)
这意味着您可以说“如果您有动词 + 名词 + Prep”,那么名词就是直接宾语。既然名词是直接宾语,那就是人称代词,所以用“他”。 (注意,您只需要检查介词,而不是整个预备短语,因为短语总是以介词开头。)
如果它是一个间接宾语,那么你将有“动词+名词+名词”的形式。
他给她写了一封信。(“her”是名词,“letter”是名词。嗯,“a letter”是“名词短语” ,因此您还必须考虑决定因素。)
所以...如果“her”是直接宾语、间接宾语或 prep 的 obj,则可以将其更改为“him”,否则,将其更改为“his”。
这个方法看起来要复杂得多——所以我首先检查“her”是否是限定符(见上文),如果是限定符,则使用“his”,否则使用“him” ”。
所以,上面有很多简化。它不包括“打断短语”、从句结构、选区测试、嵌入从句、标点符号或类似的东西。
此外,此解决方案还需要一本字典——“名词”、“动词”和“介词”的列表,以便您可以确定句子中每个单词的词汇类别。
即使在那里,自然语言处理也很难。您想为您的模型进行某种“训练”以获得良好的解决方案。但是对于非常简单的事情,请尝试上面描述的一些东西。
抱歉这么啰嗦! (现有的答案都没有给出任何硬数据或精确的语言定义,所以就这样吧。)
【讨论】:
鉴于您的项目范围:反转所有与性别相关的词,看来:
此外,Regex 似乎也是一个糟糕的工具选择;自然语言不是常规语言;-)。
相反,您应该考虑引入Part-of-Speech (POS) tagging,可能带有Named Entity Recognition 的提示,然后根据标记提供的额外信息应用替换规则。
这似乎需要做很多工作,但如果您的脚本语言恰好是 Python,您可以利用 NTLK 以相对较小的工作量来实现所有这些。
【讨论】:
生日,
在这种情况下,您可能会花费大量时间来跟踪自动解决方案并最终得出一个您无论如何都必须检查的结果。
我建议让您的脚本插入一段文本,该文本在“她”的每一个实例中都能真正突出,并且易于搜索。甚至可以让脚本同时插入 "him" 和 "his" 字符串,这样您在看到上下文后只需要删除其中一个?
通过这种方式,您将节省大量时间和精力。更别提血、汗、泪了! (-:
想出一个全自动的解决方案绝非易事,因为它需要扫描大量的词库以确定下一个词是否是对象。
有时获得额外 5% 或 10% 的改进并不值得付出额外的努力。当然,除了作为一些教科书似乎喜欢的“它作为一个有趣的练习留给读者......”类型的问题。
编辑:我忘了说找到这个“临界点”是一门真正的艺术。绝对是一项只有经验才能获得的技能。 (-:
编辑:第二部分 - 复仇 我还忘了提到您可以消除一种极端情况。如果“他”这个词后面跟着标点符号,例如“……给她。”、“……给她”等等,那么您可以消除这些情况的不确定性,并将它们替换为“他”。类似地,如果单词后面跟着一类单词,例如“... for her to”可以轻松地将“her”替换为“him”。 编辑 3:这不是完整的例外列表,而只是作为您需要查找的项目列表起点的建议。
HTH
【讨论】:
尝试确定her 是所有格代词还是人称代词比尝试确定him 或his 的类别更难。但是,如果语料库足够大,您会希望两者都在相同的上下文中使用。那么为什么不扭转问题呢?获取一个大型语料库并找到所有出现的him 和his。然后查看它们周围的单词(您需要查看多少单词由您决定)。通过足够的训练示例,您可以估计单词附近的一组给定单词指示him 或his 的概率。然后,您可以使用her 出现的概率估计来确定您应该使用him 还是his。正如其他回复所表明的那样,你不会是完美的。此外,弄清楚要使用多大的社区以及如何计算概率是一项相当大的工作。使用像朴素贝叶斯这样的简单分类器可能会做得很好。
不过,我怀疑,您可以通过查看词性中的模式并编写一些规则来获得相当高的准确性。当然,你会错过一些,但可能有十几个规则会占大多数情况。我刚刚浏览了 Rudyard Kipling 在“The Phantom Rickshaw”中出现的大约 50 个her,您可以很容易地通过规则获得 90% 的准确度:
her_followed_by_noun ? possessive : personal
您可以使用现成的词性 (POS) 标注器(如 Stanford POS Tagger)自动确定单词是名词还是上下文中的其他内容。同样,它并不完美,但效果很好。
奇数子句结构的边缘情况很难正确处理,但它们在大多数文本中也很少出现。这仅取决于您的数据。
【讨论】:
我不这么认为。您可以检查所有格代词后面是名词还是形容词,从而得出结论确实是所有格代词。但是当然你必须编写一个能够做到这一点的脚本,即使你有一个方法,在其他一些情况下它仍然是错误的。一个简单的模式匹配算法在这里帮不了你。
【讨论】:
绝对没有。你必须对你的输入文本进行句法分析(解析英语,真的,这就是“解析”这个词的来源)。这是您可以确定文本中“她”代表什么的唯一方法,您不能依赖搜索和替换。有很多方法可以做到这一点,但我认为没有一种方法可以称为“相当简单”。
【讨论】:
我将解决正则表达式,因为这是标签之一。正则表达式不足以解析人类语言,因为正则表达式不做递归,所有人类语言都是递归的。
当这一事实与英语中的其他歧义相结合时,例如许多单词可以在一个句子中发挥多种功能的方式,我认为可靠的自动化解决方案将是一个非常困难且成本高昂的项目。
【讨论】:
关于我能想到的唯一一个(而且我相信 cmets 中的某个人会证明我错了!)是 her 后跟标点符号的任何实例最有可能替换为 him。但我仍然同意之前的答案,您可能最好手动替换。
【讨论】:
好的,根据人们给出的一些答案,我对如何解决这个问题有了更好的了解。与其尝试编写一个 100% 正确的脚本,我只想尽可能多地使它正确。快速搜索一些英文文本会发现“his”出现的频率(非常粗略)是“him”的两倍,因此默认行为应该是将“her”转换为“his”。如果我只这样做了,那么它应该有三分之二的时间是正确的。
现在我对寻找显示“她”应该转换为“他”的模式不感兴趣,因为无论如何我都会这样做,我只对寻找显示“她”应该的模式感兴趣转换为“他”,因为这些可以让我降低错误率。有两条规则我可以相当轻松地实施:
如果“her”后面紧跟逗号或句号,则应将其转换为“him”,正如 Michael Itzoe 所说。
如果 'her' 紧接在介词之后,则应将其视为名词,如 Rasher 所说,我们将其替换为 'him'。
如果我使用词性标记软件,我将能够做更多的事情。我想我会先做简单的事情:-)
【讨论】: