Skip to content

Commit

Permalink
Merge pull request #6 from Zuehlke/feature/kath/topics
Browse files Browse the repository at this point in the history
Feature/kath/topics
  • Loading branch information
tkauf15k authored Mar 26, 2021
2 parents ae9878e + 6af2c4e commit f382a82
Show file tree
Hide file tree
Showing 14 changed files with 226 additions and 150 deletions.
8 changes: 7 additions & 1 deletion solution/HackTheClimate/Data/Topic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
public class Topic
{
public string DocumentId { get; set; }
public string[] TopicWords { get; set; }
public TopicWord[] Words { get; set; }
}

public class TopicWord
{
public string Word { get; set; }
public double Score { get; set; }
}
}
2 changes: 1 addition & 1 deletion solution/HackTheClimate/Data/topics.json

Large diffs are not rendered by default.

224 changes: 117 additions & 107 deletions solution/HackTheClimate/Pages/Index.razor
Original file line number Diff line number Diff line change
Expand Up @@ -271,111 +271,121 @@ else

async Task ShowInlineDialog() => await dialogService.OpenAsync("Similarity Weights", ds =>
@<div class="p-1">
<div class="row">
<span class="col-4">Similarity Threshold</span>
<div class="col-6">
<RadzenSlider @bind-Value=SimilarityThreshold TValue="int" Min="0" Max="100"/>
</div>
<input class="form-control col-1" type="text" @bind="SimilarityThreshold" disabled>
</div>

<h6>Metadata <span class="badge badge-warning">Metadata</span></h6>

<div class="row">
<span class="col-4">Keyword</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.KeywordWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.KeywordWeight" disabled>
</div>
<div class="row">
<span class="col-4">Sector</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.SectorWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.SectorWeight" disabled>
</div>
<div class="row">
<span class="col-4">Framework</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.FrameworkWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.FrameworkWeight" disabled>
</div>
<div class="row">
<span class="col-4">Instrument</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.InstrumentWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.InstrumentWeight" disabled>
</div>
<div class="row">
<span class="col-4">Natural Hazard</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.NaturalHazardWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.NaturalHazardWeight" disabled>
</div>
<div class="row">
<span class="col-4">Response</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.ResponseWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.ResponseWeight" disabled>
</div>
<div class="row">
<span class="col-4">Location</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.LocationWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.LocationWeight" disabled>
</div>
<div class="row">
<span class="col-4">Document Type</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.DocumentTypeWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.DocumentTypeWeight" disabled>
</div>
<div class="row">
<span class="col-4">Type</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.TypeWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.TypeWeight" disabled>
</div>

<h6>Entitiy Recognition <span class="badge badge-warning">AI</span></h6>
<div class="row">
<span class="col-4">Category Product</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityProductWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityProductWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Event</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityEventWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityEventWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Skill</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntitySkillWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntitySkillWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Location</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityLocationWeight TValue="int" Min="0" Max="10"/>
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityLocationWeight" disabled>
</div>
<div class="row justify-content-end m-1">
<RadzenButton Click="() => ds.Close(false)" Text="Apply" ButtonStyle="ButtonStyle.Secondary" />
</div>
</div>);
<div class="row">
<span class="col-4">Similarity Threshold</span>
<div class="col-6">
<RadzenSlider @bind-Value=SimilarityThreshold TValue="int" Min="0" Max="100" />
</div>
<input class="form-control col-1" type="text" @bind="SimilarityThreshold" disabled>
</div>

<h6>Metadata <span class="badge badge-warning">Metadata</span></h6>

<div class="row">
<span class="col-4">Keyword</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.KeywordWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.KeywordWeight" disabled>
</div>
<div class="row">
<span class="col-4">Sector</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.SectorWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.SectorWeight" disabled>
</div>
<div class="row">
<span class="col-4">Framework</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.FrameworkWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.FrameworkWeight" disabled>
</div>
<div class="row">
<span class="col-4">Instrument</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.InstrumentWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.InstrumentWeight" disabled>
</div>
<div class="row">
<span class="col-4">Natural Hazard</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.NaturalHazardWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.NaturalHazardWeight" disabled>
</div>
<div class="row">
<span class="col-4">Response</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.ResponseWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.ResponseWeight" disabled>
</div>
<div class="row">
<span class="col-4">Location</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.LocationWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.LocationWeight" disabled>
</div>
<div class="row">
<span class="col-4">Document Type</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.DocumentTypeWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.DocumentTypeWeight" disabled>
</div>
<div class="row">
<span class="col-4">Type</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.TypeWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.TypeWeight" disabled>
</div>

