【问题标题】:Text parsing: Distinguish between "dictionary words" and names文本解析:区分“字典单词”和名称
【发布时间】:2013-03-14 16:57:13
【问题描述】:

我有包含“字典单词”和名称的英语和德语文本。

例如“......画家莱昂纳多在佛罗伦萨建造......”

我有一个 Java 程序,需要确定每个单词是相应语言的名称还是单词。

例如names={..., Florence, Leonardo, ...}, 语言词={..., In, the, painter, built, ...}

我看到了两种方法:

  1. 使用相应的字典列表,将其加载到哈希结构中,查看单词是否在其中(语言单词)(名称/拼写错误)。

    问题/问题:

    我找不到排除姓名的德语单词列表

    单词屈曲(德语复杂)可能不在列表中

  2. 使用服务/api将单个单词翻译成另一种语言,查看单词是否更改(语言单词)或未更改(名称/拼写错误)。

    问题/问题:

    名称也可以翻译,例如佛罗伦萨 > 弗洛伦茨

    我找不到离线字典列表/api。所以我想使用在线服务是可行的,但像谷歌翻译这样的大服务不是免费的。

当然,有些名称类似于字典单词,在这两种方法中,它们都被识别为字典单词,这很好。

主要问题是:是否有没有英文和德文名称的综合字典列表,最好是单词屈曲?

或者: 是否有免费的(在线)API 来完成这项任务?还有其他解决方案吗?

【问题讨论】:

  • 我想通过测试它是否不在字典或任何其他集合中来测试一个单词是否是一个名称,这在计算上会非常昂贵。也许有一个启发式方法可以用来测试一个词是否可能是一个名字......
  • 我知道一个人正在研究这个问题(德语解析和语法,他必须从单词中识别名字)作为他的 AI 博士学位..所以我认为没有任何简单的方法..
  • @SoulDZIN 它是否快速完成并不重要。此外,在哈希中查找单词,例如HashSet,即使是一万个单词,也非常快。
  • @shokkokkok 是的,但是如果您要在 HashSet 上进行哈希查找,那么不会有内存成本吗?这种问题听起来像您可能想要构建一个“isName”启发式,而不是查找蛮力方法。另一个考虑是,如果某人的名字与字典中的单词相同怎么办?..(如果我走远了,请原谅我,我不熟悉德语)
  • @SoulDZIN 我认为内存不是问题。让我们假设资源没有问题。但你是对的,当然有些名字是字典单词。在这两种方法中,它们都被识别为字典单词,这很好。

标签: java parsing text dictionary


【解决方案1】:

您可以通过检查第一个字母是否为大写来找到很多名称。之后,您将排除所有以句尾字符 {".", "!", "?"} 结尾的字符。

假设它更像是一个故事,假设一个名字会出现不止一次是很安全的。使用您已经找到的所有名称,并将它们与出现在句尾字符之后的所有大写单词的列表进行核对。添加平等的人。

只有在你想要每一次出现时才应该完成第二部分,而不仅仅是发生的那些。

至少,我会这样处理它。

编辑:我对德语不太熟悉,但我的方法确实会在德语方面存在一些问题。请参阅 Joop Eggen 针对该语言的解决方案。

【讨论】:

    【解决方案2】:

    是的,德语有点问题,因为非名字的名词也是大写的。

    虽然有一个语言属性。尽管人们可以说“美丽的弗洛伦茨”(“das schöne Florenz”),但对于个人名,在前面使用冠词/形容词的情况非常少见。除了复数形式,“the Müllers”(“die Müllers”)也可以考虑。

    所以你只需要一个地名列表等等。

    并检测前面的文章/形容词(der/die/das/... 和 -e/-en/-...)。

    【讨论】:

    • 我不是在寻找解析短语,而是寻找单个孤立的单词。因此,在您的示例中,如果算法将“the”识别为语言单词并将“Müllers”识别为名称,这将是可以接受的,这正是使用没有名称的字典哈希将完成的。
    • “Müller”(米勒)另一方面会被识别为字典词,这很好。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多