Как рассчитать точность по тегам и вызвать POS-тегер? - PullRequest
6 голосов
/ 10 марта 2011

Я использую некоторые основанные на правилах и статистические теги POS, чтобы пометить корпус (около 5000 предложений ) с помощью частей речи (POS). Ниже приведен фрагмент моего тестового корпуса, в котором каждое слово отделено соответствующим POS-тегом с помощью '/'.

.
No/RB ,/, it/PRP was/VBD n't/RB Black/NNP Monday/NNP ./.
But/CC while/IN the/DT New/NNP York/NNP Stock/NNP Exchange/NNP did/VBD n't/RB fall/VB apart/RB Friday/NNP as/IN the/DT Dow/NNP Jones/NNP Industrial/NNP Average/NNP plunged/VBD 190.58/CD points/NNS --/: most/JJS of/IN it/PRP in/IN the/DT final/JJ hour/NN --/: it/PRP barely/RB managed/VBD *-2/-NONE- to/TO stay/VB this/DT side/NN of/IN chaos/NN ./.
Some/DT ``/`` circuit/NN breakers/NNS ''/'' installed/VBN */-NONE- after/IN the/DT October/NNP 1987/CD crash/NN failed/VBD their/PRP$ first/JJ test/NN ,/, traders/NNS say/VBP 0/-NONE- *T*-1/-NONE- ,/, *-2/-NONE- unable/JJ *-3/-NONE- to/TO cool/VB the/DT selling/NN panic/NN in/IN both/DT stocks/NNS and/CC futures/NNS ./.

После пометки корпуса это выглядит так:

No/DT ,/, it/PRP was/VBD n't/RB Black/NNP Monday/NNP ./. 
But/CC while/IN the/DT New/NNP York/NNP Stock/NNP Exchange/NNP did/VBD n't/RB fall/VB apart/RB Friday/VB as/IN the/DT Dow/NNP Jones/NNP Industrial/NNP Average/JJ plunged/VBN 190.58/CD points/NNS --/: most/RBS of/IN it/PRP in/IN the/DT final/JJ hour/NN --/: it/PRP barely/RB managed/VBD *-2/-NONE- to/TO stay/VB this/DT side/NN of/IN chaos/NNS ./. 
Some/DT ``/`` circuit/NN breakers/NNS ''/'' installed/VBN */-NONE- after/IN the/DT October/NNP 1987/CD crash/NN failed/VBD their/PRP$ first/JJ test/NN ,/, traders/NNS say/VB 0/-NONE- *T*-1/-NONE- ,/, *-2/-NONE- unable/JJ *-3/-NONE- to/TO cool/VB the/DT selling/VBG panic/NN in/IN both/DT stocks/NNS and/CC futures/NNS ./. 

Мне нужно рассчитать точность тегирования ( Tag wise- Recall & Precision ), поэтому необходимо найти ошибку (если есть) в тегировании для каждой пары слово-тег.

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

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

со страницы википедии :

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

1 Ответ

6 голосов
/ 11 марта 2011

Обратите внимание, что, поскольку каждое слово имеет ровно один тег, общие показатели отзыва и точности для этой задачи не имеют смысла (они оба будут просто равны показателю точности). Но имеет смысл запрашивать показатели отзыва и точности для каждого тега - например, вы можете найти отзыв и точность для тега DT.

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

Я не тестировал этот код, и мой Python довольно ржавый, но это должно дать вам идею. Я предполагаю, что файлы открыты, а структура данных totals представляет собой словарь словарей:

finished = false
while not finished:
    trueLine = testFile.readline()
    if not trueLine: # end of file
        finished = true
    else:
        trueLine = trueLine.split() # tokenise by whitespace
        taggedLine = taggedFile.readline()
        if not taggedLine:
            print 'Error: files are out of sync.'
        taggedLine = taggedLine.split()
        if len(trueLine) != len(taggedLine):
            print 'Error: files are out of sync.'
        for i in range(len(trueLine)):
            truePair = trueLine[i].split('/')
            taggedPair = taggedLine[i].split('/')
            if truePair[0] != taggedPair[0]: # the words should match
                print 'Error: files are out of sync.'
            trueTag = truePair[1]
            guessedTag = taggedPair[1]
            if trueTag == guessedTag:
                totals[trueTag]['truePositives'] += 1
            else:
                totals[trueTag]['falseNegatives'] += 1
                totals[guessedTag]['falsePositives'] += 1
...