Browse Source

minor fixes, comments

+ test script for count analysis
feature/find_holes
Figg 6 months ago
parent
commit
7f1705fdaf

+ 24
- 9
million/analyze/count_analysis.py View File

4
 
4
 
5
 
5
 
6
 def check_extra_or_missing_letter(word: str, reference: str) -> bool:
6
 def check_extra_or_missing_letter(word: str, reference: str) -> bool:
7
+    """
8
+    Cette méthode vérifie si la str word contient une et une seule lettre
9
+    de trop ou de moins par rapport à la str reference
10
+    """
7
     len_word = len(word)
11
     len_word = len(word)
8
     len_ref = len(reference)
12
     len_ref = len(reference)
9
 
13
 
21
 
25
 
22
 
26
 
23
 def check_single_letter_differ(word: str, reference: str) -> bool:
27
 def check_single_letter_differ(word: str, reference: str) -> bool:
28
+    """
29
+    Cette méthode vérifie si la str word contient une et une seule
30
+    lettre différente par rapport à la str reference
31
+    """
24
     return sum(1 for x, y in zip(reference, word) if x != y) == 1
32
     return sum(1 for x, y in zip(reference, word) if x != y) == 1
25
 
33
 
26
 
34
 
27
 def check_letter_swap(word: str, reference: str) -> bool:
35
 def check_letter_swap(word: str, reference: str) -> bool:
36
+    """
37
+    Cette méthode vérifie si la str word contient un et un seul
38
+    échange de lettres consécutives par rapport à la str reference
39
+    """
28
     if len(word) != len(reference):
40
     if len(word) != len(reference):
29
         return False
41
         return False
30
 
42
 
36
 
48
 
37
 
49
 
38
 def check_typo(word: str, reference: str) -> bool:
50
 def check_typo(word: str, reference: str) -> bool:
51
+    """
52
+    Cette méthode vérifie si la str word contient une typo en se référant à la str reference
53
+    """
39
     if len(reference) == len(word):
54
     if len(reference) == len(word):
