Со второго рождения мы собираем огромное количество знаний о мире. Эти знания накапливаются и взаимосвязаны в нашем мозгу и представляют то, что мы знаем. Если бы мы могли экспортировать эти знания и передать их на компьютер, они бы выглядели как ConceptNet . ConceptNet — это семантическая сеть, которая…
… состоит из узлов, представляющих понятия, в форме слов или коротких фраз естественного языка, и помеченных отношений между ними. Это то, что компьютеры должны знать, чтобы лучше искать информацию, отвечать на вопросы и понимать цели людей.
Я написал небольшой рубиновый скрипт для импорта ConceptNet5 в Neo4j, и он дает нам хороший график (243 МБ) для работы. ConceptNet5, представленный в CSV-файлах, на самом деле является гиперграфом с объяснением причины:
/a/[/r/NotHasProperty/,/c/en/old_map/,/c/en/very_accurate/] /r/NotHasProperty /c/en/old_map /c/en/very_accurate /ctx/all -1 /s/activity/omcs/vote,/s/contributor/omcs/PJ /e/e529e3a070783cbbe212bc5e721b6938c0a6df6b /d/conceptnet/4/en [[Old maps]] are not [[very accurate]] /a/[/r/NotHasProperty/,/c/en/old_map/,/c/en/very_accurate/] /r/NotHasProperty /c/en/old_map /c/en/very_accurate /ctx/all -1 /s/activity/omcs/vote,/s/contributor/omcs/aghanford /e/a8ecaed55f5ffba88b6d02da99ecf3fe42bffe55 /d/conceptnet/4/en [[Old maps]] are not [[very accurate]]
Здесь два автора сообщают нам, что старые карты не очень точны. Это приятно знать, но нам не нужно отображать это дважды в нашем графике. Поэтому вместо этого мы фиксируем и игнорируем дублирующиеся отношения, используя фильтр Блума для проверки их существования .
@edge_bf = BloomFilter::Native.new(:size => 212000000, :hashes => 23, :bucket => 8, :raise => false) def is_unique_rel(from,to,rel) return false if @edge_bf.include?("#{from}-#{to}-#{rel}") @edge_bf.insert("#{from}-#{to}-#{rel}") true end
Как только все будет готово, у нас будет около 2,5 миллионов узлов и 7,5 миллионов отношений:
Например, давайте посмотрим все, что ConceptNet5 знает о суши:
START sushi=node:Concepts(id="/c/en/sushi") MATCH sushi-[r]-other_concepts RETURN sushi.id, TYPE(r), other_concepts.id
Мы импортировали все концепции в индекс «Концепции», чтобы с ним было легко работать с графиком.
Здесь мы запрашиваем все другие концепции, связанные с концепцией суши, и просим график рассказать нам, какой тип отношений существует между ними.
==> +--------------------------------------------------------+ ==> | TYPE(r) | other_concepts.id | ==> +--------------------------------------------------------+ ==> | "MadeOf" | "/c/en/raw_fish" | ==> | "MotivatedByGoal" | "/c/en/eat_in_restaurant" | ==> | "AtLocation" | "/c/en/japanese_restaurant" | ==> | "HasProperty" | "/c/en/delicious" | ==> | "HasProperty" | "/c/en/japanese_in_origin" | ==> | "IsA" | "/c/en/asian_food" | ==> | "IsA" | "/c/en/from_japan" | ==> | "IsA" | "/c/en/japanese_food" | ==> | "IsA" | "/c/en/food" | ==> | "IsA" | "/c/en/fish" | ==> | "NotIsA" | "/c/en/raw_fish" | ==> | "CapableOf" | "/c/en/consist_mainly_of_raw_fish" | ==> | "ReceivesAction" | "/c/en/eat_by_many_westerner" | ==> +--------------------------------------------------------+
Результаты довольно интересные. Наш график знает, что он сделан из сырой рыбы, которую едят в ресторане, особенно в японском ресторане (трудно найти суши в итальянском или индийском ресторане). Граф думает, что суши восхитительны (я согласился бы, но некоторые люди сильно не согласились бы). Также обратите внимание на то, что он имеет ссылку на «NotIsA» raw_fish и ссылку «состоит_основной_фрагмент», поэтому наш график достаточно умен, чтобы знать, что некоторые суши не сырые.
Если вам случится зайти в офис Neo4j в Сан-Матео, Калифорния, вам захочется поехать в Суши Самс за лучшими суши в Сан-Матео. Давайте посмотрим, что еще он считает вкусным:
START delicious=node:Concepts(id="/c/en/delicious") MATCH delicious-[r]-other_concepts RETURN TYPE(r), other_concepts.id
==> +------------------------------------+ ==> | TYPE(r) | other_concepts.id | ==> +------------------------------------+ ==> | "IsA" | "/c/en/single" | ==> | "NotIsA" | "/c/en/nutricious" | ==> | "HasProperty" | "/c/en/ice_cream" | ==> | "HasProperty" | "/c/en/atangerine" | ==> | "HasProperty" | "/c/en/banana" | ==> | "HasProperty" | "/c/en/chicken" | ==> | "HasProperty" | "/c/en/chocolate" | ==> | "HasProperty" | "/c/en/beef" | ==> | "HasProperty" | "/c/en/fruit" | ==> | "HasProperty" | "/c/en/butter" | ==> | "HasProperty" | "/c/en/meat" | ==> | "HasProperty" | "/c/en/cake" | ==> | "HasProperty" | "/c/en/sushi" | ==> | "HasProperty" | "/c/en/marmite" | ==> | "HasProperty" | "/c/en/cheese" | ==> | "HasProperty" | "/c/en/tortilla" | ==> +------------------------------------+
Все, что не является «питательным» (они, вероятно, имели в виду питательное), не является вкусным. Я согласен с большинством других вещей здесь … но Marmite? Шутки в сторону.
Если вы хотите заняться чем-то немного большим, вы можете взглянуть на Базу знаний Yago, которая насчитывает 10 миллионов объектов (таких как люди, организации, города и т. Д.) И содержит более 120 миллионов фактов об этих объектах.