Ignore:
Timestamp:
2017-01-31T21:35:50+13:00 (7 years ago)
Author:
davidb
Message:

Initial cut at including POS information to solr index

File:
1 edited

Legend:

Unmodified
Added
Removed
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/solr-ingest/src/main/java/org/hathitrust/extractedfeatures/SolrDocJSON.java

    r31308 r31375  
    1111import java.net.URL;
    1212import java.util.ArrayList;
     13import java.util.HashMap;
    1314import java.util.Iterator;
     15import java.util.Set;
     16
    1417import org.apache.commons.compress.compressors.CompressorException;
    1518import org.json.JSONArray;
     
    8891    }
    8992   
    90     protected static ArrayList<String> getTokenPosCountWordsArrayList(JSONObject ef_token_pos_count, String page_id,
     93    protected static ArrayList<POSString> getTokenPosCountWordsArrayList(JSONObject ef_token_pos_count, String page_id,
    9194            boolean icu_tokenize)
    9295    {
    93         ArrayList<String> words = new ArrayList<String>();
     96        ArrayList<POSString> words = new ArrayList<POSString>();
    9497
    9598        if (ef_token_pos_count != null) {
     
    99102                String word_token = word_token_iter.next();
    100103
     104                JSONObject pos_json_object = ef_token_pos_count.getJSONObject(word_token);
     105                Set<String> pos_keys = pos_json_object.keySet();   
     106                int pos_keys_len = pos_keys.size();
     107                String[] pos_tags = (pos_keys_len>0) ? pos_keys.toArray(new String[pos_keys_len]) : null;
     108               
    101109                if (icu_tokenize == true) {
    102110                    Reader reader = new StringReader(word_token);
     
    114122                        while (token_stream.incrementToken()) {
    115123                            String term = charTermAttribute.toString();
    116                             words.add(term);
     124                           
     125                            POSString pos_string = new POSString(term,pos_tags);
     126                       
     127                            words.add(pos_string);
    117128                        }
    118129
     
    125136                }
    126137                else {
    127                     words.add(word_token);
     138                    POSString pos_word_token = new POSString(word_token,pos_tags);
     139                   
     140                    words.add(pos_word_token);
    128141                }
    129142            }               
     
    135148        return words;
    136149    }
    137     protected static ArrayList<String> getTokenPosCountWordsMapCaseInsensitive(ArrayList<String> words_in)
    138     {
    139         ArrayList<String> words_out = new ArrayList<String>();
    140 
    141         for (String word: words_in) {
     150    protected static ArrayList<POSString> getTokenPosCountWordsMapCaseInsensitive(ArrayList<POSString> words_in)
     151    {
     152        ArrayList<POSString> words_out = new ArrayList<POSString>();
     153
     154        for (POSString pos_word: words_in) {
     155            String word = pos_word.getString();
     156            String[] pos_tags = pos_word.getPOSTags();
    142157           
    143158            Reader reader = new StringReader(word);
     
    154169                while (token_stream.incrementToken()) {
    155170                    String term = charTermAttribute.toString();
    156                     words_out.add(term);
     171                   
     172                    POSString pos_term = new POSString(term,pos_tags);
     173                    words_out.add(pos_term);
    157174                }
    158175
     
    169186    }
    170187   
    171     protected static ArrayList<String> getTokenPosCountWordsMapWhitelist(ArrayList<String> words_in,
     188    protected static ArrayList<POSString> getTokenPosCountWordsMapWhitelist(ArrayList<POSString> words_in,
    172189                                                                         WhitelistBloomFilter whitelist_bloomfilter)
    173190    {
    174         ArrayList<String> words_out = new ArrayList<String>();
    175 
    176         for (String word: words_in) {
    177            
     191        ArrayList<POSString> words_out = new ArrayList<POSString>();
     192
     193        for (POSString pos_word: words_in) {
     194            String word = pos_word.getString();
    178195            if (whitelist_bloomfilter.contains(word)) {
    179                 words_out.add(word);
     196                words_out.add(pos_word);
    180197            }
    181198        }
     
    259276    }
    260277   
    261     protected static ArrayList<String> filterSolrTextFields(JSONObject ef_token_pos_count, String page_id,
    262                                                WhitelistBloomFilter whitelist_bloomfilter, boolean icu_tokenize)
    263     {
    264         ArrayList<String> cs_tokens = getTokenPosCountWordsArrayList(ef_token_pos_count, page_id,icu_tokenize);
    265         ArrayList<String> lc_tokens = getTokenPosCountWordsMapCaseInsensitive(cs_tokens);
    266        
    267         ArrayList<String> tokens = null;
     278    protected static ArrayList<POSString> filterSolrTextFields(JSONObject ef_token_pos_count, String page_id,
     279                                               WhitelistBloomFilter whitelist_bloomfilter,
     280                                               UniversalPOSLangMap universal_langmap,
     281                                               boolean icu_tokenize)
     282    {
     283        ArrayList<POSString> cs_tokens = getTokenPosCountWordsArrayList(ef_token_pos_count, page_id,icu_tokenize);
     284        ArrayList<POSString> lc_tokens = getTokenPosCountWordsMapCaseInsensitive(cs_tokens);
     285       
     286        ArrayList<POSString> tokens = null;
    268287        if (whitelist_bloomfilter != null) {
    269288            tokens =  getTokenPosCountWordsMapWhitelist(lc_tokens,whitelist_bloomfilter);
     
    276295    }
    277296
    278     protected static void addSolrLanguageTextFields(JSONObject ef_page, ArrayList<String> text_al,
     297    protected static void addSolrLanguageTextFields(JSONObject ef_page, ArrayList<POSString> text_al,
     298                                                    UniversalPOSLangMap universal_langmap,
    279299                                                    JSONObject solr_doc_json)
    280300    {
     
    293313                    String lang_label = lang_key_iter.next();
    294314
    295                     String solr_field = lang_label + "_htrctoken";
    296                     lang_list[i] = solr_field;
     315                    lang_list[i] = lang_label;
    297316                }
    298317            }
     
    301320           
    302321            for (int li=0; li<lang_len; li++) {
    303                 String lang_text_field = lang_list[li];
    304            
    305                 JSONArray json_values = new JSONArray();
    306                 for (int ti=0; ti<text_len; ti++) {
    307                     String text_value = text_al.get(ti);
    308                     json_values.put(text_value);
    309                 }
    310                 solr_doc_json.put(lang_text_field, json_values);
     322                String lang_key = lang_list[li];
     323               
     324                if (universal_langmap.containsLanguage(lang_key))
     325                {
     326                    HashMap<String,JSONArray> pos_lang_text_field_map = new HashMap<String,JSONArray>();
     327                   
     328                    for (int ti=0; ti<text_len; ti++) {
     329                        POSString pos_text_value = text_al.get(ti);
     330                        String text_value = pos_text_value.getString();
     331                       
     332                        String[] pos_tags = pos_text_value.getPOSTags();
     333                        int pos_tags_len = pos_tags.length;
     334                       
     335                        for (int pti=0; ti<pos_tags_len; pti++) {
     336                            String opennlp_pos_key = pos_tags[pti];
     337                           
     338                            String upos = universal_langmap.getUniversalLanguagePOS(lang_key, opennlp_pos_key);
     339                            String pos_lang_text_field = lang_key + "_" + upos + "_htrctoken";
     340                           
     341                            if (!pos_lang_text_field_map.containsKey(pos_lang_text_field)) {
     342                                JSONArray empty_json_values = new JSONArray();
     343                                pos_lang_text_field_map.put(pos_lang_text_field, empty_json_values);
     344                            }
     345                            pos_lang_text_field_map.get(pos_lang_text_field).put(text_value);
     346                        }
     347                    }
     348
     349                    // Now add each of the POS language fields into solr_doc_json
     350                    Set<String> pos_lang_field_keys = pos_lang_text_field_map.keySet();
     351                    for (String plf_key : pos_lang_field_keys) {
     352                        String lang_text_field = plf_key;
     353                        JSONArray json_values = pos_lang_text_field_map.get(plf_key);
     354                       
     355                        solr_doc_json.put(lang_text_field, json_values);
     356                    }
     357                }
     358                else {
     359                    String lang_text_field = lang_key + "_htrctoken";
     360                   
     361                    JSONArray json_values = new JSONArray();
     362                    for (int ti=0; ti<text_len; ti++) {
     363                        POSString pos_text_value = text_al.get(ti);
     364                        String text_value = pos_text_value.getString();
     365                        json_values.put(text_value);
     366                    }
     367                    solr_doc_json.put(lang_text_field, json_values);
     368                   
     369                }
     370               
     371               
    311372            }
    312373           
     
    314375    }
    315376    protected static JSONObject generateSolrDocJSON(String volume_id, String page_id, JSONObject ef_page,
    316                                                     WhitelistBloomFilter whitelist_bloomfilter, boolean icu_tokenize)
     377                                                    WhitelistBloomFilter whitelist_bloomfilter,
     378                                                    UniversalPOSLangMap universal_langmap,
     379                                                    boolean icu_tokenize)
    317380    {
    318381        JSONObject solr_update_json = null;
     
    326389                    JSONObject solr_add_json = new JSONObject();
    327390   
    328                     ArrayList<String> text_al = filterSolrTextFields(ef_token_pos_count,page_id,whitelist_bloomfilter,icu_tokenize);
     391                    ArrayList<POSString> text_al = filterSolrTextFields(ef_token_pos_count,page_id,whitelist_bloomfilter,universal_langmap,icu_tokenize);
    329392                   
    330393                    JSONObject solr_doc_json = new JSONObject();
     
    332395                    solr_doc_json.put("volumeid_s", volume_id);
    333396                    if (text_al.size()>0) {
    334                         addSolrLanguageTextFields(ef_page,text_al, solr_doc_json);
     397                        addSolrLanguageTextFields(ef_page,text_al, universal_langmap, solr_doc_json);
    335398                        //solr_doc_json.put("eftext_txt", text_al.toString()); // ****
    336399                    }
     
    502565
    503566
     567        System.out.println("**** post_url = " + post_url);
     568       
    504569        try {
    505570            HttpURLConnection httpcon = (HttpURLConnection) ((new URL(post_url).openConnection()));
Note: See TracChangeset for help on using the changeset viewer.