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

Matching two-word variants with each other if they don't match alphabetically

我正在和我的大学一起做一个 NLP 项目,收集关于冰岛语单词的数据,这些单词同时拼写为 i 和 y(它们在冰岛语 fyi 中听起来相同),其中变体都是实际单词但确实不是同一件事。这方面的例子包括 leyti(时间的近似值)和 leiti(长满青草的山丘),或 kirkja(教堂)和 kyrkja(扼流圈)。我有一个包含 200 万个单词的数据集。我已经收集了两个单词列表,其中一个包含拼写为 y 的单词,一个包含拼写为 i 的相同单词(尽管它们似乎并不完全匹配,因为 y 列表有点长,但这是一个单独的问题)。我的问题是我想以成对的单词结束,例如 leyti - leiti、kyrkja - kirkja 等。但是,由于 y 在字母表中比 i 晚得多,因此仅对列表进行排序并以这种方式配对是不好的.我还尝试压缩列表,同时检查前几个字母以查看是否可以找到匹配项,但这样会排除所有首字母为 y 或 i 的单词。你对我如何实现这个有什么建议吗?

尝试这样的事情:

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  

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

我建议你使用 Edit-distance based approaches to identify word pairs that allow for some variations. Specifically for the kind of problem that you have described above, I would recommend "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")