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)
正如您所注意到的,输出为我提供了附加的单词,其中包含句点。我相信这个问题源于正则表达式,但我不确定。任何建议或提示都将不胜感激
文本可以在这里找到:本质上,您要求的是一种算法,可以区分标题和单字句子之间的差异。这些词在词汇上难以区分;例如,考虑以下两个字符串:
- “我知道是谁干的吗?是的,是史密斯干的。”
- “我知道是谁干的吗?是史密斯先生干的。”
或者,如果你的项目不涉及解析很多小说的标题,你可以利用“汤姆”和“是”不是标题这一人类知识,手工删减结果。这应该不需要太多的工作。我想不出一个简单的方法来区分敬语和其他缩写词(例如,与Ave.和No.相比,Dr.和Col.)。不使用正则表达式,您可以创建一个要搜索的敬语列表吗?还是这违背了演习的目的?看看文本,我能看到的敬语和句子结尾之间的唯一区别是敬语是结构化的[chars].[space][chars],而句子结尾是[chars].--或[chars].[space][space]。你可以试着把它构建到你的正则表达式中。