我有很多不同格式的非结构化医疗文件。 解析出所有用于NLP的好句子的最佳方法是什么?
当前,我正在使用SpaCy来执行此操作,但是即使进行了多处理,它也相当慢,并且默认语句解析器在100%的时间内都无法正常工作。这是一个示例,说明如何尝试使用SpaCy获得良好的句子:
def get_good_sents(texts, batch_size, n_process):
nlp = spacy.load("en_core_web_sm", disable=[
'ner',
'entity_linker',
'textcat',
'entity_ruler',
'sentencizer',
'merge_noun_chunks',
'merge_entities',
'merge_subtokens',
])
pipe = nlp.pipe(texts, batch_size=batch_size, n_process=n_process)
rows = []
for doc in pipe:
clean_text = []
for sent in doc.sents:
struct = [token.pos_ for token in sent]
subject = any(x in struct for x in ['NOUN', 'PRON'])
action = any(x in struct for x in ['VERB', 'ADJ', 'AUX'])
if subject and action :
clean_text.append(sent.text)
rows.append(' '.join(clean_text).replace('\n', ' ').replace('\r', ''))
return rows
一些文本摘录的示例
原始文本:
TITLE
Patient Name:
Has a heart Condition.
Is 70 Years old.
预期输出:
Has a heart Condition.
Is 70 Years old.
这个例子不是很好,因为我有成千上万种各种格式的不同文档。它们确实可以相差很大。基本上,这归结为我只是想剥离样板内容,而只是获得实际的自由文本。
答案 0 :(得分:2)
基于以上讨论的评论,我非常有信心spaCy不会为您提供非常好的结果,仅仅是因为它与有效语法语句的期望紧密相关。
至少对于当前在每行中查找“正确标记的单词”的方法而言,我希望这种方法不能很好地工作,因为正确标记一个句子已经与一种体面的输入格式相关联; 再次引用我的favorite concepts in Machine Learning之一。
根据您要达到的精度,我个人会采用防御性的Regex方法,在该方法中,您可以手动分类标题(少于4个字的行,以冒号/分号结尾的行等),尽管它可以将需要更多的努力。
另一种更直接的解决方案是采用other common boilerplate tools are doing,尽管其中大多数目标是从HTML内容中删除样板,因此也可以通过利用标记信息来简化工作。