You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/Semantic/WordTokenizer.cs

85 lines
2.5 KiB

5 years ago
using System;
using System.Buffers;
5 years ago
using System.Collections.Generic;
namespace ZeroLevel.Services.Semantic
{
public static class WordTokenizer
{
const int ARRAY_SIZE = 2048;
static ArrayPool<char> _pool = ArrayPool<char>.Create();
5 years ago
public static IEnumerable<string> Tokenize(string text)
{
int index = 0;
bool first = true;
var buffer = _pool.Rent(ARRAY_SIZE);
5 years ago
try
{
5 years ago
for (int i = 0; i < text?.Length; i++)
5 years ago
{
if (first && Char.IsLetter(text[i]))
{
first = false;
buffer[index++] = text[i];
}
else if (first == false && Char.IsLetterOrDigit(text[i]))
{
buffer[index++] = text[i];
}
else if (index > 0)
{
yield return new string(buffer, 0, index).ToLowerInvariant();
index = 0;
first = true;
}
}
if (index > 0)
{
yield return new string(buffer, 0, index).ToLowerInvariant();
}
}
finally
{
_pool.Return(buffer);
5 years ago
}
}
2 years ago
public static IEnumerable<string> TokenizeCaseSensitive(string text)
{
int index = 0;
bool first = true;
var buffer = _pool.Rent(ARRAY_SIZE);
try
{
for (int i = 0; i < text?.Length; i++)
{
if (first && Char.IsLetter(text[i]))
{
first = false;
buffer[index++] = text[i];
}
else if (first == false && Char.IsLetterOrDigit(text[i]))
{
buffer[index++] = text[i];
}
else if (index > 0)
{
yield return new string(buffer, 0, index);
index = 0;
first = true;
}
}
if (index > 0)
{
yield return new string(buffer, 0, index);
}
}
finally
{
_pool.Return(buffer);
}
}
5 years ago
}
}

Powered by TurnKey Linux.