Выделение сущностей - PetrovaDaria/software-glitches GitHub Wiki
Для выделения сущностей конкретного типа - stanza.
Хотим выделить организацию, которая пострадала от сбоя и/или в которой произошел сбой. Фильтруем организации по типу ORG.
Получили такой словарь:
{'China Unicom': 3, 'China Unicom Hong Kong Ltd': 1, 'Weibo': 1, 'China Telecom Corp Ltd': 1}
Понятно, что China Unicom и China Unicom Hong Kong Ltd - это одна и та же организация, надо объединить их в одну сущность. Чтобы это проверить, можно использовать изощренные поиски подстрок в строках. Но есть вариант с semantic similarity, семантической схожестью. Такая функция есть в spacy.
import spacy
nlp = spacy.load("en_core_web_md")
doc1 = nlp("China Unicom.")
doc2 = nlp("China Unicom Hong Kong Ltd.")
doc3 = nlp("China Telecom Corp Ltd")
doc4 = nlp("Weibo")
print(doc1, "<->", doc2, doc1.similarity(doc2)) # China Unicom. <-> China Unicom Hong Kong Ltd. 0.8867706172712817
print(doc1, "<->", doc3, doc1.similarity(doc3)) # China Unicom. <-> China Telecom Corp Ltd 0.6890473998261397
print(doc1, "<->", doc4, doc1.similarity(doc4)) # China Unicom. <-> Weibo 0.20304780743633138
У "China Unicom." и "China Unicom Hong Kong Ltd." высокая степень схожести. С "Weibo" схожесть всего 0,2, точно не подходит. Но у "China Unicom." и "China Telecom Corp Ltd" также уровень больше 50%. Текст однозначно говорит, что это другая компания "The country's other major broadband provider, China Telecom Corp Ltd, had 108 million broadband customers."
Если искать организации только в негативно окрашенных предложениях, то организация, вводящая в заблуждение, уходит из словаря.
{'China Unicom': 3, 'China Unicom Hong Kong Ltd': 1, 'Weibo': 1}
Квадратичное сравнение всего со всем может быть довольно долгим. Начать с самого частого, если найдены схожие, сразу привязываем их к текущему и не сравниваем больше ни с чем. Хотя вдруг второе по частоте еще больше схоже?