如果两个单词的变体按字母顺序不匹配,则相互匹配

2024-06-16 11:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在和我的大学一起做一个NLP项目,收集冰岛语单词的数据,这些单词的拼写都是I和y(冰岛语中的发音是一样的,仅供参考),其中的变体都是实际单词,但意思并不相同。这方面的例子包括leyti(时间上的近似值)和leiti(长满草的山),或者kirkja(教堂)和kyrkja(窒息)。我有一个200万字的数据集。我已经收集了两个单词表,其中一个包含拼写为y的单词,另一个包含拼写为I的相同单词(虽然它们似乎不完全匹配,因为y列表有点长,但这是一个单独的问题)。我的问题是,我想以成对的单词结束,比如leyti-leiti,kyrkja-kirkja,等等。但是,由于y在字母表中的位置比我晚得多,所以仅仅对列表进行排序并以这种方式将它们配对是没有用的。我也试着压缩列表,同时检查前几个字母,看看我是否能找到一个匹配的,但这遗漏了所有的单词有y或I作为第一个字母。你对我如何实施这个有什么建议吗


Tags: 数据项目列表nlp字母变体单词例子
3条回答

我不认为这是一个编程挑战,但看起来更像一个NLP挑战本身。拼写变化通常是预处理过程中遇到的一个障碍

我建议您使用基于Edit-distance的方法来识别允许某些变体的词对。特别是对于您上面描述的问题,我建议使用“Jaro Winkler Distance”。这种方法允许在单词对之间给出更高的相似度,以显示特定字符对之间的变化,比如y和i

所有这些方法都在Jellyfish library中实现。 你也可以看看fuzzywuzzy package。希望这有帮助

所以这就完成了我的任务,有点简单,我想不是很好的解决方案,但它是有效的:

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")

尝试以下操作:

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  

相关问题 更多 >