【问题标题】:How to find Title case phrases from a passage or bunch of paragraphs如何从一段或一堆段落中找到标题案例短语
【发布时间】:2010-11-23 12:42:31
【问题描述】:

如何从段落中解析句子的案例短语。

比如这段话

柯南·道尔说,福尔摩斯这个角色的灵感来自约瑟夫·贝尔博士,道尔曾在爱丁堡皇家医院担任职员。和福尔摩斯一样,贝尔以从最小的观察中得出大的​​结论而著称。 [1]迈克尔·哈里森 (Michael Harrison) 在 1971 年 Ellery Queen 的神秘杂志 (Ellery Queen's Mystery Magazine) 的一篇文章中辩称,该角色的灵感来自温德尔·谢勒 (Wendell Scherer),他是一名谋杀案的“咨询侦探”,据称该案于 1882 年在英格兰引起了报纸的大量关注。

我们需要生成像柯南道尔、福尔摩斯、约瑟夫贝尔博士、温德尔谢尔等这样的东西。

如果可能,我更喜欢 Pythonic 解决方案

【问题讨论】:

  • 你能具体说明句格短语是什么吗? (而不仅仅是举例——尽管举例当然也很有用)
  • “句子大小写”到底是什么意思?
  • 我认为 OP 想知道如何确定/解析哪些单词应该有一个大写字母。
  • @ChrisW 认为 OP 实际上想要提取命名实体...

标签: python parsing nlp text-parsing


【解决方案1】:

这种处理可能非常棘手。这个简单的代码几乎做了正确的事情:

for s in re.finditer(r"([A-Z][a-z]+[. ]+)+([A-Z][a-z]+)?", text):
    print s.group(0)

产生:

Conan Doyle
Holmes
Dr. Joseph Bell
Doyle
Edinburgh Royal Infirmary. Like Holmes
Bell
Michael Harrison
Ellery Queen
Mystery Magazine
Wendell Scherer
England

要包含“Dr. Joseph Bell”,您需要对字符串中的句点表示满意,这允许在“Edinburgh Royal Infirmary. Like Holmes”中使用。

我遇到了类似的问题:Separating Sentences

【讨论】:

  • 请注意,在一般情况下修复“Like Holmes”错误实际上是一个相当困难的问题。对于 OP,请研究句子分块和命名实体提取以获取更多信息,并查看 nltk。
  • 我确实想到了这个解决方案,但在尝试时遇到了几个误报并错过了一些真实案例。我错过的一个例子是我们还需要查看像 Association of Physicians 之类的短语
  • 同意三联画。像 NLTK (nltk.org) 这样的 NLP 库应该用于命名实体识别。
【解决方案2】:

“重新”方法很快就会失去动力。命名实体识别是一个非常复杂的主题,远远超出了 SO 答案的范围。如果你认为你有解决这个问题的好方法,请指出 Flann O'Brien aka Myles na cGopaleen、Sukarno、Harry S. Truman、J. Edgar Hoover、JK Rowling、数学家 L'Hopital、Joe di Maggio、 Algernon Douglas-Montagu-Scott 和 Hugo Max Graf von und zu Lerchenfeld auf Köfering und Schönberg。

更新 以下是一种基于“重新”的方法,可以找到更多有效案例。不过,我仍然认为这不是一个好方法。注:我已经在我的文本示例中将巴伐利亚计数的名字asciified。如果有人真的想使用这样的东西,他们应该在 Unicode 中工作,并在某个阶段(输入或输出)规范化空格。

import re

text1 = """Conan Doyle said that the character of Holmes was inspired by Dr. Joseph Bell, for whom Doyle had worked as a clerk at the Edinburgh Royal Infirmary. Like Holmes, Bell was noted for drawing large conclusions from the smallest observations.[1] Michael Harrison argued in a 1971 article in Ellery Queen's Mystery Magazine that the character was inspired by Wendell Scherer, a "consulting detective" in a murder case that allegedly received a great deal of newspaper attention in England in 1882."""

text2 = """Flann O'Brien a.k.a. Myles na cGopaleen, I Zingari, Sukarno and Suharto, Harry S. Truman, J. Edgar Hoover, J. K. Rowling, the mathematician L'Hopital, Joe di Maggio, Algernon Douglas-Montagu-Scott, and Hugo Max Graf von und zu Lerchenfeld auf Koefering und Schoenberg."""

pattern1 = r"(?:[A-Z][a-z]+[. ]+)+(?:[A-Z][a-z]+)?"

joiners = r"' - de la du von und zu auf van der na di il el bin binte abu etcetera".split()

pattern2 = r"""(?x)
    (?:
        (?:[ .]|\b%s\b)*
        (?:\b[a-z]*[A-Z][a-z]*\b)?
    )+
    """ % r'\b|\b'.join(joiners)

def get_names(pattern, text):
    for m in re.finditer(pattern, text):
        s = m.group(0).strip(" .'-")
        if s:
            yield s

for t in (text1, text2):
    print "*** text: ", t[:20], "..."
    print "=== Ned B"
    for s in re.finditer(pattern1):
        print repr(s.group(0))
    print "=== John M =="
    for name in get_names(pattern2, t):
        print repr(name)

输出:

C:\junk\so>\python26\python extract_names.py
*** text:  Conan Doyle said tha ...
=== Ned B
'Conan Doyle '
'Holmes '
'Dr. Joseph Bell'
'Doyle '
'Edinburgh Royal Infirmary. Like Holmes'
'Bell '
'Michael Harrison '
'Ellery Queen'
'Mystery Magazine '
'Wendell Scherer'
'England '
=== John M ==
'Conan Doyle'
'Holmes'
'Dr. Joseph Bell'
'Doyle'
'Edinburgh Royal Infirmary. Like Holmes'
'Bell'
'Michael Harrison'
'Ellery Queen'
'Mystery Magazine'
'Wendell Scherer'
'England'
*** text:  Flann O'Brien a.k.a. ...
=== Ned B
'Flann '
'Brien '
'Myles '
'Sukarno '
'Harry '
'Edgar Hoover'
'Joe '
'Algernon Douglas'
'Hugo Max Graf '
'Lerchenfeld '
'Koefering '
'Schoenberg.'
=== John M ==
"Flann O'Brien"
'Myles na cGopaleen'
'I Zingari'
'Sukarno'
'Suharto'
'Harry S. Truman'
'J. Edgar Hoover'
'J. K. Rowling'
"L'Hopital"
'Joe di Maggio'
'Algernon Douglas-Montagu-Scott'
'Hugo Max Graf von und zu Lerchenfeld auf Koefering und Schoenberg'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多