Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- let file_read = System.IO.File.ReadAllText @"D:\input.txt"
- let file_write = new System.IO.FileInfo @"D:\output.txt"
- let search_names (sent : String) (names : Map<String, Set<int>>) index : Map<String, Set<int>> =
- let words = sent.Split([|' '; ','; ';'; '"';'\r'; '\n'; '\t'; ':'; '-'|])
- let rec search_names_rec (names_rec : Map<String, Set<int>>) i =
- match i with
- | a when a = words.Length -> names_rec
- | _ -> words.[i].Trim([|'.'; '!'; '?'; ' '; ')'; '('; ','; ';'; '"'; '\'' ;'\r'; '\n'; '\t'|]) |> (fun word ->
- if word.Length > 1 && Char.IsUpper(word.[0]) && not (Char.IsUpper(word.[1]))
- then
- let w =
- if word.[word.Length - 2] = '\'' && word.[word.Length - 1] = 's'
- then word.Remove(word.Length - 2)
- else word
- if names_rec.ContainsKey(w)
- then search_names_rec (names_rec.Add(w, names_rec.[w].Add(index))) (i + 1)
- else search_names_rec (names_rec.Add(w, Set.empty.Add(index))) (i + 1)
- else search_names_rec names_rec (i + 1))
- search_names_rec names 1
- type pair = string * string * int
- let exclusion = ["Russia"; "Russian"; "French"; "Princess"; "Prince"; "Emperor"; "Moscow"; "Count"; "Smolensk"; "Petersburg"; "Mademoiselle"; "His"; "Her"; "Project"; "Hills"; "Guards"; "The"; "Uncle"; "Countess"; "Tsar"; "German"; "Austrian"; "General"; "God"; "Charmee"; "Go"; "Get"; "From"; "However"; "When"; "Where"; "How"; "What"; "King"; "Kiss"; "King"; "A"; "Your"; "We"; "About"; "After"; "Street"; "Ah"; "An";"War";"And";"You";"That";"They";"These";"This";"She"]
- let main (text : String) : pair list =
- let sentences = text.Split([|'.'; '!'; '?'|]);
- let rec global_search (names : Map<string, Set<int>>) i : Map<string, Set<int>> =
- if (i < sentences.Length)
- then global_search (search_names (sentences.[i].Trim([|'.'; '!'; '?'; ' '; '’'; '\''|])) names i) (i + 1)
- else names
- let map = Map.filter (fun word _ -> not (List.exists (fun elem -> elem = word) exclusion)) (global_search Map.empty 0)
- let pairs = [ for n1 in map do
- for n2 in map do
- let c = Set.count(Set.intersect n1.Value n2.Value)
- if (n1.Key < n2.Key) && (c > 0) then yield (n1.Key, n2.Key, c)]
- let sort (p1 : pair) (p2 : pair) =
- let n (_, _, c) = c
- if (n p1 > n p2)
- then -1
- else 1
- List.sortWith sort pairs
- if not file_write.Exists then
- using (file_write.CreateText()) (fun stream ->
- for str in (main file_read) do
- stream.WriteLine(str.ToString()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement