Выделение сущностей - 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}

Квадратичное сравнение всего со всем может быть довольно долгим. Начать с самого частого, если найдены схожие, сразу привязываем их к текущему и не сравниваем больше ни с чем. Хотя вдруг второе по частоте еще больше схоже?