Преглед на файлове

minor fixes, comments

+ test script for count analysis
feature/find_holes
Figg преди 9 месеца
родител
ревизия
7f1705fdaf
променени са 4 файла, в които са добавени 59 реда и са изтрити 13 реда
  1. 24
    9
      million/analyze/count_analysis.py
  2. 1
    1
      million/analyze/media_count_mapper.py
  3. 0
    3
      million/analyze/message_evaluation.py
  4. 34
    0
      scripts/test_count_analysis.py

+ 24
- 9
million/analyze/count_analysis.py Целия файл

@@ -4,6 +4,10 @@ from million.model.message import Message
4 4
 
5 5
 
6 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 11
     len_word = len(word)
8 12
     len_ref = len(reference)
9 13
 
@@ -21,10 +25,18 @@ def check_extra_or_missing_letter(word: str, reference: str) -> bool:
21 25
 
22 26
 
23 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 32
     return sum(1 for x, y in zip(reference, word) if x != y) == 1
25 33
 
26 34
 
27 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 40
     if len(word) != len(reference):
29 41
         return False
30 42
 
@@ -36,6 +48,9 @@ def check_letter_swap(word: str, reference: str) -> bool:
36 48
 
37 49
 
38 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 54
     if len(reference) == len(word):
40 55
         return check_single_letter_differ(word, reference) or check_letter_swap(
41 56
             word, reference
@@ -70,11 +85,10 @@ def _heavy_check(messages: List[Message], index: int, expected: int) -> bool:
70 85
     Elle utilise pour cela des méthodes complexes qui ne permettent de trouver un résultat
71 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 92
     m = messages[index]
79 93
     word = str(msg_val.get(m))
80 94
 
@@ -82,17 +96,18 @@ def _heavy_check(messages: List[Message], index: int, expected: int) -> bool:
82 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 101
         if index + i < len(messages) and expected == msg_val.get(messages[index + i]):
88 102
             return index + i
103
+    for i in range(1, amplitude_before + 1):
89 104
         if expected == msg_val.get(messages[index - i]):
90 105
             return index - i
91 106
 
92 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 112
     Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné.
98 113
     Le paramètre amplitude détermine la plage où effectuer les recherches autour de l'index donné.
@@ -104,7 +119,7 @@ def search_value_at(messages, index, expected, do_heavy_check=True, amplitude=10
104 119
         return index
105 120
 
106 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 123
     if jump_index is not None:
109 124
         return jump_index
110 125
 

+ 1
- 1
million/analyze/media_count_mapper.py Целия файл

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

+ 0
- 3
million/analyze/message_evaluation.py Целия файл

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

+ 34
- 0
scripts/test_count_analysis.py Целия файл

@@ -0,0 +1,34 @@
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…
Отказ
Запис