40
         return check_single_letter_differ(word, reference) or check_letter_swap(
55
         return check_single_letter_differ(word, reference) or check_letter_swap(
41
             word, reference
56
             word, reference
70
     Elle utilise pour cela des méthodes complexes qui ne permettent de trouver un résultat
85
     Elle utilise pour cela des méthodes complexes qui ne permettent de trouver un résultat
71
     seulement si on est sortis du cas nominal
86
     seulement si on est sortis du cas nominal
72
     """
87
     """
73
-    # TODO Si on ne trouve pas le chiffre dans la plage, appliquer différentes méthodes "HEAVYCHECK" avant de le déclarer perdu
74
-    #   - créer une méthode qui concatène des messages consécutifs jusqu'a trouver la bonne valeur si la valeur est plus basse
75
-    #   - créer une méthode pour les messages ou 2 valeurs sont collées si la valeur est plus haute
76
-    #   - sub certains caractères par des chiffres selon une table préconcue, les chiffres en toute lettre par leur équivalent
77
-    #   - virer tout sauf les chiffres
88
+    # TODO
89
+    #   - créer une méthode pour gérer le cas où plusieurs comptages sont contenus dans le même corps de message
90
+    #   - créer une méthode pour le cas où les chiffres sont représentés par un substitut au sein du corps du message
91
+    #     i.e. un nombre écrit en toutes lettres (français ou breton), 🍁 pour 420, @Elias Cheddar pour 69
78
     m = messages[index]
92
     m = messages[index]
79
     word = str(msg_val.get(m))
93
     word = str(msg_val.get(m))
80
 
94
 
82
         check_typo(word, str(expected)) and msg_val.get(messages[index+1]) == expected+1
96
         check_typo(word, str(expected)) and msg_val.get(messages[index+1]) == expected+1
83
 
97
 
84
 
98
 
85
-def _check_value_around(messages, index, expected, amplitude):
86
-    for i in range(1, amplitude + 1):
99
+def _check_value_around(messages, index, expected, amplitude_after, amplitude_before):
100
+    for i in range(1, amplitude_after + 1):
87
         if index + i < len(messages) and expected == msg_val.get(messages[index + i]):
101
         if index + i < len(messages) and expected == msg_val.get(messages[index + i]):
88
             return index + i
102
             return index + i
103
+    for i in range(1, amplitude_before + 1):
89
         if expected == msg_val.get(messages[index - i]):
104
         if expected == msg_val.get(messages[index - i]):
90
             return index - i
105
             return index - i
91
 
106
 
92
     return None
107
     return None
93
 
108
 
94
 
109
 
95
-def search_value_at(messages, index, expected, do_heavy_check=True, amplitude=1000):
110
+def search_value_at(messages, index, expected, do_heavy_check=True, amplitude_after=1000, amplitude_before=10):
96
     """
111
     """
97
     Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné.
112
     Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné.
98
     Le paramètre amplitude détermine la plage où effectuer les recherches autour de l'index donné.
113
     Le paramètre amplitude détermine la plage où effectuer les recherches autour de l'index donné.
104
         return index
119
         return index
105
 
120
 
106
     # Sinon on regarde aux alentours
121
     # Sinon on regarde aux alentours
107
-    jump_index = _check_value_around(messages, index, expected, amplitude)
122
+    jump_index = _check_value_around(messages, index, expected, amplitude_after, amplitude_before)
108
     if jump_index is not None:
123
     if jump_index is not None:
109
         return jump_index
124
         return jump_index
110
 
125
 

+ 1
- 1
million/analyze/media_count_mapper.py View File

4
 from pydantic import BaseModel, PrivateAttr
4
 from pydantic import BaseModel, PrivateAttr
5
 from million.model.message import Message
5
 from million.model.message import Message
6
 
6
 
7
-_default_file_path = 'data/DNS'
7
+_default_file_path = 'data/DefaultMediaCountMapFile'
8
 
8
 
9
 class MediaCountMapper(BaseModel):
9
 class MediaCountMapper(BaseModel):
10
     file_path:str = _default_file_path
10
     file_path:str = _default_file_path

+ 0
- 3
million/analyze/message_evaluation.py View File

37
     return value
37
     return value
38
 
38
 
39
 
39
 
40
-# 1🍁 pour 1420 ?
41
-# @Elias Cheddar pour 69 ?
42
-
43
 def _computeContent(msg: Message) -> int:
40
 def _computeContent(msg: Message) -> int:
44
     if not msg.content:
41
     if not msg.content:
45
         return
42
         return

+ 34
- 0
scripts/test_count_analysis.py View File

1
+import million.parse.fb_exports as fb
2
+import million.analyze.message_evaluation as msg_val
3
+from million.analyze.count_analysis import  search_value_at
4
+
5
+
6
+DATA_PATH = "./data/"
7
+export = fb.parse_dirfiles(DATA_PATH)
8
+messages = export.messages
9
+
10
+expected = 0
11
+idx = 0
12
+total_len = len(messages)
13
+total_as_percent = 100 / total_len
14
+
15
+with open('output/analysis_breakdown.txt', 'w', encoding="utf-8") as fichier:
16
+    while idx < total_len:
17
+        print(f"\r{round(idx * total_as_percent, 1)}%", end="")
18
+
19
+        # skip messages with no detected value
20
+        if msg_val.get(messages[idx]) == None:
21
+            idx += 1
22
+            continue
23
+
24
+        expected += 1
25
+
26
+        found_index = search_value_at(messages, idx, expected)
27
+        
28
+        if found_index:
29
+            fichier.write(f"{expected}\t⇒{messages[found_index]}\n")
30
+            idx = found_index + 1
31
+        else:
32
+            fichier.write(f"{expected}[X]\t⇒{messages[idx]}\n")
33
+
34
+print("\nComplete analysis in: output/analysis_breakdown.txt")

Loading…
Cancel
Save