Package: search-string-overvaagning
Search StringInstallationYou can installsearch-stringfromPyPI:$pipinstallsearch-string-overvaagningThe package is supported on Python 3.8+. However, the package is only compiled usingmypycstarting from Python 3.10 which makes it about twice as fast. As such, it is strongly advised to run it on Python 3.10+.AboutThis package implements the search string object that is used acrosskm24.dkfor different types of surveillance.It is used for searching a text. For something to be deemed a match, the text must match thefirst_strand if thesecond_stris not empty, the text must also match thesecond_str. If thenot_stris not empty, the text mustnotmatch thenot_str. A logical AND is used between the three conditions. The three strings can each be a collection of strings separated by semicolons wherein a match is deemed by logical OR. You can use '~' to make a word boundary. Finally, you can use!globalat the end of a string to signal that that part should check globally.Quick examples:>>>ss=SearchString('example;hello','text','elephant',data=None)>>>ss.match('This is an example text')True>>>ss.match('This text says hello')True>>>ss.match('This is just an example')FalseUsageCreating Search StringsStart by importing theSearchStringclass:>>>fromsearch_stringimportSearchStringConstruct a new search string by supplying thefirst_str,second_str,not_strand anydatathat can be useful to refer back to later, such as an ID:>>>ss=SearchString('first','','',data=2)Optionally, you can also supply athird_strthat works in the same was asfirst_strandnot_strbuthasto be supplied as a keyword argument:>>>ss=SearchString('first','','',data=2,third_str='third')Matching textIf you just need to find out whether a given search string matches a text, you can use the method.matchon aSearchStringinstance.Often, what you want to do, is to match a collection of search strings across a list of text, e.g. sentences. You can do that the following way:>>>fromsearch_stringimportSearchString>>>search_strings=[...SearchString('kan','','ritzau',data=1),...SearchString('kan','','ritzau!global',data=2)...]>>>sentences=[...'Du kan skrive din tekst her.',...'Den kan bestå af flere sætninger.',...'Dig og Ritzau kan bestemme hvordan det skal være.',...'Nogle kan være lange, andre kan være korte.'...]>>>res=SearchString.find_all(sentences,search_strings)>>>res[SearchString(kan,-,ritzau,data=1)]For each of the matched search strings (in the above example, only one), you can extract the data and the matched text as follows:>>>res[0].data1>>>res[0].matched_text'Du kan skrive din tekst her. Den kan bestå af flere sætninger. (...) Nogle kan være lange, andre kan være korte.'>>>res[0].matched_text_highligthed'Du <b>kan</b> skrive din tekst her. Den <b>kan</b> bestå af flere sætninger. (...) Nogle <b>kan</b> være lange, andre <b>kan</b> være korte.'SearchStringCollection - Matching when you have many search stringsIf you have a problem where you repeatedly will be matching new texts against the same collection of search strings, it is highly advised to use theSearchStringCollectionwhich behind the scenes uses atriefor efficient search when many search strings are present. There is some initial cost in building the trie. Thus, it is recommended that you initialize the collection once and then continue to use it.The most important method onSearchStringCollectionisfind_all, which takes a sentence (str) or list of sentences (list[str]) and returns the matched search strings, very similar to the familiarSearchString.find_all.>>>fromsearch_stringimportSearchString,SearchStringCollection>>>search_strings=[...SearchString('kan','','ritzau',data=1),...SearchString('kan','','ritzau!global',data=2)...]>>>sentences=...# Same as before>>>ss_collection=SearchStringCollection(search_strings)>>>res=ss_collection.find_all()>>>res[SearchString(kan,-,ritzau,data=1)]Importantly,SearchStringCollectionrelies on thedatavariable being set on the collection of search strings. If it is set toNoneor multiple search strings have the same value, the behavior is undefined.