Add achp (average choice-point-ratio) calculation
This commit is contained in:
parent
d99692ff1c
commit
22faead8b4
3 changed files with 36 additions and 8 deletions
|
@ -90,6 +90,7 @@ namespace MarkovGrams
|
||||||
return word.Split(' ');
|
return word.Split(' ');
|
||||||
return new string[] { word.Trim() };
|
return new string[] { word.Trim() };
|
||||||
});
|
});
|
||||||
|
List<float> choicePointRatios = new List<float>();
|
||||||
|
|
||||||
switch (operationMode)
|
switch (operationMode)
|
||||||
{
|
{
|
||||||
|
@ -101,9 +102,11 @@ namespace MarkovGrams
|
||||||
);
|
);
|
||||||
unweightedChain.StartOnUppercase = startOnUppercase;
|
unweightedChain.StartOnUppercase = startOnUppercase;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++) {
|
||||||
Console.WriteLine(unweightedChain.Generate(length));
|
Console.WriteLine(unweightedChain.Generate(length, out float nextChoicePathRatio));
|
||||||
Console.Error.WriteLine($"{count} words in {utimer.ElapsedMilliseconds}ms");
|
choicePointRatios.Add(nextChoicePathRatio);
|
||||||
|
}
|
||||||
|
Console.Error.WriteLine($"{count} words in {utimer.ElapsedMilliseconds}ms (average choice-point-ratio: {Math.Round(choicePointRatios.Sum()/count, 2)})");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Mode.WeightedMarkov:
|
case Mode.WeightedMarkov:
|
||||||
|
@ -114,9 +117,11 @@ namespace MarkovGrams
|
||||||
);
|
);
|
||||||
weightedChain.StartOnUppercase = startOnUppercase;
|
weightedChain.StartOnUppercase = startOnUppercase;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++) {
|
||||||
Console.WriteLine(weightedChain.Generate(length));
|
Console.WriteLine(weightedChain.Generate(length, out float nextChoicePointRatio));
|
||||||
Console.Error.WriteLine($"{count} words in {wtimer.ElapsedMilliseconds}ms");
|
choicePointRatios.Add(nextChoicePointRatio);
|
||||||
|
}
|
||||||
|
Console.Error.WriteLine($"{count} words in {wtimer.ElapsedMilliseconds}ms (average choice-point-ratio: {Math.Round(choicePointRatios.Sum() / count, 2)})");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Mode.NGrams:
|
case Mode.NGrams:
|
||||||
|
|
|
@ -66,15 +66,21 @@ namespace MarkovGrams
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>A new random string.</returns>
|
/// <returns>A new random string.</returns>
|
||||||
public string Generate(int length)
|
public string Generate(int length)
|
||||||
|
{
|
||||||
|
return Generate(length, out float noop);
|
||||||
|
}
|
||||||
|
public string Generate(int length, out float choicePointRatio)
|
||||||
{
|
{
|
||||||
string result = RandomNgram();
|
string result = RandomNgram();
|
||||||
string lastNgram = result;
|
string lastNgram = result;
|
||||||
|
List<int> choiceCounts = new List<int>(); int i = 0;
|
||||||
while((Mode == GenerationMode.CharacterLevel ? result.Length : result.Split(' ').Length) < length)
|
while((Mode == GenerationMode.CharacterLevel ? result.Length : result.Split(' ').Length) < length)
|
||||||
{
|
{
|
||||||
// The substring that the next ngram in the chain needs to start with
|
// The substring that the next ngram in the chain needs to start with
|
||||||
string nextStartsWith = Mode == GenerationMode.CharacterLevel ? lastNgram.Substring(1) : lastNgram.Split(' ').Last();
|
string nextStartsWith = Mode == GenerationMode.CharacterLevel ? lastNgram.Substring(1) : lastNgram.Split(' ').Last();
|
||||||
// Get a list of possible n-grams we could choose from next
|
// Get a list of possible n-grams we could choose from next
|
||||||
List<string> nextNgrams = ngrams.FindAll(gram => gram.StartsWith(nextStartsWith));
|
List<string> nextNgrams = ngrams.FindAll(gram => gram.StartsWith(nextStartsWith));
|
||||||
|
choiceCounts.Add(nextNgrams.Count);
|
||||||
// If there aren't any choices left, we can't exactly keep adding to the new string any more :-(
|
// If there aren't any choices left, we can't exactly keep adding to the new string any more :-(
|
||||||
if(nextNgrams.Count == 0)
|
if(nextNgrams.Count == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -85,9 +91,14 @@ namespace MarkovGrams
|
||||||
result += nextNgram[nextNgram.Length - 1];
|
result += nextNgram[nextNgram.Length - 1];
|
||||||
else
|
else
|
||||||
result += ' ' + string.Join(" ", nextNgram.Split(' ').Skip(1));
|
result += ' ' + string.Join(" ", nextNgram.Split(' ').Skip(1));
|
||||||
lastNgram = nextNgram;
|
|
||||||
|
lastNgram = nextNgram; i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (choiceCounts.Sum() > 0)
|
||||||
|
choicePointRatio = (float)choiceCounts.Sum() / (float)(i + 1);
|
||||||
|
else
|
||||||
|
choicePointRatio = 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,9 +80,14 @@ namespace MarkovGrams
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>A new random string.</returns>
|
/// <returns>A new random string.</returns>
|
||||||
public string Generate(int length)
|
public string Generate(int length)
|
||||||
|
{
|
||||||
|
return Generate(length, out float noop);
|
||||||
|
}
|
||||||
|
public string Generate(int length, out float choicePointRatio)
|
||||||
{
|
{
|
||||||
string result = RandomNgram();
|
string result = RandomNgram();
|
||||||
string lastNgram = result;
|
string lastNgram = result;
|
||||||
|
List<int> choiceCounts = new List<int>(); int i = 0;
|
||||||
while((Mode == GenerationMode.CharacterLevel ? result.Length : result.Split(' ').Length) < length)
|
while((Mode == GenerationMode.CharacterLevel ? result.Length : result.Split(' ').Length) < length)
|
||||||
{
|
{
|
||||||
wrandom.ClearContents();
|
wrandom.ClearContents();
|
||||||
|
@ -92,6 +97,8 @@ namespace MarkovGrams
|
||||||
Dictionary<string, double> convNextNgrams = new Dictionary<string, double>();
|
Dictionary<string, double> convNextNgrams = new Dictionary<string, double>();
|
||||||
ngrams.Where(gram_data => gram_data.Key.StartsWith(nextStartsWith))
|
ngrams.Where(gram_data => gram_data.Key.StartsWith(nextStartsWith))
|
||||||
.ForEach((KeyValuePair<string, double> ngramData) => convNextNgrams.Add(ngramData.Key, ngramData.Value));
|
.ForEach((KeyValuePair<string, double> ngramData) => convNextNgrams.Add(ngramData.Key, ngramData.Value));
|
||||||
|
|
||||||
|
choiceCounts.Add(convNextNgrams.Count);
|
||||||
// If there aren't any choices left, we can't exactly keep adding to the new string any more :-(
|
// If there aren't any choices left, we can't exactly keep adding to the new string any more :-(
|
||||||
if(convNextNgrams.Count() == 0)
|
if(convNextNgrams.Count() == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -103,9 +110,14 @@ namespace MarkovGrams
|
||||||
result += nextNgram[nextNgram.Length - 1];
|
result += nextNgram[nextNgram.Length - 1];
|
||||||
else
|
else
|
||||||
result += ' ' + string.Join(" ", nextNgram.Split(' ').Skip(1));
|
result += ' ' + string.Join(" ", nextNgram.Split(' ').Skip(1));
|
||||||
lastNgram = nextNgram;
|
lastNgram = nextNgram; i++;
|
||||||
}
|
}
|
||||||
wrandom.ClearContents();
|
wrandom.ClearContents();
|
||||||
|
|
||||||
|
if (choiceCounts.Sum() > 0)
|
||||||
|
choicePointRatio = (float)choiceCounts.Sum() / (float)(i + 1);
|
||||||
|
else
|
||||||
|
choicePointRatio = 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue