从后缀列表中找到主词
Reaching the main word from the suffix list
我有一个词 "itibarsızlaştırmak"。
词干是 "itibar",后缀列表是 "a, ak, ar, ı, laş, m, sız, i"。
缺少后缀列表。 "ma, tır, ız, i, ı, a, m, sı, mak, tı, sız, ak, ar, laş"是对的
我怎样才能达到 "itibarsızlaştırmak" 后缀列表的顺序?
例如:itibar + suffixList[6] -> itibarsız
itibar + suffixList[6] + suffixList[5] -> itibarsızlaş
单词和后缀列表一直在变化。所以我需要一个算法。我尝试将后缀与词干和比较一一合并,但它不适用于所有列表。
谢谢。
使用为单词分配后缀的词典是实现此目的的一种方式。
然而,此代码确实需要进行调整,以识别不在列表中的后缀和相似的后缀(如示例中的 'a' 和 'ak')。
更新
修复了后缀的搜索模式。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var words = new Dictionary<string, List<string>>();
words.Add("itibar", new List<string>(){"ma", "tır", "ız", "i", "ı", "a", "m", "sı", "mak", "tı", "sız", "ak", "ar", "laş"}.OrderBy(e => e.Length).ToList());
var word = "itibarsızlaştırmak";
var wordUsed = words.FirstOrDefault(e => word.Contains(e.Key));
var suffixesUsedInOrder = new List<string>();
var charsToSearch = "";
foreach (var character in word.Substring(wordUsed.Key.Length))
{
var a = character.ToString();
if (charsToSearch.Length > 0)
{
a = charsToSearch + a;
}
if (!wordUsed.Value.Any(e => e == a) || wordUsed.Value.Count(e => e.StartsWith(a)) > 1)
{
charsToSearch += character.ToString();
}
else
{
suffixesUsedInOrder.Add(wordUsed.Value.FirstOrDefault(e => e == a));
charsToSearch = "";
}
}
Console.WriteLine(string.Join(",", suffixesUsedInOrder));
}
}
这段代码的结果运行:sız,laş,tır,mak
我有一个词 "itibarsızlaştırmak"。
词干是 "itibar",后缀列表是 "a, ak, ar, ı, laş, m, sız, i"。
缺少后缀列表。 "ma, tır, ız, i, ı, a, m, sı, mak, tı, sız, ak, ar, laş"是对的
我怎样才能达到 "itibarsızlaştırmak" 后缀列表的顺序?
例如:itibar + suffixList[6] -> itibarsız
itibar + suffixList[6] + suffixList[5] -> itibarsızlaş
单词和后缀列表一直在变化。所以我需要一个算法。我尝试将后缀与词干和比较一一合并,但它不适用于所有列表。
谢谢。
使用为单词分配后缀的词典是实现此目的的一种方式。
然而,此代码确实需要进行调整,以识别不在列表中的后缀和相似的后缀(如示例中的 'a' 和 'ak')。
更新
修复了后缀的搜索模式。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var words = new Dictionary<string, List<string>>();
words.Add("itibar", new List<string>(){"ma", "tır", "ız", "i", "ı", "a", "m", "sı", "mak", "tı", "sız", "ak", "ar", "laş"}.OrderBy(e => e.Length).ToList());
var word = "itibarsızlaştırmak";
var wordUsed = words.FirstOrDefault(e => word.Contains(e.Key));
var suffixesUsedInOrder = new List<string>();
var charsToSearch = "";
foreach (var character in word.Substring(wordUsed.Key.Length))
{
var a = character.ToString();
if (charsToSearch.Length > 0)
{
a = charsToSearch + a;
}
if (!wordUsed.Value.Any(e => e == a) || wordUsed.Value.Count(e => e.StartsWith(a)) > 1)
{
charsToSearch += character.ToString();
}
else
{
suffixesUsedInOrder.Add(wordUsed.Value.FirstOrDefault(e => e == a));
charsToSearch = "";
}
}
Console.WriteLine(string.Join(",", suffixesUsedInOrder));
}
}
这段代码的结果运行:sız,laş,tır,mak