Python, как динамически найти имя человека в строке - PullRequest
0 голосов
/ 11 марта 2019

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

Ник ик Ник Ник НК

все соответствовало бы моему имени, текущий простой код, который у меня есть:

  def user_to_call(s):
  if "NICK" or "NIK" in s.upper(): redirect = "Nick"
  if redirect: return redirect

для четырехбуквенного имени возможно поместить все возможности в фильтр, но для имен с 12 буквами это немного излишне, так как я уверен, что это можно сделать намного эффективнее.

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Вам нужно использовать Levenshtein_distance

Реализация Python - это nltk

import nltk
nltk.edit_distance("humpty", "dumpty")
0 голосов
/ 11 марта 2019

В основном вам нужно нечеткое сопоставление строк, см .:

https://en.wikipedia.org/wiki/Approximate_string_matching

https://www.datacamp.com/community/tutorials/fuzzy-string-python

Исходя из этого, вы можете проверить, насколько похожи данные по сравнению с вашим словарем:

 from fuzzywuzzy import fuzz

 name = "nick"
 tomatch = ["Nick", "ick", "nik", "nic", "nck", "nickey", "njick", "nickk", "nickn"]
 for str in tomatch:
    ratio = fuzz.ratio(str.lower(), name.lower())
    print(ratio)

Этот код выдаст следующий вывод:

100
86
86
86
86
80
89
89
89

Вы должны поэкспериментировать с различными соотношениями и проверить, какие из них будут соответствовать вашим требованиям, чтобы пропустить только одну букву

0 голосов
/ 11 марта 2019

Из того, что я понимаю, вы не смотрите ни на какое нечеткое совпадение.(Потому что вы не проголосовали против других ответов).Если вы просто пытаетесь оценить то, что вы указали в своем запросе, вот код.Я поставил некоторые дополнительные условия, где я напечатал соответствующее сообщение.Не стесняйтесь удалять их.

def wordmatch(baseword, wordtoMatch, lengthOfMatch):
    lis_of_baseword = list(baseword.lower())
    lis_of_wordtoMatch = list(wordtoMatch.lower()) 
    sum = 0
    for index_i, i in enumerate(lis_of_wordtoMatch):
        for index_j, j in enumerate(lis_of_baseword):
            if i in lis_of_baseword:
                if i == j and index_i <= index_j:
                    sum = sum + 1
                    break
                else:
                    pass
            else:
                print("word to match has characters which are not in baseword")
                return 0
    if sum >= lengthOfMatch and len(wordtoMatch) <= len(baseword):
        return 1
    elif sum >= lengthOfMatch and len(wordtoMatch) > len(baseword):
        print("word to match has no of characters more than that of baseword")
        return 0
    else:
        return 0

base = "Nick"
tomatch = ["Nick", "ick", "nik", "nic", "nck", "nickey","njick","nickk","nickn"]
wordlength_match = 3 # this says how many words to match in the base word. In your case, its 3

for t_word in tomatch:
    print(wordmatch(base,t_word,wordlength_match))

результат выглядит следующим образом

1
1
1
1
1
word to match has characters which are not in baseword
0
word to match has characters which are not in baseword
0
word to match has no of characters more than that of baseword
0
word to match has no of characters more than that of baseword
0

Дайте мне знать, если это послужило вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...