text_rank 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/bin/console +3 -3
- data/lib/page_rank.rb +2 -0
- data/lib/page_rank/base.rb +9 -8
- data/lib/page_rank/dense.rb +2 -1
- data/lib/page_rank/sparse.rb +6 -7
- data/lib/text_rank.rb +11 -8
- data/lib/text_rank/char_filter.rb +1 -1
- data/lib/text_rank/char_filter/ascii_folding.rb +5 -1
- data/lib/text_rank/char_filter/strip_possessive.rb +2 -2
- data/lib/text_rank/char_filter/undo_contractions.rb +1 -137
- data/lib/text_rank/char_filter/undo_contractions.yml +135 -0
- data/lib/text_rank/fingerprint.rb +10 -18
- data/lib/text_rank/fingerprint_overlap.rb +55 -0
- data/lib/text_rank/graph_strategy/coocurrence.rb +15 -6
- data/lib/text_rank/keyword_extractor.rb +19 -21
- data/lib/text_rank/rank_filter/collapse_adjacent.rb +48 -25
- data/lib/text_rank/rank_filter/normalize_probability.rb +2 -1
- data/lib/text_rank/rank_filter/normalize_unit_vector.rb +2 -1
- data/lib/text_rank/token_filter/part_of_speech.rb +0 -1
- data/lib/text_rank/token_filter/stopwords.rb +1 -321
- data/lib/text_rank/token_filter/stopwords.yml +317 -0
- data/lib/text_rank/tokenizer.rb +1 -1
- data/lib/text_rank/tokenizer/money.rb +11 -6
- data/lib/text_rank/tokenizer/number.rb +4 -3
- data/lib/text_rank/tokenizer/punctuation.rb +4 -1
- data/lib/text_rank/tokenizer/url.rb +3 -0
- data/lib/text_rank/tokenizer/whitespace.rb +4 -1
- data/lib/text_rank/tokenizer/word.rb +5 -2
- data/lib/text_rank/version.rb +3 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57c44c7be2d14f3fb9d2b76212639c6f5416adedeb32e3c9d39a6b90368680bd
|
4
|
+
data.tar.gz: 829bf430e9cc9dd942bdd753f801fc01d94929f42be09c6504691d47bc7c9f04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bdb293e07cca83ba7665cbe3861360cd3e4b82d64d5cd2167717e509bff6ccf14948436463464a9ab57f92cd97b8e7a918d27d004f3a7c476feb5c55565191f
|
7
|
+
data.tar.gz: 446d28deeca6a972fc9b257b8699a859ec4fc481d6f04f31d02215d79a7251b87cfebeaba7335001e7977e974b72c3e79113c754d1749303dc943b3d59c6d62c
|
data/.rubocop.yml
CHANGED
@@ -15,6 +15,10 @@ Layout/EmptyLinesAroundModuleBody:
|
|
15
15
|
Layout/ExtraSpacing:
|
16
16
|
Enabled: false
|
17
17
|
|
18
|
+
Layout/HashAlignment:
|
19
|
+
EnforcedHashRocketStyle: table
|
20
|
+
EnforcedColonStyle: table
|
21
|
+
|
18
22
|
Layout/LineLength:
|
19
23
|
Max: 120
|
20
24
|
Enabled: false
|
@@ -89,6 +93,9 @@ Style/GuardClause:
|
|
89
93
|
Style/HashEachMethods:
|
90
94
|
Enabled: true
|
91
95
|
|
96
|
+
Style/HashSyntax:
|
97
|
+
Enabled: true
|
98
|
+
|
92
99
|
Style/HashTransformKeys:
|
93
100
|
Enabled: true
|
94
101
|
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'text_rank'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "text_rank"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/page_rank.rb
CHANGED
data/lib/page_rank/base.rb
CHANGED
@@ -19,8 +19,7 @@ module PageRank
|
|
19
19
|
# @return [Float]
|
20
20
|
def damping=(damping)
|
21
21
|
@damping = damping || 0.85
|
22
|
-
raise ArgumentError
|
23
|
-
@damping
|
22
|
+
raise ArgumentError, 'Invalid damping factor' if @damping <= 0 || @damping > 1
|
24
23
|
end
|
25
24
|
|
26
25
|
# Set the tolerance value
|
@@ -28,8 +27,7 @@ module PageRank
|
|
28
27
|
# @return [Float]
|
29
28
|
def tolerance=(tolerance)
|
30
29
|
@tolerance = tolerance || 0.0001
|
31
|
-
raise ArgumentError
|
32
|
-
@tolerance
|
30
|
+
raise ArgumentError, 'Invalid tolerance factor' if @tolerance.negative? || @tolerance > 1
|
33
31
|
end
|
34
32
|
|
35
33
|
# Adds a directed (and optionally weighted) edge to the graph
|
@@ -46,9 +44,12 @@ module PageRank
|
|
46
44
|
def calculate(max_iterations: -1, **_)
|
47
45
|
ranks = initial_ranks
|
48
46
|
loop do
|
49
|
-
break if max_iterations
|
50
|
-
|
47
|
+
break if max_iterations.zero?
|
48
|
+
|
49
|
+
prev_ranks = ranks
|
50
|
+
ranks = calculate_step(ranks)
|
51
51
|
break if distance(ranks, prev_ranks) < @tolerance
|
52
|
+
|
52
53
|
max_iterations -= 1
|
53
54
|
end
|
54
55
|
sort_ranks(ranks)
|
@@ -77,9 +78,9 @@ module PageRank
|
|
77
78
|
end
|
78
79
|
|
79
80
|
# Calculate the Euclidean distance from one ranking to the next iteration
|
80
|
-
def distance(
|
81
|
+
def distance(vector1, vector2)
|
81
82
|
sum_squares = node_count.times.reduce(0.0) do |sum, i|
|
82
|
-
d =
|
83
|
+
d = vector1[i] - vector2[i]
|
83
84
|
sum + d * d
|
84
85
|
end
|
85
86
|
Math.sqrt(sum_squares)
|
data/lib/page_rank/dense.rb
CHANGED
@@ -32,6 +32,7 @@ module PageRank
|
|
32
32
|
# @return (see Base#add)
|
33
33
|
def add(source, dest, weight: 1.0)
|
34
34
|
return if source == dest
|
35
|
+
|
35
36
|
source_idx = index(source)
|
36
37
|
dest_idx = index(dest)
|
37
38
|
@out_links[source_idx] ||= []
|
@@ -72,7 +73,7 @@ module PageRank
|
|
72
73
|
|
73
74
|
def to_matrix
|
74
75
|
total_out_weights = @out_links.map do |links|
|
75
|
-
links
|
76
|
+
links&.compact&.reduce(:+)
|
76
77
|
end
|
77
78
|
Matrix.build(node_count, node_count) do |dest_idx, source_idx|
|
78
79
|
total = total_out_weights[source_idx]
|
data/lib/page_rank/sparse.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
1
|
module PageRank
|
4
2
|
##
|
5
3
|
# Implementation of PageRank using a sparse matrix representation of the graph
|
@@ -33,6 +31,7 @@ module PageRank
|
|
33
31
|
# @return (see Base#add)
|
34
32
|
def add(source, dest, weight: 1.0)
|
35
33
|
return false if source == dest
|
34
|
+
|
36
35
|
@graph[dest] ||= Set.new
|
37
36
|
@graph[dest] << source
|
38
37
|
@weights[source] ||= Hash.new(0.0)
|
@@ -53,8 +52,8 @@ module PageRank
|
|
53
52
|
def initial_ranks
|
54
53
|
@dangling_nodes = @nodes - @weight_totals.keys
|
55
54
|
@normalized_weights = @weights.each_with_object({}) do |(source, values), h|
|
56
|
-
h[source] = values.
|
57
|
-
|
55
|
+
h[source] = values.transform_values do |w|
|
56
|
+
w / @weight_totals[source]
|
58
57
|
end
|
59
58
|
end
|
60
59
|
Hash[@nodes.map { |k| [k, 1.0 / node_count.to_f] }]
|
@@ -69,7 +68,7 @@ module PageRank
|
|
69
68
|
@dangling_nodes.each do |source|
|
70
69
|
sum += ranks[source] / node_count.to_f
|
71
70
|
end
|
72
|
-
new_ranks[dest] = @damping * sum + (1 - @damping)/node_count
|
71
|
+
new_ranks[dest] = @damping * sum + (1 - @damping) / node_count
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
@@ -79,8 +78,8 @@ module PageRank
|
|
79
78
|
Hash[ranks.map { |k, v| [k, v / sum] }.sort_by { |_, v| -v }]
|
80
79
|
end
|
81
80
|
|
82
|
-
def distance(
|
83
|
-
super(
|
81
|
+
def distance(vector1, vector2)
|
82
|
+
super(vector1.values.to_a, vector2.values.to_a)
|
84
83
|
end
|
85
84
|
|
86
85
|
end
|
data/lib/text_rank.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'page_rank'
|
2
|
+
require 'set'
|
3
|
+
require 'yaml'
|
2
4
|
|
3
5
|
##
|
4
6
|
# Provides convenience methods for quickly extracting keywords.
|
@@ -7,14 +9,15 @@ require 'page_rank'
|
|
7
9
|
##
|
8
10
|
module TextRank
|
9
11
|
|
10
|
-
autoload :CharFilter,
|
11
|
-
autoload :Fingerprint,
|
12
|
-
autoload :
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
12
|
+
autoload :CharFilter, 'text_rank/char_filter'
|
13
|
+
autoload :Fingerprint, 'text_rank/fingerprint'
|
14
|
+
autoload :FingerprintOverlap, 'text_rank/fingerprint_overlap'
|
15
|
+
autoload :GraphStrategy, 'text_rank/graph_strategy'
|
16
|
+
autoload :KeywordExtractor, 'text_rank/keyword_extractor'
|
17
|
+
autoload :RankFilter, 'text_rank/rank_filter'
|
18
|
+
autoload :TokenFilter, 'text_rank/token_filter'
|
19
|
+
autoload :Tokenizer, 'text_rank/tokenizer'
|
20
|
+
autoload :VERSION, 'text_rank/version'
|
18
21
|
|
19
22
|
# A convenience method for quickly extracting keywords from text with default options
|
20
23
|
# @param text [String] text from which to extract keywords
|
@@ -7,7 +7,7 @@ module TextRank
|
|
7
7
|
# converting non-ascii characters to related ascii characters, forcing text to
|
8
8
|
# lower case, stripping out HTML, converting English contractions (e.g. "won't")
|
9
9
|
# to the non-contracted form ("will not"), and more.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# Character filters are applied as a chain, so care should be taken to use them
|
12
12
|
# in the desired order.
|
13
13
|
##
|
@@ -1,13 +1,17 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
module TextRank
|
3
2
|
module CharFilter
|
4
3
|
##
|
5
4
|
# Characater filter to transform non-ASCII (unicode) characters into ASCII-friendly versions.
|
6
5
|
#
|
6
|
+
# rubocop:disable Style/AsciiComments
|
7
|
+
#
|
7
8
|
# = Example
|
8
9
|
#
|
9
10
|
# AsciiFolding.new.filter!("the Perigordian Abbé then made answer, because a poor beggar of the country of Atrébatie heard some foolish things said")
|
10
11
|
# => "the Perigordian Abbe then made answer, because a poor beggar of the country of Atrebatie heard some foolish things said"
|
12
|
+
#
|
13
|
+
# rubocop:enable Style/AsciiComments
|
14
|
+
#
|
11
15
|
##
|
12
16
|
class AsciiFolding
|
13
17
|
|
@@ -5,7 +5,7 @@ module TextRank
|
|
5
5
|
#
|
6
6
|
# = Example
|
7
7
|
#
|
8
|
-
# StripPosessive.new.filter!("to loathe one
|
8
|
+
# StripPosessive.new.filter!("to loathe one's very being and yet to hold it fast")
|
9
9
|
# => "to loathe one very being and yet to hold it fast"
|
10
10
|
##
|
11
11
|
class StripPossessive
|
@@ -15,7 +15,7 @@ module TextRank
|
|
15
15
|
# @return [String]
|
16
16
|
def filter!(text)
|
17
17
|
text.gsub!(/([a-z]+)'s\b/) do
|
18
|
-
|
18
|
+
Regexp.last_match(1)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -11,143 +11,7 @@ module TextRank
|
|
11
11
|
class UndoContractions
|
12
12
|
|
13
13
|
# List of English contractions to undo
|
14
|
-
CONTRACTIONS =
|
15
|
-
"ain't" => "am not",
|
16
|
-
"amn't" => "am not",
|
17
|
-
"aren't" => "are not",
|
18
|
-
"can't" => "can not",
|
19
|
-
"could've" => "could have",
|
20
|
-
"couldn't" => "could not",
|
21
|
-
"couldn't've" => "could not have",
|
22
|
-
"didn't" => "did not",
|
23
|
-
"doesn't" => "does not",
|
24
|
-
"don't" => "do not",
|
25
|
-
"gonna" => "going to",
|
26
|
-
"hadn't" => "had not",
|
27
|
-
"hadn't've" => "had not have",
|
28
|
-
"hasn't" => "has not",
|
29
|
-
"haven't" => "have not",
|
30
|
-
"he'd" => "he had",
|
31
|
-
"he'd've" => "he would have",
|
32
|
-
"he'll" => "he shall",
|
33
|
-
"he's" => "he has",
|
34
|
-
"he'sn't" => "he has not",
|
35
|
-
"how'd" => "how did",
|
36
|
-
"how'll" => "how will",
|
37
|
-
"how's" => "how has",
|
38
|
-
"i'd" => "i had",
|
39
|
-
"i'd've" => "i would have",
|
40
|
-
"i'll" => "i shall",
|
41
|
-
"i'm" => "i am",
|
42
|
-
"i've" => "i have",
|
43
|
-
"i'ven't" => "i have not",
|
44
|
-
"isn't" => "is not",
|
45
|
-
"it'd" => "it had",
|
46
|
-
"it'd've" => "it would have",
|
47
|
-
"it'll" => "it shall",
|
48
|
-
"it's" => "it has",
|
49
|
-
"it'sn't" => "it has not",
|
50
|
-
"let's" => "let us",
|
51
|
-
"ma'am" => "madam",
|
52
|
-
"mightn't" => "might not",
|
53
|
-
"mightn't've" => "might not have",
|
54
|
-
"might've" => "might have",
|
55
|
-
"mustn't" => "must not",
|
56
|
-
"must've" => "must have",
|
57
|
-
"needn't" => "need not",
|
58
|
-
"not've" => "not have",
|
59
|
-
"o'clock" => "of the clock",
|
60
|
-
"ol'" => "old",
|
61
|
-
"oughtn't" => "ought not",
|
62
|
-
"shan't" => "shall not",
|
63
|
-
"she'd" => "she had",
|
64
|
-
"she'd've" => "she would have",
|
65
|
-
"she'll" => "she shall",
|
66
|
-
"she's" => "she has",
|
67
|
-
"she'sn't" => "she has not",
|
68
|
-
"should've" => "should have",
|
69
|
-
"shouldn't" => "should not",
|
70
|
-
"shouldn't've" => "should not have",
|
71
|
-
"somebody'd" => "somebody had",
|
72
|
-
"somebody'd've" => "somebody would have",
|
73
|
-
"somebody'dn't've" => "somebody would not have",
|
74
|
-
"somebody'll" => "somebody shall",
|
75
|
-
"somebody's" => "somebody has",
|
76
|
-
"someone'd" => "someone had",
|
77
|
-
"someone'd've" => "someone would have",
|
78
|
-
"someone'll" => "someone shall",
|
79
|
-
"someone's" => "someone has",
|
80
|
-
"something'd" => "something had",
|
81
|
-
"something'd've" => "something would have",
|
82
|
-
"something'll" => "something shall",
|
83
|
-
"something's" => "something has",
|
84
|
-
"'sup" => "what's up",
|
85
|
-
"that'll" => "that will",
|
86
|
-
"that's" => "that has",
|
87
|
-
"there'd" => "there had",
|
88
|
-
"there'd've" => "there would have",
|
89
|
-
"there're" => "there are",
|
90
|
-
"there's" => "there has",
|
91
|
-
"they'd" => "they had",
|
92
|
-
"they'dn't" => "they would not",
|
93
|
-
"they'dn't've" => "they would not have",
|
94
|
-
"they'd've" => "they would have",
|
95
|
-
"they'd'ven't" => "they would have not",
|
96
|
-
"they'll" => "they shall",
|
97
|
-
"they'lln't've" => "they will not have",
|
98
|
-
"they'll'ven't" => "they will have not",
|
99
|
-
"they're" => "they are",
|
100
|
-
"they've" => "they have",
|
101
|
-
"they'ven't" => "they have not",
|
102
|
-
"'tis" => "it is",
|
103
|
-
"'twas" => "it was",
|
104
|
-
"wanna" => "want to",
|
105
|
-
"wasn't" => "was not",
|
106
|
-
"we'd" => "we had",
|
107
|
-
"we'd've" => "we would have",
|
108
|
-
"we'dn't've" => "we would not have",
|
109
|
-
"we'll" => "we will",
|
110
|
-
"we'lln't've" => "we will not have",
|
111
|
-
"we're" => "we are",
|
112
|
-
"we've" => "we have",
|
113
|
-
"weren't" => "were not",
|
114
|
-
"what'll" => "what shall",
|
115
|
-
"what're" => "what are",
|
116
|
-
"what's" => "what has",
|
117
|
-
"what've" => "what have",
|
118
|
-
"when's" => "when has",
|
119
|
-
"where'd" => "where did",
|
120
|
-
"where's" => "where has",
|
121
|
-
"where've" => "where have",
|
122
|
-
"who'd" => "who would",
|
123
|
-
"who'd've" => "who would have",
|
124
|
-
"who'll" => "who shall",
|
125
|
-
"who're" => "who are",
|
126
|
-
"who's" => "who has",
|
127
|
-
"who've" => "who have",
|
128
|
-
"why'll" => "why will",
|
129
|
-
"why're" => "why are",
|
130
|
-
"why's" => "why has",
|
131
|
-
"won't" => "will not",
|
132
|
-
"won't've" => "will not have",
|
133
|
-
"would've" => "would have",
|
134
|
-
"wouldn't" => "would not",
|
135
|
-
"wouldn't've" => "would not have",
|
136
|
-
"y'all" => "you all",
|
137
|
-
"y'all'd've" => "you all would have",
|
138
|
-
"y'all'dn't've" => "you all would not have",
|
139
|
-
"y'all'll" => "you all will",
|
140
|
-
"y'all'lln't" => "you all will not",
|
141
|
-
"y'all'll've" => "you all will have",
|
142
|
-
"y'all'll'ven't" => "you all will have not",
|
143
|
-
"you'd" => "you had",
|
144
|
-
"you'd've" => "you would have",
|
145
|
-
"you'll" => "you shall",
|
146
|
-
"you're" => "you are",
|
147
|
-
"you'ren't" => "you are not",
|
148
|
-
"you've" => "you have",
|
149
|
-
"you'ven't" => "you have not",
|
150
|
-
}
|
14
|
+
CONTRACTIONS = YAML.load_file(File.expand_path('undo_contractions.yml', __dir__))
|
151
15
|
|
152
16
|
# Perform the filter
|
153
17
|
# @param text [String]
|
@@ -0,0 +1,135 @@
|
|
1
|
+
ain't: am not
|
2
|
+
amn't: am not
|
3
|
+
aren't: are not
|
4
|
+
can't: can not
|
5
|
+
could've: could have
|
6
|
+
couldn't: could not
|
7
|
+
couldn't've: could not have
|
8
|
+
didn't: did not
|
9
|
+
doesn't: does not
|
10
|
+
don't: do not
|
11
|
+
gonna: going to
|
12
|
+
hadn't: had not
|
13
|
+
hadn't've: had not have
|
14
|
+
hasn't: has not
|
15
|
+
haven't: have not
|
16
|
+
he'd: he had
|
17
|
+
he'd've: he would have
|
18
|
+
he'll: he shall
|
19
|
+
he's: he has
|
20
|
+
he'sn't: he has not
|
21
|
+
how'd: how did
|
22
|
+
how'll: how will
|
23
|
+
how's: how has
|
24
|
+
i'd: i had
|
25
|
+
i'd've: i would have
|
26
|
+
i'll: i shall
|
27
|
+
i'm: i am
|
28
|
+
i've: i have
|
29
|
+
i'ven't: i have not
|
30
|
+
isn't: is not
|
31
|
+
it'd: it had
|
32
|
+
it'd've: it would have
|
33
|
+
it'll: it shall
|
34
|
+
it's: it has
|
35
|
+
it'sn't: it has not
|
36
|
+
let's: let us
|
37
|
+
ma'am: madam
|
38
|
+
mightn't: might not
|
39
|
+
mightn't've: might not have
|
40
|
+
might've: might have
|
41
|
+
mustn't: must not
|
42
|
+
must've: must have
|
43
|
+
needn't: need not
|
44
|
+
not've: not have
|
45
|
+
o'clock: of the clock
|
46
|
+
ol': old
|
47
|
+
oughtn't: ought not
|
48
|
+
shan't: shall not
|
49
|
+
she'd: she had
|
50
|
+
she'd've: she would have
|
51
|
+
she'll: she shall
|
52
|
+
she's: she has
|
53
|
+
she'sn't: she has not
|
54
|
+
should've: should have
|
55
|
+
shouldn't: should not
|
56
|
+
shouldn't've: should not have
|
57
|
+
somebody'd: somebody had
|
58
|
+
somebody'd've: somebody would have
|
59
|
+
somebody'dn't've: somebody would not have
|
60
|
+
somebody'll: somebody shall
|
61
|
+
somebody's: somebody has
|
62
|
+
someone'd: someone had
|
63
|
+
someone'd've: someone would have
|
64
|
+
someone'll: someone shall
|
65
|
+
someone's: someone has
|
66
|
+
something'd: something had
|
67
|
+
something'd've: something would have
|
68
|
+
something'll: something shall
|
69
|
+
something's: something has
|
70
|
+
"'sup": "what's up"
|
71
|
+
that'll: that will
|
72
|
+
that's: that has
|
73
|
+
there'd: there had
|
74
|
+
there'd've: there would have
|
75
|
+
there're: there are
|
76
|
+
there's: there has
|
77
|
+
they'd: they had
|
78
|
+
they'dn't: they would not
|
79
|
+
they'dn't've: they would not have
|
80
|
+
they'd've: they would have
|
81
|
+
they'd'ven't: they would have not
|
82
|
+
they'll: they shall
|
83
|
+
they'lln't've: they will not have
|
84
|
+
they'll'ven't: they will have not
|
85
|
+
they're: they are
|
86
|
+
they've: they have
|
87
|
+
they'ven't: they have not
|
88
|
+
"'tis": it is
|
89
|
+
"'twas": it was
|
90
|
+
wanna: want to
|
91
|
+
wasn't: was not
|
92
|
+
we'd: we had
|
93
|
+
we'd've: we would have
|
94
|
+
we'dn't've: we would not have
|
95
|
+
we'll: we will
|
96
|
+
we'lln't've: we will not have
|
97
|
+
we're: we are
|
98
|
+
we've: we have
|
99
|
+
weren't: were not
|
100
|
+
what'll: what shall
|
101
|
+
what're: what are
|
102
|
+
what's: what has
|
103
|
+
what've: what have
|
104
|
+
when's: when has
|
105
|
+
where'd: where did
|
106
|
+
where's: where has
|
107
|
+
where've: where have
|
108
|
+
who'd: who would
|
109
|
+
who'd've: who would have
|
110
|
+
who'll: who shall
|
111
|
+
who're: who are
|
112
|
+
who's: who has
|
113
|
+
who've: who have
|
114
|
+
why'll: why will
|
115
|
+
why're: why are
|
116
|
+
why's: why has
|
117
|
+
won't: will not
|
118
|
+
won't've: will not have
|
119
|
+
would've: would have
|
120
|
+
wouldn't: would not
|
121
|
+
wouldn't've: would not have
|
122
|
+
y'all: you all
|
123
|
+
y'all'd've: you all would have
|
124
|
+
y'all'dn't've: you all would not have
|
125
|
+
y'all'll: you all will
|
126
|
+
y'all'lln't: you all will not
|
127
|
+
y'all'll've: you all will have
|
128
|
+
y'all'll'ven't: you all will have not
|
129
|
+
you'd: you had
|
130
|
+
you'd've: you would have
|
131
|
+
you'll: you shall
|
132
|
+
you're: you are
|
133
|
+
you'ren't: you are not
|
134
|
+
you've: you have
|
135
|
+
you'ven't: you have not
|