Хобрук: Ваш путь к мастерству в программировании

Множественные результаты правописания в кадре данных 1

У меня есть некоторые данные, содержащие орфографические ошибки. Я исправляю их и оцениваю, насколько близко написание, используя следующий код:

 import pandas as pd
 import difflib

 Li_A = ["potato", "tomato", "squash", "apple", "pear"]

 Q    = {'one' : pd.Series(["potat0", "toma3o", "s5uash", "ap8le", "pea7"], index=['a', 'b', 'c', 'd', 'e']),
         'two' : pd.Series(["po1ato", "2omato", "squ0sh", "2pple", "p3ar"], index=['a', 'b', 'c', 'd', 'e'])}

 df_Q = pd.DataFrame(Q)

 # Define the function that Corrects & Scores the Spelling
 def Spelling(ask):
     a = difflib.get_close_matches(ask, Li_A, n=5, cutoff=0.1)

     # List comprehension for all values of a
     b = [difflib.SequenceMatcher(None, ask, x).ratio() for x in a]
     return pd.Series(a + b)

 # Apply the function that Corrects & Scores the Spelling
 df_A = df_Q['one'].apply(Spelling)

 # Get the column names on the A dataframe
 c = len(df_A.columns) // 2
 df_A.columns = ['Spelling_{}'.format(x) for x in range(c)] + \
                ['Score_{}'.format(y)    for y in range(c)]

 # Join the Q & A dataframes
 df_QA = df_Q.join(df_A)

Это дает результат:

 df_QA
       one     two Spelling_0 Spelling_1 Spelling_2 Spelling_3 Spelling_4  \
 a  potat0  po1ato     potato     tomato       pear      apple     squash   
 b  toma3o  2omato     tomato     potato       pear      apple     squash   
 c  s5uash  squ0sh     squash       pear      apple     tomato     potato   
 d   ap8le   2pple      apple       pear     tomato     squash     potato   
 e    pea7    p3ar       pear     potato      apple     tomato     squash   

     Score_0   Score_1   Score_2   Score_3   Score_4  
 a  0.833333  0.500000  0.400000  0.181818  0.166667  
 b  0.833333  0.333333  0.200000  0.181818  0.166667  
 c  0.833333  0.200000  0.181818  0.166667  0.166667  
 d  0.800000  0.222222  0.181818  0.181818  0.181818  
 e  0.750000  0.400000  0.444444  0.200000  0.200000  

Для строки «e» «картофель» находится в строке 1, а «яблоко» — во 2 строке. Однако яблоко получило более высокий балл, чем картофель. Это неправильный путь для моего приложения.

Как мне получить более высокие результаты подсчета очков, если они будут последовательно слева?

Редактировать 1: я попробовал более простой код:

 import difflib
 Li_A = ["potato", "tomato", "squash", "apple", "pear"]
 Q    = "pea7"
 A = difflib.get_close_matches(Q, Li_A, n=5, cutoff=0.1)

& получил тот же результат:

 A: ['pear', 'potato', 'apple', 'tomato', 'squash']

Я также попробовал более простой код оценки:

 import difflib
 S1 = difflib.SequenceMatcher(None, "pea7", "potato")
 R1 = S1.ratio()
 S2 = difflib.SequenceMatcher(None, "pea7", "apple")
 R2 = S2.ratio()

и снова я получил тот же результат:

 R1: 0.4
 R2: 0.444

Редактировать 2 Я попробовал это с помощью fuzzywuzzy. Я снова получил тот же результат, так как fuzzywuzzy зависит от difflib:

 from fuzzywuzzy import fuzz
 R1 = fuzz.ratio("pea7", "potato")
 R2 = fuzz.ratio("pea7", "apple")

  • хм, странно. Я пробую print (a), и он возвращает неверные значения, может быть, какая-то проблема в a = difflib.get_close_matches(ask, Li_A, n=5, cutoff=0.1)? 20.02.2018
  • Израэль спасибо. Я попытался изменить его так, чтобы он назывался только одним: x в диапазоне (c)] + \ ['Score_{}'.format(y) для y в диапазоне (c)]. # a теперь не является значением, а c теперь равно 5. 21.02.2018
  • И тогда он работает? 21.02.2018
  • Нет, это не изменило результат 24.02.2018
  • Итак, проблема в том, почему функция difflib.get_close_matches(ask, Li_A, n=5, cutoff=0.1) возвращает неверные результаты? 24.02.2018
  • Или у SequenceMatcher может быть другое мнение о том, насколько результаты близки к get_close_matches? 24.02.2018
  • Я действительно хотел бы помочь вам, но я понятия не имею. 24.02.2018
  • Я чувствую, что get_close_matches может быть правильным; что картофель ближе к гороху7, чем к яблоку. Это поставило бы ошибку на суд SequenceMatcher... 24.02.2018
  • может, мне попробовать Fuzzywuzzy? 24.02.2018
  • У меня есть только базовый опыт, поэтому я, к сожалению, не знаю :( Но очевидно, что если какое-то решение не работает, лучше всего попробовать другое. Так что попробуйте Fuzzywuzzy. 24.02.2018
  • @ R.Cox Вы можете лучше понять, что происходит, посмотрев на list(difflib.SequenceMatcher(None, 'pea7', 'potato').get_opcodes()) для каждого... 24.02.2018
  • @JonClements спасибо. Я попробовал это и получил [('равно', 0, 1, 0, 1), ('заменить', 1, 2, 1, 3), ('равно', 2, 3, 3, 4), (' replace', 3, 4, 4, 6)] пожалуйста, что это значит? 26.02.2018
  • - это описывает, как превратить "pea7" в "картошку" 26.02.2018
  • @R.Cox, эээ ... Я не помню, что пришло мне в голову, но get_close_matches (вам нужно посмотреть код для этого и SequenceMatcher - они в Python) вычисляют соотношение на основе количества шаги и тип шагов, предпринятых для перевода одной строки в другую... так что это даст вам 1) понимание того, как рассчитывается отношение и 2) (возможно) некоторые идеи по настройке алгоритма, чтобы для ваших случаев он был ближе тому, что вы ожидаете. Это может быть связано или даже не стоит вашего времени - я просто выбрасываю это как идею. 26.02.2018
  • @JonClements спасибо, думаю, я попытаюсь это сделать. Я вижу, что get_opcodes говорит мне, что делает SequenceMatcher. Есть ли способ увидеть, что делает get_close_matches? Я думаю, что он должен делать что-то другое, потому что он дает результаты в другом порядке. 28.02.2018
  • SequenceMatcher правильно вычисляет соотношение, используя метод, описанный Ratcliff and Metzener, 1988. То есть для количества найденных общих символов (CC) и общего количества символов в двух строках (CT): отношение = 2.CC /CT Похоже, проблема связана с get_close_matches. 20.04.2018

Ответы:


1

SequenceMatcher правильно вычисляет соотношение, используя метод, описанный Ratcliff and Metzener, 1988. То есть для количества найденных общих символов (CC) и общего количества символов в двух строках (CT):

ratio = 2.CC/CT 

Так что похоже проблема с get_close_matches

16.07.2018
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.