Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本中提取标题_Python - Fatal编程技术网

Python 从文本中提取标题

Python 从文本中提取标题,python,Python,我正在做一个项目,我必须从一本小说中提取尊称(先生、夫人、圣徒等等)。我正在处理的文本的预期输出是: ['Col', 'Dr', 'Mr', 'Mrs', 'Otto', 'Rev', 'St'] 但是,对于我编写的代码,输出如下: {'Tom.', 'Mrs.', 'Otto.', 'Mary.', 'Bots.', 'Come.', 'No.', 'Col.', 'Cain.', 'Dr.', 'Gang.', 'Ike.', 'Kean.', 'St.', 'Hank.', 'Him.'

我正在做一个项目,我必须从一本小说中提取尊称(先生、夫人、圣徒等等)。我正在处理的文本的预期输出是:

['Col', 'Dr', 'Mr', 'Mrs', 'Otto', 'Rev', 'St']
但是,对于我编写的代码,输出如下:

{'Tom.', 'Mrs.', 'Otto.', 'Mary.', 'Bots.', 'Come.', 'No.', 'Col.', 'Cain.', 'Dr.', 'Gang.', 'Ike.', 'Kean.', 'St.', 'Hank.', 'Him.', 'Finn.', 'Ann.', 'Jane.', 'Alas.', 'Huck.', 'Sis.', 'Buck.', 'Jim.', 'Sid.', 'Mr.', 'Bill.', 'Rev.', 'Yes.'}
这是我目前掌握的代码:

def get_titles(text):
  pattern = re.compile('[A-Z][a-z]{1,3}\.')
  title_tokens = set(re.findall(pattern, text))
  pattern2 = re.compile('[A-Z][a-z]{1,3}')
  pseudo_titles = set(re.findall(pattern2, text))

  pseudo_titles = [word.strip() for word in pseudo_titles]
  pseudo_titles = [word.replace('\n', '') for word in pseudo_titles]

  difference = title_tokens.difference(pseudo_titles)
  return difference 

test = get_titles(text)
print(test)
正如您所注意到的,输出为我提供了附加的单词,其中包含句点。我相信这个问题源于正则表达式,但我不确定。任何建议或提示都将不胜感激


文本可以在这里找到:

本质上,您要求的是一种算法,可以区分标题和单字句子之间的差异。这些词在词汇上难以区分;例如,考虑以下两个字符串:

  • “我知道是谁干的吗?是的,是史密斯干的。”
  • “我知道是谁干的吗?是史密斯先生干的。”
在第一句中,“Yes.”是一个单字句,在第二句中,“Mr.”是一个标题。作为人类,我们之所以知道这一点,是因为我们理解标记“是”和“先生”的含义;因此,一个能够区分这些情况的算法需要一些有关其解析的标记含义的信息。它不能像正则表达式那样纯粹在词汇上工作。这意味着您必须要么写一个允许标题的白名单,要么写一个非标题单词的黑名单,否则问题就更难了


或者,如果你的项目不涉及解析很多小说的标题,你可以利用“汤姆”和“是”不是标题这一人类知识,手工删减结果。这应该不需要太多的工作。

我想不出一个简单的方法来区分敬语和其他缩写词(例如,与Ave.和No.相比,Dr.和Col.)。不使用正则表达式,您可以创建一个要搜索的敬语列表吗?还是这违背了演习的目的?看看文本,我能看到的敬语和句子结尾之间的唯一区别是敬语是结构化的[chars].[space][chars],而句子结尾是[chars].--或[chars].[space][space]。你可以试着把它构建到你的正则表达式中。