Как сравнить строки с не точным соответствием - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно сравнить две выходные строки, а именно исходную транскрипцию и транскрипцию службы преобразования речи в текст.Часто числа пишутся в числовом формате или в виде слова, например, «четыре» или «4».Как сравнивать строки с учетом этих разных методов транскрибирования?

До сих пор я просто преобразовывал обе строки в строчные буквы и разделял каждое слово с пробелом в качестве разделителя.

#Read the two files and store them in s1_raw and s2_raw
with open('original.txt', 'r') as f:
    s1_raw = f.read()
with open('comparison.txt', 'r') as f:
    s2_raw = f.read()

#Transform all letters to minuscule letter
s1 = s1_raw.lower()
s2 = s2_raw.lower()

#Split texts with space as seperator to have a list of words
s1_set = s1.split(' ')
s2_set = s2.split(' ')

#Used later for confidence calculation
count1 = len(s1_set)
count2 = 0
x = 0

#Check which string is longer to prevent running out of indices
if len(s1_set) < len(s2_set):
    #Loop through whole list and compare word by word
    for x in range (0, len(s1_set)):
        if s1_set[x] == s2_set[x]:
            count2 += 1
        x += 1
else:
    #Loop through whole list and compare word by word
    for x in range (0, len(s2_set)):
        if s1_set[x] == s2_set[x]:
            count2 += 1
        x += 1

#Confidence level= correct words divided by total words
confidence = count2/count1

#Print out result
print('The confidence level of this service is {:.2f}%'.format(confidence*100))

Я хочу измерить точность транскрипции для нескольких файлов * .txt и рассмотреть все различные способы транскрибирования различными службами преобразования речи в текст.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Спасибо @Майкл Векслер. Теперь я попробовал библиотеку NLTK, чтобы разделить строку на списки слов более эффективно. Кроме того, я попытался найти синонимы каждого слова и сравнить, совпадают ли синонимы. Это все еще не решает задачу, поэтому мне интересно, что еще я мог бы попробовать.

Я использую эти две библиотеки:

from nltk.tokenize import word_tokenize
from nltk.corpus import wordnet

Разделить слова так же просто, как:

s1_set = word_tokenize(list1)

Теперь я пытаюсь найти синонимы слов и взять первый найденный синоним. Я добавляю его в пустой список с именем "wl1". Я проверяю, есть ли синоним, так как это не всегда так.

for i in range(0, (len(s1_set)-1)):
    #Find synonym of word in s1_set index i
    t1 = wordnet.synsets(s1_set[i])
    #Ensure t1 isn't empty
    if t1:
        wl1.append(t1[0].lemmas()[0].name())

Тогда я снова сравниваю слово за словом, как в моем первом посте выше. Этот метод также не является удовлетворительным решением моей проблемы. Кто-нибудь может придумать лучший метод?

0 голосов
/ 10 апреля 2019

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

Например, если four является канонической формой, то напишите код для замены 1 на one, 213 на two hundred and thirteen и т. Д., И выполните сравнение с ними.

На самом деле, я думаю, что лучше нормализовать до 4, чем four, поскольку в некоторых языках может быть несколько способов выражения числа. Предпочитая 4, можно нормализовать все эквивалентные транскрипции к одной единственной форме.

...