<h6>Entitiy Recognition <span class="badge badge-warning">AI</span></h6>
<div class="row">
<span class="col-4">Category Product</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityProductWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityProductWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Event</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityEventWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityEventWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Skill</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntitySkillWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntitySkillWeight" disabled>
</div>
<div class="row">
<span class="col-4">Category Location</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.EntityLocationWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-1" type="text" @bind="_similarityWeights.EntityLocationWeight" disabled>
</div>

<h6>Semantic Topics<span class="badge badge-warning">AI</span></h6>
<div class="row">
<span class="col-4">Topic</span>
<div class="col-6">
<RadzenSlider @bind-Value=_similarityWeights.TopicWeight TValue="int" Min="0" Max="10" />
</div>
<input class="form-control col-2" type="text" @bind="_similarityWeights.TopicWeight" disabled>
</div>

<div class="row justify-content-end m-1">
<RadzenButton Click="() => ds.Close(false)" Text="Apply" ButtonStyle="ButtonStyle.Secondary" />
</div>
</div>);
}
46 changes: 23 additions & 23 deletions solution/HackTheClimate/Pages/PolicyComparison.razor
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
@page "/compare/{id1}/{id2}"
@using HackTheClimate.Data
@using HackTheClimate.Services
@using System.Text.RegularExpressions
@inject LegislationService LegislationService
@inject SimilarityService SimilarityService

Expand Down Expand Up @@ -45,7 +44,7 @@ else
</div>

<!-- Default Weight 4-->
<ListSimilarityResultComponent Title="Product Entities" Similarity="@_similarity.ProductEntitiesSimilarity" Badge="AI"/>
<ListSimilarityResultComponent Title="Product Entities" Similarity="@_similarity.ProductEntitiesSimilarity" Badge="AI" />

<!-- Default Weight 3-->
<ListSimilarityResultComponent Title="Keywords" Similarity="@_similarity.KeywordSimilarity" Badge="Metadata" />
Expand All @@ -59,35 +58,36 @@ else

<!-- Default Weight 2-->
@if (_similarity.LocationSimilarity > 0)
{
<div class="row">
<div class="col-sm" />
<div class="col-sm">
<img src="@($"/flags/{_document1.GeographyIso.ToUpperInvariant()}.svg")" alt="@_document1.GeographyIso" />
&nbsp;
@_document1.Geography
<span class="badge badge-warning">Metadata</span>
{
<div class="row">
<div class="col-sm" />
<div class="col-sm">
<img src="@($"/flags/{_document1.GeographyIso.ToUpperInvariant()}.svg")" alt="@_document1.GeographyIso" />
&nbsp;
@_document1.Geography
<span class="badge badge-warning">Metadata</span>
</div>
<div class="col-sm" />
</div>
<div class="col-sm" />
</div>
}
}

<!-- Default Weight 1-->

@if (_similarity.TypeSimilarity > 0)
{
<div class="row">
<div class="col-sm" />
<div class="col-sm">
<h2>Type (@(_similarity.TypeSimilarity * 100)%)</h2>
<span class="badge badge-warning">Metadata</span>
{
<div class="row">
<div class="col-sm" />
<div class="col-sm">
<h2>Type (@(_similarity.TypeSimilarity * 100)%)</h2>
<span class="badge badge-warning">Metadata</span>
</div>
<div class="col-sm" />
</div>
<div class="col-sm" />
</div>
}
}

<ListSimilarityResultComponent Title="Location Entities" Similarity="@_similarity.LocationEntitiesSimilarity" Badge="AI"/>
<ListSimilarityResultComponent Title="Location Entities" Similarity="@_similarity.LocationEntitiesSimilarity" Badge="AI" />
<ListSimilarityResultComponent Title="Document Types" Similarity="@_similarity.DocumentTypesSimilarity" Badge="Metadata" />
<ListSimilarityResultComponent Title="Semantic Topics" Similarity="@_similarity.TopicSimilarity" Badge="AI" />

