Show
Ignore:
Timestamp:
31.01.2017 21:35:50 (3 years ago)
Author:
davidb
Message:

Initial cut at including POS information to solr index

Location:
other-projects/hathitrust/wcsa/extracted-features-solr/trunk/solr-ingest/src/main/java/org/hathitrust/extractedfeatures
Files:
2 added
4 modified

Legend:

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

    r31266 r31375  
    3333     
    3434    protected WhitelistBloomFilter _whitelist_bloomfilter; 
    35  
     35    protected UniversalPOSLangMap _universal_langmap = null; 
    3636     
    3737    protected DoubleAccumulator _progress_accum; 
     
    136136                    // Convert to Solr add form 
    137137                    JSONObject solr_add_doc_json  
    138                         = SolrDocJSON.generateSolrDocJSON(volume_id, page_id, ef_page, _whitelist_bloomfilter,_icu_tokenize); 
     138                        = SolrDocJSON.generateSolrDocJSON(volume_id, page_id, ef_page,  
     139                                                    _whitelist_bloomfilter, _universal_langmap, 
     140                                                    _icu_tokenize); 
    139141                    solr_add_doc_json.put("filename_json_bz2", output_json_bz2); 
    140142 
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/solr-ingest/src/main/java/org/hathitrust/extractedfeatures/PerVolumeJSON.java

    r31372 r31375  
    33import java.io.IOException; 
    44import java.util.ArrayList; 
     5import java.util.HashMap; 
    56import java.util.Iterator; 
    67 
     
    2930    protected String _input_dir; 
    3031    protected String _whitelist_filename; 
     32    protected String _langmap_directory; 
    3133     
    3234    protected String _solr_url; 
     
    3638     
    3739    protected WhitelistBloomFilter _whitelist_bloomfilter; 
    38      
    39  
    40      
    41      boolean _icu_tokenize; 
    42      boolean _strict_file_io; 
    43       
    44     public PerVolumeJSON(String input_dir, String whitelist_filename, 
     40    protected UniversalPOSLangMap _universal_langmap; 
     41 
     42    boolean _icu_tokenize; 
     43    boolean _strict_file_io; 
     44 
     45    public PerVolumeJSON(String input_dir, String whitelist_filename, String langmap_directcory, 
    4546                         String solr_url, String output_dir, int verbosity,  
    4647                         boolean icu_tokenize, boolean strict_file_io) 
     
    4849        _input_dir  = input_dir; 
    4950        _whitelist_filename = whitelist_filename; 
     51        _langmap_directory = langmap_directcory; 
    5052         
    5153        _solr_url   = solr_url; 
     
    5759         
    5860        _whitelist_bloomfilter = null; 
     61        _universal_langmap = null; 
    5962    } 
    6063     
     
    6669            _whitelist_bloomfilter = new WhitelistBloomFilter(_whitelist_filename,true); 
    6770        } 
    68  
     71         
     72        if ((_langmap_directory != null) && (_universal_langmap == null)) { 
     73            _universal_langmap = new UniversalPOSLangMap(_langmap_directory); 
     74        } 
    6975        int ef_num_pages = 0; 
    7076 
     
    107113                        // Convert to Solr add form 
    108114                        JSONObject solr_add_doc_json  
    109                         = SolrDocJSON.generateSolrDocJSON(volume_id, page_id, ef_page, _whitelist_bloomfilter, _icu_tokenize); 
     115                        = SolrDocJSON.generateSolrDocJSON(volume_id, page_id, ef_page, _whitelist_bloomfilter, _universal_langmap, _icu_tokenize); 
    110116 
    111117 
  • other-projects/hathitrust/wcsa/extracted-features-solr/trunk/solr-ingest/src/main/java/org/hathitrust/extractedfeatures/ProcessForSolrIngest.java

    r31374 r31375  
    2121    private static final long serialVersionUID = 1L; 
    2222 
    23     // Following details on number of partitions to use given in  
    24     //  "Parallelized collections" section of: 
    25     //   https://spark.apache.org/docs/2.0.1/programming-guide.html 
    26     // 
    27     // For a more detailed discussion see: 
    28     //   http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/ 
    29      
    3023    protected static final int DEFAULT_NUM_CORES = 10; 
    3124    protected static final int MINIMUM_NUM_PARTITIONS = 10*DEFAULT_NUM_CORES;  
     
    3629    //protected String _json_list_filename; 
    3730    protected String _whitelist_filename; 
     31    protected String _langmap_directory; 
     32     
    3833    protected String _solr_url; 
    3934    protected String _output_dir; 
     
    4944        boolean use_whitelist = Boolean.getBoolean("wcsa-ef-ingest.use-whitelist"); 
    5045        _whitelist_filename = (use_whitelist) ?  System.getProperty("wcsa-ef-ingest.whitelist-filename") : null; 
     46         
     47        boolean use_langmap = Boolean.getBoolean("wcsa-ef-ingest.use-langmap"); 
     48        _langmap_directory = (use_langmap) ?  System.getProperty("wcsa-ef-ingest.langmap-directory") : null; 
     49         
    5150         
    5251        _solr_url   = solr_url; 
     
    110109        boolean strict_file_io = Boolean.getBoolean("wcsa-ef-ingest.strict-file-io"); 
    111110         
    112         PerVolumeJSON per_vol_json = new PerVolumeJSON(_input_dir,_whitelist_filename,  
     111        PerVolumeJSON per_vol_json = new PerVolumeJSON(_input_dir,_whitelist_filename, _langmap_directory, 
    113112                                                       _solr_url,_output_dir,_verbosity, 
    114113                                                       icu_tokenize,strict_file_io); 
  • 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()));