如果两个单词的变体不按字母顺序匹配,则将它们相互匹配
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")
我正在和我的大学一起做一个 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")