Ignore:
Timestamp:
01/31/17 21:35:50 (4 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 edited

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()));
Note: See TracChangeset for help on using the changeset viewer.