Сопоставление двухсловных вариантов друг с другом, если они не совпадают по алфавиту - PullRequest
0 голосов
/ 23 сентября 2019

Я делаю проект НЛП с моим университетом, собирая данные о словах на исландском языке, которые существуют как пишутся с i, так и с ay (они звучат одинаково в исландском фю), где варианты являются реальными словами, но не означаюттоже самое.Примерами этого могут быть лейти (приближение во времени) и лейти (травянистый холм) или киркья (церковь) и киркья (дроссель).У меня есть набор данных из 2 миллионов слов.Я уже собрал два списка слов, один из которых включает в себя слова, записанные с помощью ay, а другой - те же слова, написанные с помощью ai (хотя они, кажется, не совпадают полностью, так как список y немного длиннее, но это отдельныйвыпуск).Моя проблема в том, что я хочу получить пару слов, таких как лейти-лейти, киркья-киркья и т. Д. Но, так как у в алфавите намного больше, чем у меня, нет смысла просто сортировать списки и объединять их таким образом.,Я также попытался сжать списки, проверяя первые несколько букв, чтобы увидеть, могу ли я найти совпадение, но при этом пропускаются все слова, у которых y или i являются первой буквой.У вас есть предложение о том, как я могу это реализовать?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Я не думаю, что это проблема программирования, но больше похожа на проблему НЛП.Вариации правописания часто являются препятствием, с которым можно столкнуться во время предварительной обработки.

Я бы предложил использовать подходы, основанные на Edit-distance , для идентификации пар слов, которые допускают некоторые вариации.Специально для той проблемы, которую вы описали выше, я бы порекомендовал « Jaro Winkler Distance ».Этот метод позволяет получить более высокую оценку сходства между парами слов, которая показывает различия между конкретными парами символов, скажем, у и я.

Все эти подходы реализованы в библиотеке медуз .Вы также можете взглянуть на пакет fuzzywuzzy .Надеюсь, это поможет.

0 голосов
/ 23 сентября 2019

Таким образом, это решает мою задачу, я думаю, что это простое, но не очень красивое решение, но оно работает:

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")
0 голосов
/ 23 сентября 2019

Попробуйте что-то вроде этого:

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  

...