Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
okvivi opened this issue May 26, 2012 · 2 comments
Open

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

okvivi opened this issue May 26, 2012 · 2 comments

Comments

@okvivi
Copy link
Member

okvivi commented May 26, 2012

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:

  • căutarea de texte în ghilimele
  • căutarea numelui politicianului în același paragraf, în afara ghilimelelor.

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
Copy link
Member

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
Copy link
Member

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

@ghost ghost assigned florinpopescu Oct 1, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants