0

我有一个像“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ş

单词和后缀列表一直在变化。所以我需要一个算法。我尝试将后缀与词干和比较一一合并,但不适用于所有列表。

谢谢。

4

1 回答 1

0

使用为单词分配后缀的字典是实现此目的的一种方法。

但是,确实需要调整此代码以识别列表中没有的后缀和相似的后缀(例如您的示例中的“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

于 2020-05-03T12:56:40.560 回答