-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathner.py
More file actions
148 lines (118 loc) · 6.17 KB
/
Copy pathner.py
File metadata and controls
148 lines (118 loc) · 6.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import re
def structureTrainingData(trainingData):
numberRegex = "(^[0-9])"
sentence = list()
structuredTrainingData = list()
for line in trainingData:
line.strip()
if re.search(numberRegex, line):
chunks = line.split("\n")[0].split("\t")
sentence.append([chunk for chunk in chunks[1:]])
else:
structuredTrainingData.append(sentence)
sentence = []
return structuredTrainingData
def analyzeTrainingData(structuredTrainingData):
words = list()
tags = list()
tagCounts = dict()
wordCounts = dict()
for sentence in structuredTrainingData:
for word, tag in sentence:
words.append(word)
tags.append(tag)
wordCounts[word] = wordCounts[word] + 1 if word in wordCounts else 1
tagCounts[tag] = tagCounts[tag] + 1 if tag in tagCounts else 1
return words, tags, tagCounts, wordCounts
def handleUnkowns(words, tags, tagCounts, wordCounts):
singleFrequencyWordsCount = 0
for index in range(len(words)):
if wordCounts[words[index]] == 1:
singleFrequencyWordsCount += 1
del wordCounts[words[index]]
words[index] = '<UNK>'
wordCounts['<UNK>'] = singleFrequencyWordsCount
return words, tags, tagCounts, wordCounts
def getTagTransitionProbabilities(tags, tagCounts):
tagTransitionProbabilities = dict()
for bigram in zip(tags, tags[1:]):
if bigram[0] not in tagTransitionProbabilities:
tagTransitionProbabilities[bigram[0]] = dict()
if bigram[1] not in tagTransitionProbabilities[bigram[0]]:
tagTransitionProbabilities[bigram[0]][bigram[1]] = 0
tagTransitionProbabilities[bigram[0]][bigram[1]] += 1
for tag1 in tagCounts:
for tag2 in tagCounts:
tagTransitionProbabilities[tag1][tag2] = ((tagTransitionProbabilities[tag1][tag2] if tag2 in tagTransitionProbabilities[tag1] else 0) + 1) / (tagCounts[tag1] + len(tagCounts))
return tagTransitionProbabilities
def getEmissionProbabilities(words, tags, tagCounts):
emissionProbabilities = dict()
for word, tag in zip(words, tags):
if tag not in emissionProbabilities:
emissionProbabilities[tag] = dict()
if word not in emissionProbabilities[tag]:
emissionProbabilities[tag][word] = 0
emissionProbabilities[tag][word] += 1
for tag in emissionProbabilities:
for word in emissionProbabilities[tag]:
emissionProbabilities[tag][word] = emissionProbabilities[tag][word] / tagCounts[tag]
return emissionProbabilities
def getStartingProbabilities(structuredTrainingData, tagCounts):
startingProbabilities = dict()
for sentence in structuredTrainingData:
if sentence[0] and sentence[0][1]:
if sentence[0][1] not in startingProbabilities:
startingProbabilities[sentence[0][1]] = 0
startingProbabilities[sentence[0][1]] += 1
for tag in tagCounts:
startingProbabilities[tag] = ((startingProbabilities[tag] if tag in startingProbabilities else 0) + 1) / (len(structuredTrainingData) + len(tagCounts))
return startingProbabilities
def viterbi(structuredTestingData, tagCounts, startingProbabilities, tagTransitionProbabilities, wordCounts, emissionProbabilities):
for sentence in structuredTestingData:
viterbiProbabilities = dict()
backTrack = dict()
for tag in tagCounts.keys():
viterbiProbabilities[tag] = list()
viterbiProbabilities[tag].append(startingProbabilities[tag] * emissionProbabilities[tag][sentence[0] if sentence[0] in list(wordCounts.keys()) else '<UNK>'])
backTrack[tag] = [0]
for index, word in enumerate(sentence[1:]):
for tag in tagCounts.keys():
maxProbability = max([(viterbiProbabilities[previousTag][index - 1]
* tagTransitionProbabilities[previousTag][tag]
* (emissionProbabilities[tag][word] if word in list(emissionProbabilities[tag]) else emissionProbabilities[tag]['<UNK>']), previousTag)
for previousTag in tagCounts])
viterbiProbabilities[tag].append(maxProbability[0])
backTrack[tag].append(maxProbability[1])
ans = max([(viterbiProbabilities[tag][-1], tag) for tag in list(tagCounts.keys())])
predictedTag = ans[1]
for i in range(len(sentence)):
sentence[-1 -i].append(predictedTag)
predictedTag = backTrack[predictedTag][-1 - i]
return structuredTestingData
def writeNEROutputData(structuredTestingData):
predictedTestingData = ''
for sentence in structuredTestingData:
newSentence = ''
for index, line in enumerate(sentence):
newLine = ''
newLine = '\t'.join(line)
newLine = str(index) + '\t' + newLine + '\n'
newSentence = newSentence + newLine
predictedTestingData = predictedTestingData + newSentence + '\n'
return predictedTestingData
trainingFileName = "S21-gene-train.txt"
rawTrainingData = open(trainingFileName, 'r').readlines()
structuredTrainingData = structureTrainingData(rawTrainingData)
words, tags, tagCounts, wordCounts = analyzeTrainingData(structuredTrainingData)
words, tags, tagCounts, wordCounts = handleUnkowns(words, tags, tagCounts, wordCounts)
tagTransitionProbabilities = getTagTransitionProbabilities(tags, tagCounts)
emissionProbabilities = getEmissionProbabilities(words, tags, tagCounts)
startingProbabilities = getStartingProbabilities(structuredTrainingData, tagCounts)
testFileNAme = "F21-gene-test.txt"
rawTestingData = open(testFileNAme, 'r').readlines()
structuredTestingData = structureTrainingData(rawTestingData)
structuredTestingData = viterbi(structuredTestingData, tagCounts, startingProbabilities, tagTransitionProbabilities, wordCounts, emissionProbabilities)
predictedTestingData = writeNEROutputData(structuredTestingData)
f = open("predicted-file.txt", "a")
f.write(predictedTestingData)
f.close()