pistruiatul / hartapoliticii

Harta Politicii din România
http://hartapoliticii.ro
Other
62 stars 21 forks source link

Detectarea automată de declarații din știri #32

Open okvivi opened 12 years ago

okvivi commented 12 years ago

Deja harta politicii parsează și indexează știrile politice din Mediafax și Hotnews.

Codul este aici https://github.com/pistruiatul/hartapoliticii/tree/master/python/src/ro/vivi/news_parser Și de obicei este rulat prin scriptul ăsta https://github.com/pistruiatul/hartapoliticii/blob/master/tools/news_parser.sh

Ar fi foarte interesant dacă am adăuga la acest script și o funcție de detectare a declarațiilor politicienilor.

Feature-ul ar putea fi implementat foarte simplu:

Ar fi okay dacă la început nu am detecta toate declarațiile ci doar o parte, cele ușor de detectat, urmând să fie îmbunătățit în viitor.

Vivi.

florinpopescu commented 11 years ago

Incomplet, va fi continuat de acasa.

32_hartapoliticii_automated_extraction_of_declarations_from_news.patch

diff --git a/python/src/ro/vivi/news_parser/entity_extractor.py b/python/src/ro/vivi/news_parser/entity_extractor.py
index 2beeb9d..4bb8ca5 100644
--- a/python/src/ro/vivi/news_parser/entity_extractor.py
+++ b/python/src/ro/vivi/news_parser/entity_extractor.py
@@ -76,6 +76,7 @@ def get_names_from_text(data):
   names = []
   name = []
   for word in words:
+    #print '@@@@@@@@@@', word
     # when you meet a separator, delete the name
     if re.search("[.,;\]\[]", word) or \
        re.search("^[0-9a-zşșî/(\\-]", word) or \
@@ -83,6 +84,7 @@ def get_names_from_text(data):
        word == "" or \
        word in common_capitalized_words:
       if len(name) > 1:
+        #print '!!!!!!!!!!!!!!1blablabla:' , name
         names.append(name)
       name = []
     else:
@@ -90,6 +92,62 @@ def get_names_from_text(data):

   return names

+def build_full_name(name):
+  full_name = ''
+  for name_part in name:
+    full_name = full_name + (' ' + name_part)
+  full_name = full_name[1:]
+  return full_name
+
+def get_quotes_from_text(names, data):
+
+  data = strip_tags_and_new_lines(data)  
+  pointer = 0
+
+  names_length = len(names)
+  print '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1'
+  for index,name in enumerate(names):
+    length = len(name)
+
+
+    full_name = build_full_name(name)
+
+    finding = data.find(full_name, pointer)
+    if finding == -1:
+      continue
+    else:
+       pointer = finding
+    pointer += len(full_name)
+
+
+    first_apparence_quote  = data.find('\"', pointer)
+
+    if first_apparence_quote == -1:
+      break
+
+
+
+    last_apparence_quote = data.find('\"', first_apparence_quote + 1)
+
+    if last_apparence_quote == -1:
+      break
+
+    if index + 1 < names_length:
+      next_name_apparence_before_quote = data.find(build_full_name(names[index + 1]), pointer)
+      next_name_apparence_after_quote = data.find(build_full_name(names[index + 1]), last_apparence_quote)
+      dot_apparence = data.find('.', last_apparence_quote)
+
+      q_apparence = data.find('?', last_apparence_quote)
+      exclamation_apparence = data.find('!', last_apparence_quote)
+      if first_apparence_quote < last_apparence_quote - 2 and next_name_apparence_before_quote > first_apparence_quote:
+        print full_name, ' : ', data[first_apparence_quote:last_apparence_quote + 1], 'bla', first_apparence_quote, 'bla', last_apparence_quote, 'bla', pointer
+        pointer = last_apparence_quote + 2
+    else:
+      print full_name, ' : ', data[first_apparence_quote:last_apparence_quote + 1]
+
+
+
+  return ' text '

 # A global cache for articles.
 link_to_article_id_hash = {}
@@ -252,6 +310,8 @@ for fname in files[-NUMBER_OF_DAYS_TO_PARSE : ]:
     news_content = urllib.unquote(item.findtext('news_content'))
     names = get_names_from_text(news_content)

+    quotes = get_quotes_from_text(names, news_content)
+
     for name in names:
       plain = ' '.join(name)
       id = get_person_id_for_name(plain)
florinpopescu commented 11 years ago

Voi continua de acasa. Idee:

Ma folosesc de numele deja gasite si de ideea ca ele sunt pastrate in ordinea in care s-au gasit. Cautarea trebuie sa fie realizata in O(n) : parcurg sirul si ma astept sa gasesc fiecare nume in ordine. Deasemenea gasesc si indicii ce descriu unde se afla un citat. La fel si pentru paragrafe. Cand am gasit un nume si imediat dupa el gasesc un citat (nici un alt nume intre ele) si ele sunt in acelasi paragraf/propozitie -> am gasit nume- citat. La fel pentru gasirea unui citat si imediat dupa el gasirea unui nume, ambele in acelasi paragraf/propozitie.

De exemplu: Traian Basescu a spus "bla bla" iar Ponta a negat spusele. In cazul acesta o sa am urmatoarele asocieri: Traian Basescu - "bla bla" si Ponta - "bla bla", urmand ca un ochi uman sa si arunce ochii si sa stearga ce e irelevant.

Alte imbunatatiri: sa caut si cuvinte cheie ca: "a spus", "a citat", "spune" etc.

Indiferent de metoda tot va fi nevoie de un ochi uman care sa filtreze rezultatele din baza de date.

Astept alte idei/sugestii. :D