</div>
}
Expand Down
2 changes: 1 addition & 1 deletion solution/HackTheClimate/Pages/PrecomputeSimilarity.razor
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@ else{
_processing = false;
}

}
}
4 changes: 3 additions & 1 deletion solution/HackTheClimate/Services/DocumentService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ public DocumentService(LegislationService legislationService)
public async Task<DocumentDetails> GetDetailsAsync(string id)
{
var legislation = _legislationService.GetLegislation(id);
var topicWords = _topics.SingleOrDefault(x => x.DocumentId == id)?.TopicWords ?? new string[0];
var topicWords =
_topics.SingleOrDefault(x => x.DocumentId == id)?.Words.OrderByDescending(x => x.Score)
.Select(x => x.Word).ToArray() ?? new string[0];

return new DocumentDetails
{
Expand Down
2 changes: 1 addition & 1 deletion solution/HackTheClimate/Services/FakeSimilarityService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ public SimilarityResult CalculateSimilarity(Legislation a, Legislation b)
};
}
}
}
}
14 changes: 10 additions & 4 deletions solution/HackTheClimate/Services/SimilarityService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ public class SimilarityService
{
private static Dictionary<string, double> _precomputed;
private readonly EntityRecognitionService _entityRecognitionService;
private readonly TopicBasedSimilarityService _topicBasedSimilarityService;

public SimilarityService(EntityRecognitionService entityRecognitionService)
public SimilarityService(EntityRecognitionService entityRecognitionService, TopicBasedSimilarityService topicBasedSimilarityService)
{
_entityRecognitionService = entityRecognitionService;
_topicBasedSimilarityService = topicBasedSimilarityService;
}

public async Task<IEnumerable<(string Id, double SimilarityScore)>> GetMostSimilarLegislationIds(Legislation a)
Expand Down Expand Up @@ -62,6 +64,7 @@ public SimilarityResult CalculateSimilarity(Legislation a, Legislation b, Simila
var entityProductSimilarity = EntityCategorySimilarity(a, b, "Product");
var entityEventSimilarity = EntityCategorySimilarity(a, b, "Event");
var entityLocationSimilarity = EntityCategorySimilarity(a, b, "Location");
var topicSimilarity = _topicBasedSimilarityService.CalculateSimilarity(a, b);

return new SimilarityResult
{
Expand All @@ -77,7 +80,8 @@ public SimilarityResult CalculateSimilarity(Legislation a, Legislation b, Simila
+ weights.EntityProductWeight * entityProductSimilarity.Score
+ weights.EntitySkillWeight * entitySkillSimilarity.Score
+ weights.EntityEventWeight * entityEventSimilarity.Score
+ weights.EntityLocationWeight * entityLocationSimilarity.Score)
+ weights.EntityLocationWeight * entityLocationSimilarity.Score
+ weights.TopicWeight * topicSimilarity.Score)
/ weights.TotalWeight(),

KeywordSimilarity = keywordSimilarity,
Expand All @@ -92,7 +96,8 @@ public SimilarityResult CalculateSimilarity(Legislation a, Legislation b, Simila
SkillEntitiesSimilarity = entitySkillSimilarity,
ProductEntitiesSimilarity = entityProductSimilarity,
EventEntitiesSimilarity = entityEventSimilarity,
LocationEntitiesSimilarity = entityLocationSimilarity
LocationEntitiesSimilarity = entityLocationSimilarity,
TopicSimilarity = topicSimilarity
};
}

Expand Down Expand Up @@ -173,7 +178,8 @@ public class SimilarityResult
public ListSimilarityResult<string> ProductEntitiesSimilarity { get; set; }
public ListSimilarityResult<string> EventEntitiesSimilarity { get; set; }
public ListSimilarityResult<string> LocationEntitiesSimilarity { get; set; }
public ListSimilarityResult<string> TopicSimilarity { get; set; }
public int LocationSimilarity { get; set; }
public int TypeSimilarity { get; set; }
}
}
}
Loading

0 comments on commit f382a82

Please sign in to comment.