我正在与我的大学一起进行NLP项目,收集有关冰岛语中同时带有i和ay拼写的单词的数据(在冰岛文fyi中听起来相同),其中变体均为实际单词,但并不意味着同样的事情。这样的示例包括leyti(时间的近似值)和leiti(草山)或kirkja(教堂)和kyrkja(扼流圈)。我有一个200万个单词的数据集。我已经收集了两个单词表,其中一个包含用y拼写的单词,一个包含用ai拼写的单词(尽管它们似乎并不完全匹配,因为y-list更长,但这是一个单独的单词)问题)。我的问题是我想以leyti-leiti,kyrkja-kirkja等单词结尾。但是,由于y在字母中的位置比我晚得多,因此仅对列表进行排序并以这种方式将它们配对是不好的。我还尝试在检查前几个字母的同时压缩列表,以查看是否可以找到匹配项,但这排除了所有以y或i作为第一个字母的单词。您对我将如何实施此建议吗?
答案 0 :(得分:0)
尝试这样的事情:
s = "trydfydfgfay"
l = list(s)
candidateWords = []
for idx, c in enumerate(l):
if c=='y':
newList = l.copy()
newList[idx] = "i"
candidateWord = "".join(newList)
candidateWords.append(candidateWord)
print(candidateWords)
#['tridfydfgfay', 'trydfidfgfay', 'trydfydfgfai']
#look up these words to see if they are real words
答案 1 :(得分:0)
我不认为这是编程挑战,但看起来更像是NLP挑战本身。拼写变化通常是预处理过程中会遇到的障碍。
我建议您使用基于Edit-distance的方法来识别允许某些变体的单词对。特别针对您上面描述的那种问题,我建议您使用“ Jaro Winkler Distance”。这种方法可以使单词对之间的相似度更高,从而显示特定字符对(例如y和i)之间的差异。
所有这些方法都在Jellyfish library中实现。 您也可以看看fuzzywuzzy package。希望这会有所帮助。
答案 2 :(得分:0)
这样就完成了我的任务,我想这是一个简单的,并非如此漂亮的解决方案,但是它可以起作用:
wordlist = open("data.txt", "r", encoding='utf-8')
y_words = open("y_wordlist.txt", "w+", encoding='utf-8')
all_words = []
y_words = []
for word in wordlist:
word = word.lower()
all_words.append(word)
for word in all_words:
if "y" in word:
y_words.append(word)
word_dict = {}
for word in y_words:
newwith1y = word.replace("y", "i",1)
newwith2y = word.replace("y", "i",2)
newyback = word[::-1].replace("y", "i",1)
newyback = newyback[::-1]
word_dict[word] = newwith1y
word_dict[word] = newwith2y
word_dict[word] = newyback
for key, value in word_dict.items():
if value in all_words:
y_wordlist.write(key)
y_wordlist.write(" - ")
y_wordlist.write(value)
y_wordlist.write("\n")