From 94a20e97f5f1c530d99df984800d819c002b24ca Mon Sep 17 00:00:00 2001 From: Michael Penkov Date: Sun, 16 Dec 2018 20:19:40 +0900 Subject: [PATCH 1/4] WIP --- gensim/models/fasttext.py | 84 ++++++++++++++++++++++++++---------- regression-test/test_2160.py | 32 ++++++++++++++ regression-test/toy-data.txt | 1 + 3 files changed, 94 insertions(+), 23 deletions(-) create mode 100644 regression-test/test_2160.py create mode 100644 regression-test/toy-data.txt diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 17b314fec9..05d0421418 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -863,33 +863,31 @@ def _load_vectors(self, file_handle): Open file handle to persisted vectors. """ - if self.new_format: - self.struct_unpack(file_handle, '@?') # bool quant_input in fasttext.cc - num_vectors, dim = self.struct_unpack(file_handle, '@2q') - # Vectors stored by [Matrix::save](https://github.com/facebookresearch/fastText/blob/master/src/matrix.cc) - assert self.wv.vector_size == dim, ( - 'mismatch between vector size in model params ({}) and model vectors ({})' - .format(self.wv.vector_size, dim) + self.wv.vectors_ngrams = _load_matrix( + file_handle, + new_format=self.new_format, + expected_vector_size=self.wv.vector_size ) - float_size = struct.calcsize('@f') - if float_size == 4: - dtype = np.dtype(np.float32) - elif float_size == 8: - dtype = np.dtype(np.float64) - - self.num_original_vectors = num_vectors - self.wv.vectors_ngrams = np.fromfile(file_handle, dtype=dtype, count=num_vectors * dim) - self.wv.vectors_ngrams = self.wv.vectors_ngrams.reshape((num_vectors, dim)) - assert self.wv.vectors_ngrams.shape == ( - self.trainables.bucket + len(self.wv.vocab), self.wv.vector_size), \ - 'mismatch between actual weight matrix shape {} and expected shape {}'\ - .format( - self.wv.vectors_ngrams.shape, (self.trainables.bucket + len(self.wv.vocab), self.wv.vector_size) + self.num_original_vectors = self.wv.vectors_ngrams.shape[0] + + expected_shape = (self.trainables.bucket + len(self.wv.vocab), self.wv.vector_size) + assert self.wv.vectors_ngrams.shape == expected_shape, \ + 'mismatch between actual weight matrix shape {} and expected shape {}'.format( + self.wv.vectors_ngrams.shape, expected_shape ) self.trainables.init_ngrams_post_load(self.file_name, self.wv) self._clear_post_train() + # + # FIXME: not sure what to do with this yet, but we will need it. + # + hidden_output = _load_matrix( + file_handle, + new_format=self.new_format, + expected_vector_size=self.wv.vector_size + ) + def struct_unpack(self, file_handle, fmt): """Read a single object from an open file. @@ -906,8 +904,7 @@ def struct_unpack(self, file_handle, fmt): Unpacked structure. """ - num_bytes = struct.calcsize(fmt) - return struct.unpack(fmt, file_handle.read(num_bytes)) + return _struct_unpack(file_handle, fmt) def save(self, *args, **kwargs): """Save the Fasttext model. This saved model can be loaded again using @@ -967,6 +964,47 @@ def accuracy(self, questions, restrict_vocab=30000, most_similar=None, case_inse return self.wv.accuracy(questions, restrict_vocab, most_similar, case_insensitive) +def _struct_unpack(file_handle, fmt): + num_bytes = struct.calcsize(fmt) + return struct.unpack(fmt, file_handle.read(num_bytes)) + + +def _load_matrix(file_handle, new_format=True, expected_vector_size=None): + """Load a matrix from fastText native format. + + Interprets the matrix dimensions and type from the file stream. + See the `Matrix::save `__ + function for more info. + + :param file file_handle: A file handle opened for reading. + :param boolean new_format: True if the quant_input variable precedes + the matrix declaration. Should be True for newer versions of fastText. + :param int expected_vector_size: The expected dimensionality of each vector. + If you specify this and the matrix's dimensionality is different, + will raise an assertion. + :returns: The vectors + :rtype: numpy.array + """ + if new_format: + _struct_unpack(file_handle, '@?') # bool quant_input in fasttext.cc + + num_vectors, dim = _struct_unpack(file_handle, '@2q') + assert expected_vector_size is None or expected_vector_size == dim, ( + 'mismatch between vector size in model params ({}) and model vectors ({})' + .format(expected_vector_size, dim) + ) + + float_size = struct.calcsize('@f') + if float_size == 4: + dtype = np.dtype(np.float32) + elif float_size == 8: + dtype = np.dtype(np.float64) + + matrix = np.fromfile(file_handle, dtype=dtype, count=num_vectors * dim) + matrix = matrix.reshape((num_vectors, dim)) + return matrix + + class FastTextVocab(Word2VecVocab): """Vocabulary used by :class:`~gensim.models.fasttext.FastText`.""" def __init__(self, max_vocab_size=None, min_count=5, sample=1e-3, sorted_vocab=True, null_word=0, ns_exponent=0.75): diff --git a/regression-test/test_2160.py b/regression-test/test_2160.py new file mode 100644 index 0000000000..793c365a81 --- /dev/null +++ b/regression-test/test_2160.py @@ -0,0 +1,32 @@ +# +# Regression test for continue training on native data +# +# https://github.com/RaRe-Technologies/gensim/issues/2160 +# +import os.path as P +from gensim.models import FastText +from gensim.test.utils import common_texts + +curr_dir = P.dirname(P.abspath(__file__)) + + +def train_gensim(): + path = P.join(curr_dir, 'toy-data.txt') + with open(path) as fin: + words = fin.read().strip().split(' ') + + model = FastText() + model.build_vocab(words) + model.train(words, total_examples=len(words), epochs=model.epochs) + return model + + +def load_native(): + path = P.join(curr_dir, 'toy-model.bin') + model = FastText.load_fasttext_format(path) + # model.build_vocab(common_texts, update=True) # this doesn't work, but should. See also https://github.com/RaRe-Technologies/gensim/issues/2139 + return model + + +trained = train_gensim() +native = load_native() diff --git a/regression-test/toy-data.txt b/regression-test/toy-data.txt new file mode 100644 index 0000000000..58ac340bec --- /dev/null +++ b/regression-test/toy-data.txt @@ -0,0 +1 @@ + anarchism originated as a term of abuse first used against early working class radicals including the diggers of the english revolution and the sans culottes of the french revolution whilst the term is still used in a pejorative way to describe any act that used violent means to destroy the organization of society it has also been taken up as a positive label by self defined anarchists the word anarchism is derived from the greek without archons ruler chief king anarchism as a political philosophy is the belief that rulers are unnecessary and should be abolished although there are differing interpretations of what this means anarchism also refers to related social movements that advocate the elimination of authoritarian institutions particularly the state the word anarchy as most anarchists use it does not imply chaos nihilism or anomie but rather a harmonious anti authoritarian society in place of what are regarded as authoritarian political structures and coercive economic institutions anarchists advocate social relations based upon voluntary association of autonomous individuals mutual aid and self governance while anarchism is most easily defined by what it is against anarchists also offer positive visions of what they believe to be a truly free society however ideas about how an anarchist society might work vary considerably especially with respect to economics there is also disagreement about how a free society might be brought about origins and predecessors kropotkin and others argue that before recorded history human society was organized on anarchist principles most anthropologists follow kropotkin and engels in believing that hunter gatherer bands were egalitarian and lacked division of labour accumulated wealth or decreed law and had equal access to resources william godwin anarchists including the the anarchy organisation and rothbard find anarchist attitudes in taoism from ancient china kropotkin found similar ideas in stoic zeno of citium according to kropotkin zeno repudiated the omnipotence of the state its intervention and regimentation and proclaimed the sovereignty of the moral law of the individual the anabaptists of one six th century europe are sometimes considered to be religious forerunners of modern anarchism bertrand russell in his history of western philosophy writes that the anabaptists repudiated all law since they held that the good man will be guided at every moment by the holy spirit from this premise they arrive at communism the diggers or true levellers were an early communistic movement during the time of the english civil war and are considered by some as forerunners of modern anarchism in the modern era the first to use the term to mean something other than chaos was louis armand baron de lahontan in his nouveaux voyages dans l am rique septentrionale one seven zero three where he described the indigenous american society which had no state laws prisons priests or private property as being in anarchy russell means a libertarian and leader in the american indian movement has repeatedly stated that he is an anarchist and so are all his ancestors in one seven nine three in the thick of the french revolution william godwin published an enquiry concerning political justice although godwin did not use the word anarchism many later anarchists have regarded this book as the first major anarchist text and godwin as the founder of philosophical anarchism but at this point no anarchist movement yet existed and the term anarchiste was known mainly as an insult hurled by the bourgeois girondins at more radical elements in the french revolution the first self labelled anarchist pierre joseph proudhon it is commonly held that it wasn t until pierre joseph proudhon published what is property in one eight four zero that the term anarchist was adopted as a self description it is for this reason that some claim proudhon as the founder of modern anarchist theory in what is property proudhon answers with the famous accusation property is theft in this work he opposed the institution of decreed property p \ No newline at end of file From fb2b5b00390f81e63716232368a4ca9601b59a55 Mon Sep 17 00:00:00 2001 From: Michael Penkov Date: Sun, 16 Dec 2018 21:07:11 +0900 Subject: [PATCH 2/4] Handle incompatible float size condition --- gensim/models/fasttext.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 05d0421418..947a089f96 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -999,6 +999,8 @@ def _load_matrix(file_handle, new_format=True, expected_vector_size=None): dtype = np.dtype(np.float32) elif float_size == 8: dtype = np.dtype(np.float64) + else: + raise ValueError("Incompatible float size: %r" % float_size) matrix = np.fromfile(file_handle, dtype=dtype, count=num_vectors * dim) matrix = matrix.reshape((num_vectors, dim)) From 1a41182115f470e1b9f408b523317a4e8d0b2987 Mon Sep 17 00:00:00 2001 From: Michael Penkov Date: Sun, 16 Dec 2018 21:22:29 +0900 Subject: [PATCH 3/4] update docstring --- gensim/models/fasttext.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 947a089f96..0af303222c 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -973,17 +973,30 @@ def _load_matrix(file_handle, new_format=True, expected_vector_size=None): """Load a matrix from fastText native format. Interprets the matrix dimensions and type from the file stream. - See the `Matrix::save `__ - function for more info. - :param file file_handle: A file handle opened for reading. - :param boolean new_format: True if the quant_input variable precedes + Parameters + ---------- + file_handle : file + A file handle opened for reading. + new_format : boolean + True if the quant_input variable precedes the matrix declaration. Should be True for newer versions of fastText. - :param int expected_vector_size: The expected dimensionality of each vector. + expected_vector_size : int + The expected dimensionality of each vector. If you specify this and the matrix's dimensionality is different, will raise an assertion. - :returns: The vectors - :rtype: numpy.array + + Returns + ------- + :class:`numpy.array` + The vectors as an array. + Each vector will be a row in the array. + The number of columns of the array will correspond to the vector size. + + See Also + -------- + https://github.com/facebookresearch/fastText/blob/master/src/matrix.cc + """ if new_format: _struct_unpack(file_handle, '@?') # bool quant_input in fasttext.cc From cd0b318a8e2c1c5e1ccac9f8773b602cf37fbc69 Mon Sep 17 00:00:00 2001 From: Michael Penkov Date: Sun, 16 Dec 2018 21:22:53 +0900 Subject: [PATCH 4/4] move regression test to unit tests --- .../test/test_data}/toy-data.txt | 0 gensim/test/test_data/toy-model.bin | Bin 0 -> 58033 bytes gensim/test/test_data/toy-model.vec | 23 +++++++++++++ gensim/test/test_fasttext.py | 27 +++++++++++++++ regression-test/test_2160.py | 32 ------------------ 5 files changed, 50 insertions(+), 32 deletions(-) rename {regression-test => gensim/test/test_data}/toy-data.txt (100%) create mode 100644 gensim/test/test_data/toy-model.bin create mode 100644 gensim/test/test_data/toy-model.vec delete mode 100644 regression-test/test_2160.py diff --git a/regression-test/toy-data.txt b/gensim/test/test_data/toy-data.txt similarity index 100% rename from regression-test/toy-data.txt rename to gensim/test/test_data/toy-data.txt diff --git a/gensim/test/test_data/toy-model.bin b/gensim/test/test_data/toy-model.bin new file mode 100644 index 0000000000000000000000000000000000000000..7e1b9819ccae3c8f32fdb8fa55602d11d4366995 GIT binary patch literal 58033 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

Gdqx_vk_W};!NFu))A59SMM-GeA$gVu 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%0D^&e; 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 nL#K-ip?8%`JfVu1=@kwS&AHeQNMO&5P=! literal 0 HcmV?d00001 diff --git a/gensim/test/test_data/toy-model.vec b/gensim/test/test_data/toy-model.vec new file mode 100644 index 0000000000..ae8b0c36d2 --- /dev/null +++ b/gensim/test/test_data/toy-model.vec @@ -0,0 +1,23 @@ +22 100 +the 0.11795 0.091151 0.080958 -0.10915 0.10121 0.059092 -0.19102 0.0015307 0.00040477 -0.01392 -0.11906 0.11998 0.097833 0.21086 -0.2983 -0.041993 0.16582 0.14808 0.014526 -0.073218 -0.2483 0.17985 0.069347 -0.18418 -0.10304 0.032945 0.061671 0.025272 -0.024186 0.25927 -0.076794 0.086819 -0.072027 0.13621 -0.19238 0.0098201 0.23451 -0.16532 -0.07339 0.24675 -0.34921 -0.12771 0.20714 -0.0076824 0.15132 -0.11738 0.20811 0.052524 -0.14623 0.086644 -0.10438 0.052601 -0.20899 0.25047 -0.078331 0.0093942 -0.14422 0.21313 0.34173 0.22315 0.2586 -0.042675 0.15711 -0.099053 0.16983 0.025244 -0.010969 0.024829 0.079661 -0.19744 -0.05247 -0.15115 -0.085485 0.13294 -0.17589 0.19305 0.14563 -0.17344 0.12943 -0.18564 -0.01404 0.089734 0.010085 0.015518 -0.14798 0.13217 0.12804 0.10621 -0.096836 0.11842 0.1877 -0.15098 0.19061 -0.13194 0.1031 -0.042321 -0.049258 0.068264 -0.011555 -0.16212 +of 0.075341 0.054132 0.04908 -0.066084 0.066624 0.03997 -0.11775 -0.00088257 0.0022383 -0.0058991 -0.072435 0.071198 0.060748 0.13084 -0.17766 -0.027242 0.10128 0.088913 0.0039799 -0.044991 -0.15075 0.10956 0.045696 -0.11017 -0.062894 0.021787 0.035527 0.013677 -0.016963 0.15635 -0.045489 0.048502 -0.039035 0.087011 -0.12036 0.0082743 0.1397 -0.098176 -0.043923 0.1494 -0.21217 -0.078576 0.12672 -0.0051724 0.095007 -0.079881 0.12076 0.031968 -0.094125 0.052373 -0.060026 0.02521 -0.12034 0.15228 -0.047011 0.0099649 -0.086932 0.12178 0.20693 0.13663 0.16214 -0.029398 0.094377 -0.055589 0.10338 0.014219 -0.0078267 0.013238 0.049496 -0.12249 -0.03178 -0.087354 -0.050306 0.079035 -0.10948 0.11508 0.086727 -0.10528 0.081607 -0.11165 -0.0086579 0.05274 0.004607 0.0046594 -0.089009 0.081926 0.073143 0.061131 -0.063266 0.073349 0.11457 -0.092375 0.11466 -0.078164 0.063544 -0.029748 -0.034002 0.037661 -0.0056996 -0.097617 +and 0.078116 0.058386 0.056487 -0.073178 0.06466 0.039211 -0.12921 -0.00027854 0.0017653 -0.0098805 -0.078851 0.08261 0.068225 0.13977 -0.19904 -0.025525 0.11046 0.091646 0.0085715 -0.044192 -0.16139 0.12208 0.046163 -0.12184 -0.072914 0.024582 0.042762 0.014857 -0.019237 0.17274 -0.049233 0.05741 -0.048577 0.091194 -0.12728 0.0049974 0.1497 -0.10869 -0.04381 0.16727 -0.23535 -0.085609 0.13803 -0.0064574 0.10195 -0.08397 0.1413 0.037087 -0.098394 0.056629 -0.071971 0.031923 -0.13707 0.16878 -0.055636 0.0091506 -0.09773 0.1368 0.22309 0.1454 0.17429 -0.028414 0.10478 -0.062397 0.11258 0.018857 -0.0011591 0.01609 0.056028 -0.13144 -0.029054 -0.096054 -0.055333 0.086362 -0.11603 0.12827 0.097475 -0.11951 0.08885 -0.12542 -0.0038661 0.060459 0.0083025 0.0078055 -0.095529 0.088615 0.086224 0.07226 -0.067246 0.083083 0.1213 -0.10299 0.12617 -0.085734 0.067823 -0.0262 -0.036135 0.048 -0.0042103 -0.10378 +in 0.086669 0.062243 0.054412 -0.073767 0.072139 0.045317 -0.13439 -0.0017746 0.00044335 -0.0096974 -0.081614 0.088114 0.064446 0.14734 -0.20843 -0.030205 0.1085 0.09816 0.013112 -0.045302 -0.16667 0.12973 0.044584 -0.12834 -0.075227 0.026261 0.047247 0.017202 -0.019537 0.17814 -0.052551 0.063582 -0.049734 0.094952 -0.13492 0.0084108 0.16095 -0.11406 -0.051615 0.17439 -0.24113 -0.090479 0.14399 -0.0049879 0.10208 -0.088252 0.14673 0.031961 -0.10017 0.061869 -0.072798 0.034444 -0.14254 0.16777 -0.055828 0.0024859 -0.10045 0.14659 0.23189 0.1546 0.18216 -0.028544 0.10698 -0.070123 0.1166 0.019915 -0.0066732 0.012435 0.058525 -0.13743 -0.032705 -0.099382 -0.053766 0.097017 -0.12322 0.13095 0.1048 -0.11822 0.094615 -0.13153 -0.0062404 0.063022 0.01086 0.013804 -0.096976 0.094258 0.088442 0.069077 -0.067368 0.077237 0.12443 -0.10925 0.13229 -0.090949 0.069971 -0.031434 -0.036609 0.044712 -0.0081178 -0.11471 +as 0.053863 0.042938 0.037241 -0.051183 0.05137 0.027114 -0.084835 1.3728e-05 0.0025314 -0.0069993 -0.050604 0.054771 0.047013 0.10033 -0.13325 -0.023278 0.080855 0.067213 0.0032944 -0.028117 -0.11216 0.081096 0.029206 -0.08644 -0.044203 0.017712 0.031886 0.0091182 -0.0085869 0.12154 -0.032878 0.039264 -0.039498 0.062988 -0.087045 0.0049847 0.10196 -0.075371 -0.028413 0.11865 -0.16172 -0.059862 0.097285 -0.0047555 0.066067 -0.059969 0.095558 0.02544 -0.073157 0.037012 -0.046715 0.024077 -0.089977 0.11319 -0.027823 0.0066428 -0.064607 0.097043 0.15502 0.10629 0.12505 -0.019258 0.070654 -0.044533 0.080667 0.012301 -0.0022248 0.0092332 0.037268 -0.091938 -0.026553 -0.065549 -0.037304 0.064934 -0.077455 0.092462 0.063586 -0.083913 0.059991 -0.087713 -0.0092362 0.043102 -0.00051714 0.0099011 -0.069276 0.056812 0.057576 0.045192 -0.044366 0.059025 0.090698 -0.071062 0.0937 -0.056276 0.046899 -0.016259 -0.022376 0.024875 -0.0067809 -0.073339 +is 0.074437 0.052038 0.051981 -0.067465 0.058618 0.03526 -0.11765 -0.0015289 -0.00015959 -0.0067318 -0.06577 0.076415 0.05829 0.12698 -0.17727 -0.028005 0.096446 0.088592 0.0046257 -0.044585 -0.14641 0.10238 0.038044 -0.10902 -0.060715 0.026365 0.036137 0.0072479 -0.016273 0.15289 -0.051616 0.053147 -0.045661 0.081826 -0.1067 0.0069735 0.13494 -0.10346 -0.048327 0.1467 -0.21133 -0.072159 0.12128 -0.0092351 0.088376 -0.072045 0.11589 0.032887 -0.087238 0.048044 -0.062112 0.031598 -0.12588 0.14592 -0.044971 0.011856 -0.085911 0.1297 0.20461 0.13551 0.14988 -0.029959 0.096274 -0.057667 0.10345 0.014265 -0.0039144 0.010562 0.047673 -0.11893 -0.029959 -0.088578 -0.048333 0.07779 -0.098661 0.11295 0.087307 -0.10624 0.076406 -0.10848 -0.0086265 0.059426 0.0076717 0.010637 -0.08249 0.078295 0.074592 0.05979 -0.055786 0.070062 0.11317 -0.088385 0.11068 -0.075256 0.062661 -0.026641 -0.028308 0.040725 -0.0044682 -0.093382 +that 0.066945 0.047453 0.045943 -0.057811 0.056633 0.031702 -0.10249 0.00024042 0.00079663 -0.0053683 -0.06074 0.065167 0.053823 0.11286 -0.15837 -0.021426 0.089578 0.080272 0.0075319 -0.039696 -0.13106 0.095934 0.036305 -0.096738 -0.057495 0.020537 0.033466 0.010245 -0.014078 0.13905 -0.042811 0.043999 -0.037507 0.078488 -0.1016 0.0056259 0.126 -0.088707 -0.039625 0.13276 -0.1881 -0.0689 0.11293 -0.0058395 0.077197 -0.069944 0.11004 0.029272 -0.078062 0.048065 -0.057099 0.025667 -0.10919 0.13677 -0.039712 0.0037627 -0.077784 0.10986 0.18405 0.11977 0.14268 -0.023658 0.083445 -0.051322 0.093099 0.013567 -0.0049253 0.015867 0.043399 -0.10602 -0.031198 -0.080191 -0.045041 0.072237 -0.095975 0.10266 0.078967 -0.0928 0.071374 -0.099167 -0.0068718 0.049467 0.0041039 0.0062738 -0.075501 0.070375 0.068726 0.058608 -0.054298 0.062562 0.10179 -0.084575 0.10511 -0.067477 0.052601 -0.026853 -0.029131 0.035389 -0.003624 -0.087392 +to 0.060323 0.046111 0.04158 -0.054313 0.057129 0.031363 -0.10041 -0.0033526 -0.0013111 -0.0098172 -0.060896 0.063161 0.05388 0.11195 -0.15321 -0.023402 0.086457 0.078618 0.0053244 -0.037212 -0.13181 0.094091 0.030763 -0.099566 -0.052809 0.015859 0.02956 0.015379 -0.012047 0.13619 -0.042537 0.043199 -0.034664 0.070228 -0.10471 0.0062273 0.12568 -0.087126 -0.035855 0.13071 -0.18209 -0.06096 0.10849 -0.00080616 0.079045 -0.064025 0.11502 0.02744 -0.073819 0.042107 -0.052047 0.024716 -0.10574 0.13205 -0.038193 0.0090317 -0.079089 0.1114 0.18122 0.11757 0.13478 -0.025544 0.083736 -0.051223 0.083238 0.0075664 -0.0044848 0.0086053 0.039882 -0.10386 -0.033724 -0.07977 -0.047524 0.07071 -0.085147 0.10484 0.073396 -0.090302 0.067185 -0.094732 -0.0072977 0.046248 0.0040743 0.0088815 -0.075282 0.068908 0.063497 0.053804 -0.049192 0.063104 0.098934 -0.081646 0.094111 -0.06628 0.05024 -0.022262 -0.031661 0.030206 -0.0022784 -0.084192 +a 0.046421 0.032798 0.039108 -0.038349 0.037766 0.020456 -0.071248 0.0028358 0.00072006 -0.0046159 -0.046781 0.041606 0.033866 0.08403 -0.11053 -0.015627 0.064717 0.06068 0.0048067 -0.023191 -0.095918 0.069243 0.021502 -0.071381 -0.037481 0.013889 0.031352 0.0073825 -0.0086553 0.095833 -0.02385 0.036393 -0.018642 0.050919 -0.071323 0.0091854 0.092882 -0.053973 -0.029557 0.098961 -0.13712 -0.051353 0.075869 0.0015759 0.062333 -0.049722 0.082184 0.019664 -0.058983 0.032148 -0.034979 0.025808 -0.076615 0.099721 -0.030648 0.0031889 -0.055634 0.076594 0.12679 0.086509 0.09253 -0.015524 0.057569 -0.027175 0.06334 0.00085049 0.0069896 0.0061507 0.030771 -0.073703 -0.015627 -0.060113 -0.033121 0.049414 -0.057852 0.072202 0.048984 -0.065439 0.051354 -0.06322 -0.0072296 0.033864 0.00047817 0.0024526 -0.053388 0.051924 0.054311 0.036886 -0.035877 0.040401 0.065778 -0.062867 0.07423 -0.048171 0.037957 -0.015353 -0.01992 0.029231 0.003175 -0.066286 +anarchist 0.10499 0.077077 0.073893 -0.094911 0.09087 0.051778 -0.16896 0.0028592 0.0018984 -0.014372 -0.10235 0.10641 0.083541 0.18568 -0.26289 -0.038413 0.14436 0.12947 0.0094352 -0.061216 -0.21769 0.15579 0.058523 -0.1614 -0.091191 0.032544 0.05609 0.018824 -0.019396 0.22724 -0.067484 0.07504 -0.062237 0.12111 -0.16807 0.0095553 0.20286 -0.14557 -0.064549 0.21793 -0.30632 -0.11071 0.17923 -0.0078681 0.13163 -0.10733 0.18314 0.045805 -0.12732 0.074925 -0.090335 0.043671 -0.18138 0.2206 -0.069132 0.0083824 -0.12894 0.18778 0.29605 0.19819 0.23036 -0.037809 0.13658 -0.083081 0.14884 0.02168 -0.0047173 0.020297 0.071285 -0.17489 -0.04414 -0.13011 -0.074402 0.11847 -0.15176 0.17136 0.1275 -0.15072 0.11277 -0.15911 -0.011503 0.077796 0.0082271 0.013163 -0.12605 0.11575 0.11296 0.089694 -0.087017 0.10286 0.16346 -0.13179 0.17034 -0.11426 0.088749 -0.038251 -0.0476 0.05731 -0.0060445 -0.14348 +anarchism 0.1065 0.077815 0.074661 -0.095396 0.09131 0.051896 -0.17089 0.0018371 0.001516 -0.014661 -0.10193 0.10936 0.084016 0.18756 -0.26431 -0.038648 0.14599 0.1291 0.010227 -0.062496 -0.21948 0.15779 0.057932 -0.16489 -0.092619 0.032062 0.057309 0.017896 -0.021118 0.23073 -0.068301 0.076624 -0.063088 0.12222 -0.16967 0.0083748 0.20363 -0.14697 -0.06487 0.22062 -0.30957 -0.11246 0.18228 -0.0092674 0.1329 -0.10833 0.18368 0.0464 -0.12981 0.074328 -0.091311 0.044441 -0.18397 0.22308 -0.069787 0.0083563 -0.12956 0.18834 0.29892 0.19974 0.23287 -0.039338 0.13794 -0.083537 0.14934 0.022374 -0.0035459 0.019157 0.072989 -0.17655 -0.043628 -0.12885 -0.072803 0.11882 -0.15278 0.17173 0.12802 -0.15251 0.11472 -0.16139 -0.012639 0.078508 0.0075528 0.014397 -0.12621 0.1172 0.11454 0.089934 -0.0884 0.10366 0.16345 -0.13331 0.17023 -0.11475 0.090429 -0.038623 -0.047434 0.058361 -0.0071884 -0.14274 +society 0.073428 0.049574 0.048737 -0.063202 0.060547 0.035932 -0.11166 -0.00075795 0.0021406 -0.011223 -0.068295 0.072499 0.058757 0.12445 -0.17294 -0.027342 0.0949 0.085678 0.0060218 -0.041508 -0.14568 0.10521 0.038354 -0.10717 -0.060493 0.019552 0.035317 0.011879 -0.014087 0.15305 -0.045015 0.051658 -0.040138 0.081434 -0.11234 0.0045097 0.13433 -0.096747 -0.044378 0.14493 -0.20467 -0.073434 0.11926 -0.0040236 0.08655 -0.074813 0.1196 0.031824 -0.088548 0.049545 -0.060813 0.028288 -0.12067 0.14751 -0.045687 0.0064171 -0.083153 0.12286 0.19947 0.13131 0.15433 -0.025985 0.092701 -0.056294 0.098473 0.017526 -0.0027713 0.013787 0.047603 -0.11686 -0.031067 -0.084049 -0.047809 0.080847 -0.098736 0.11137 0.082841 -0.10219 0.074808 -0.10622 -0.0048072 0.053736 0.0044521 0.0096848 -0.084189 0.076183 0.077013 0.059052 -0.057921 0.068045 0.10776 -0.091172 0.11547 -0.075015 0.058444 -0.025836 -0.031412 0.036946 -0.0047835 -0.094459 +what 0.052942 0.036601 0.034723 -0.045054 0.046588 0.027618 -0.084862 -0.00021578 0.0027216 -0.002828 -0.05113 0.054561 0.043064 0.094993 -0.12566 -0.021983 0.073049 0.059352 0.004345 -0.035023 -0.10988 0.078154 0.031004 -0.078389 -0.045783 0.014148 0.028414 0.010738 -0.011168 0.11501 -0.029424 0.035917 -0.028134 0.063023 -0.082968 0.0046163 0.10198 -0.072601 -0.031131 0.10537 -0.14973 -0.058623 0.089927 -0.0021857 0.064213 -0.054243 0.088589 0.022348 -0.062634 0.033833 -0.042919 0.017465 -0.089191 0.1089 -0.03287 0.0044129 -0.063903 0.089537 0.14356 0.09978 0.11865 -0.018592 0.066936 -0.040006 0.076997 0.010735 -0.0057157 0.0090062 0.032184 -0.087512 -0.020585 -0.060808 -0.036373 0.059244 -0.076032 0.084583 0.067458 -0.071997 0.057628 -0.080769 -0.00465 0.0411 0.003916 0.0093105 -0.060377 0.055077 0.052543 0.044956 -0.043094 0.051649 0.083144 -0.068213 0.084732 -0.054745 0.040053 -0.019524 -0.024444 0.025486 -0.002909 -0.072029 +are 0.044979 0.027886 0.031057 -0.039078 0.039544 0.020218 -0.06787 0.00088538 0.0025773 -0.0038006 -0.038958 0.046053 0.036366 0.07762 -0.11042 -0.016477 0.061344 0.053643 0.002494 -0.027408 -0.091474 0.066466 0.021019 -0.06673 -0.039331 0.013811 0.025774 0.0089593 -0.0090281 0.09847 -0.026295 0.031816 -0.029169 0.051287 -0.069851 0.0048476 0.083364 -0.061437 -0.026925 0.095641 -0.12418 -0.048026 0.078329 -0.0048473 0.055662 -0.046907 0.076542 0.019073 -0.053229 0.028687 -0.03836 0.018848 -0.079291 0.090561 -0.031473 0.00058625 -0.053301 0.076623 0.12418 0.083955 0.094803 -0.014172 0.059011 -0.032073 0.061886 0.0090609 -0.0032872 0.0086799 0.029804 -0.073295 -0.022582 -0.051794 -0.027344 0.047928 -0.061035 0.067855 0.04758 -0.062712 0.049954 -0.066819 -0.0008138 0.032022 0.00073033 0.0053074 -0.053486 0.048945 0.050202 0.036256 -0.037922 0.043493 0.063835 -0.053633 0.071947 -0.048897 0.040255 -0.012879 -0.020365 0.025443 -0.0037648 -0.058896 +anarchists 0.099522 0.072045 0.068926 -0.090451 0.085243 0.048677 -0.15981 0.0025417 0.0021009 -0.012668 -0.096492 0.10115 0.078704 0.17486 -0.24675 -0.037135 0.13695 0.12146 0.008434 -0.05683 -0.20527 0.14677 0.055201 -0.15272 -0.086044 0.030467 0.052698 0.01695 -0.018831 0.21493 -0.063893 0.070846 -0.058822 0.11392 -0.15843 0.0084885 0.19094 -0.13761 -0.060324 0.2046 -0.28878 -0.10414 0.16962 -0.0078024 0.12369 -0.10094 0.1712 0.043341 -0.11972 0.071347 -0.08591 0.041418 -0.17143 0.20788 -0.065511 0.0080243 -0.12186 0.17679 0.27873 0.1874 0.2168 -0.036588 0.12885 -0.079483 0.14046 0.019436 -0.0043168 0.019128 0.067365 -0.16554 -0.042365 -0.12127 -0.069515 0.11118 -0.14305 0.16136 0.121 -0.14168 0.10687 -0.1499 -0.010584 0.074033 0.0069971 0.012776 -0.11828 0.11014 0.10639 0.084542 -0.082786 0.097526 0.15445 -0.12288 0.16006 -0.10791 0.083605 -0.036212 -0.044529 0.053515 -0.0061845 -0.13367 +this 0.045778 0.039556 0.03217 -0.043746 0.040279 0.024639 -0.079102 -0.00030707 -0.00064378 -0.0026417 -0.045928 0.048443 0.037168 0.085918 -0.11813 -0.016392 0.063361 0.059686 0.0053919 -0.031646 -0.098872 0.067983 0.02767 -0.073213 -0.043511 0.015412 0.027337 0.008768 -0.0072309 0.10439 -0.03294 0.035632 -0.027657 0.051934 -0.074958 0.0055605 0.092829 -0.068748 -0.027734 0.095587 -0.13734 -0.048223 0.082726 -0.0006984 0.059528 -0.049323 0.081378 0.024843 -0.056656 0.032449 -0.043441 0.019917 -0.085481 0.095227 -0.030461 0.0050606 -0.058062 0.087191 0.1356 0.091672 0.10385 -0.01738 0.06151 -0.040628 0.069794 0.011668 -0.0017514 0.0081234 0.030857 -0.075968 -0.017533 -0.059355 -0.033059 0.054041 -0.068919 0.078617 0.057009 -0.067612 0.048645 -0.07553 -0.00692 0.038983 0.0058949 0.0042996 -0.054315 0.049537 0.053605 0.040284 -0.037143 0.043543 0.074433 -0.057207 0.075567 -0.051073 0.040178 -0.015749 -0.017475 0.026747 0.00035177 -0.061563 +it 0.065768 0.043959 0.039486 -0.063757 0.053133 0.030436 -0.10313 -0.0018257 0.0055686 -0.012154 -0.055456 0.071659 0.049232 0.11131 -0.16144 -0.025814 0.082027 0.078277 0.0056743 -0.035665 -0.12919 0.096767 0.041344 -0.096359 -0.054538 0.020959 0.039109 0.01278 -0.0094326 0.14238 -0.037533 0.045942 -0.037842 0.069764 -0.10194 0.001699 0.12093 -0.085403 -0.037515 0.13376 -0.18464 -0.066151 0.1092 -0.00063888 0.078896 -0.06391 0.11309 0.028978 -0.072086 0.051116 -0.056798 0.028741 -0.10932 0.13163 -0.048367 0.0060891 -0.077308 0.11071 0.17941 0.12014 0.14379 -0.022083 0.085774 -0.055319 0.087777 0.020903 0.0004861 0.010892 0.04564 -0.10823 -0.029483 -0.075261 -0.044079 0.073125 -0.09097 0.10067 0.076785 -0.091885 0.069818 -0.09805 -0.0071615 0.050955 0.002307 0.0071944 -0.074464 0.070171 0.064623 0.049089 -0.048317 0.064493 0.10176 -0.07941 0.10575 -0.069482 0.053976 -0.02536 -0.028804 0.034726 -0.0027013 -0.08897 +property 0.064511 0.04534 0.041742 -0.055481 0.055537 0.031541 -0.10368 0.00019278 0.00017956 -0.0094122 -0.060629 0.067435 0.050486 0.11217 -0.15864 -0.023389 0.08585 0.077658 0.007401 -0.038988 -0.13185 0.094372 0.034909 -0.097542 -0.058451 0.018337 0.034051 0.0108 -0.012071 0.13931 -0.039594 0.046297 -0.035697 0.072832 -0.10118 0.0057964 0.12278 -0.086455 -0.040127 0.13029 -0.18388 -0.066943 0.10733 -0.0026092 0.079796 -0.066461 0.11023 0.027668 -0.077621 0.045145 -0.056854 0.02615 -0.11147 0.13277 -0.040669 0.0034854 -0.077181 0.11241 0.18008 0.11954 0.13936 -0.025069 0.084938 -0.050766 0.08914 0.01525 -0.0015898 0.012432 0.042979 -0.10564 -0.027668 -0.077233 -0.042984 0.071083 -0.09237 0.10063 0.075554 -0.092005 0.068528 -0.09698 -0.0078593 0.048919 0.004507 0.0091544 -0.07546 0.067984 0.06756 0.054913 -0.051434 0.060753 0.09843 -0.083337 0.10414 -0.069871 0.052668 -0.024461 -0.026765 0.033484 -0.0043592 -0.083369 +be 0.079989 0.058416 0.048607 -0.072412 0.062466 0.036554 -0.12382 0.0023295 0.0032995 -0.0076173 -0.074069 0.076657 0.064539 0.1336 -0.18646 -0.021806 0.10013 0.094264 0.0083858 -0.042228 -0.15464 0.11358 0.046591 -0.11252 -0.063445 0.023922 0.040398 0.011449 -0.018156 0.16608 -0.051683 0.050034 -0.041786 0.089461 -0.12329 0.0069861 0.14889 -0.10932 -0.044203 0.16047 -0.22086 -0.081893 0.13407 -0.0061596 0.094363 -0.078614 0.12557 0.03316 -0.093883 0.055331 -0.064186 0.031457 -0.12979 0.15983 -0.049183 0.0098248 -0.093031 0.1375 0.21587 0.14373 0.16984 -0.032541 0.10103 -0.06017 0.1066 0.014696 -0.00071478 0.015812 0.051226 -0.12574 -0.034798 -0.093022 -0.052441 0.086865 -0.11334 0.12047 0.088413 -0.10588 0.083267 -0.11223 -0.0089499 0.056393 0.0068064 0.010615 -0.087858 0.090703 0.084124 0.06684 -0.060813 0.075828 0.123 -0.089453 0.12298 -0.087267 0.061913 -0.030957 -0.038693 0.036571 -0.0052479 -0.098058 +term 0.033615 0.023247 0.026867 -0.026717 0.030987 0.013976 -0.050264 -0.00094697 -0.0018201 -0.0034984 -0.030187 0.031742 0.028637 0.055053 -0.079087 -0.012198 0.043406 0.039886 0.0017805 -0.021358 -0.065835 0.048326 0.016053 -0.049297 -0.025541 0.0092873 0.017387 0.0044436 -0.0061342 0.068247 -0.020261 0.02238 -0.017378 0.040313 -0.051688 0.0039586 0.061393 -0.044528 -0.019722 0.065175 -0.092248 -0.033597 0.054701 -0.0025578 0.039695 -0.031013 0.05537 0.010289 -0.038278 0.022052 -0.028226 0.01365 -0.052969 0.066794 -0.021489 0.0029829 -0.037974 0.056953 0.092194 0.059626 0.069586 -0.013069 0.040775 -0.025132 0.043711 0.0068078 0.0041025 0.0063076 0.022226 -0.054097 -0.015653 -0.039792 -0.022528 0.037051 -0.046657 0.053246 0.035745 -0.04364 0.03748 -0.04913 -0.0026505 0.022082 -0.0001407 0.003254 -0.040581 0.033962 0.031392 0.02845 -0.026258 0.029892 0.049767 -0.042433 0.052026 -0.036117 0.0272 -0.01094 -0.012944 0.01903 -0.0030746 -0.042026 +an 0.12227 0.091419 0.087147 -0.11106 0.10615 0.065026 -0.20167 0.0034929 0.0054287 -0.018122 -0.12445 0.12647 0.10303 0.22294 -0.31601 -0.041159 0.17903 0.15344 0.015156 -0.072081 -0.26406 0.19153 0.073605 -0.19321 -0.11085 0.036275 0.063943 0.029965 -0.028504 0.26909 -0.078123 0.095528 -0.077139 0.14885 -0.20301 0.0094167 0.248 -0.17009 -0.074508 0.26627 -0.36845 -0.13894 0.21988 -0.0079346 0.16368 -0.12255 0.21815 0.059933 -0.15294 0.088891 -0.10997 0.053893 -0.22076 0.26567 -0.085267 0.007004 -0.15082 0.22064 0.35812 0.23683 0.26843 -0.048439 0.16709 -0.10178 0.17912 0.02169 -0.0071486 0.025373 0.086937 -0.20833 -0.055181 -0.15439 -0.089202 0.1416 -0.18333 0.20725 0.14963 -0.18555 0.13482 -0.19519 -0.01282 0.097157 0.010161 0.016978 -0.15359 0.14315 0.13549 0.11412 -0.10544 0.12296 0.19671 -0.15704 0.20211 -0.13389 0.10633 -0.041893 -0.057238 0.069755 -0.014764 -0.17252 +by 0.071151 0.051981 0.045753 -0.063299 0.062093 0.035953 -0.11538 0.00060194 -0.0025281 -0.010701 -0.066507 0.07565 0.055446 0.12051 -0.176 -0.02351 0.097648 0.084868 0.0076767 -0.041328 -0.13606 0.099846 0.035072 -0.10929 -0.056532 0.017203 0.041654 0.011639 -0.0098535 0.15117 -0.039857 0.054444 -0.03698 0.080044 -0.10618 0.0042917 0.13292 -0.093517 -0.040544 0.14206 -0.19758 -0.068867 0.11885 -0.0052796 0.087411 -0.074258 0.12072 0.029028 -0.080058 0.045182 -0.056723 0.030487 -0.12049 0.14077 -0.043298 0.0063719 -0.08324 0.11883 0.19432 0.13002 0.14989 -0.026347 0.093855 -0.051438 0.097086 0.012293 -0.0010578 0.010561 0.052007 -0.1124 -0.028146 -0.083542 -0.047969 0.079448 -0.10448 0.11123 0.080287 -0.097965 0.073639 -0.1023 -0.0063079 0.048546 0.010219 0.011558 -0.085891 0.081609 0.074085 0.061063 -0.05941 0.068312 0.10832 -0.093626 0.10603 -0.080541 0.061834 -0.027813 -0.027721 0.03506 -0.00020315 -0.094649 diff --git a/gensim/test/test_fasttext.py b/gensim/test/test_fasttext.py index c9935431e4..24cd60410f 100644 --- a/gensim/test/test_fasttext.py +++ b/gensim/test/test_fasttext.py @@ -842,6 +842,33 @@ def test_sg_hs_against_wrapper(self): self.compare_with_wrapper(model_gensim, model_wrapper) +class NativeTrainingContinuationTest(unittest.TestCase): + def test(self): + + def train_gensim(): + path = datapath('toy-data.txt') + with open(path) as fin: + words = fin.read().strip().split(' ') + + model = FT_gensim() + model.build_vocab(words) + model.train(words, total_examples=len(words), epochs=model.epochs) + return model + + def load_native(): + path = datapath('toy-model.bin') + model = FT_gensim.load_fasttext_format(path) + # model.build_vocab(common_texts, update=True) # this doesn't work, but should. See also https://github.com/RaRe-Technologies/gensim/issues/2139 + return model + + trained = train_gensim() + native = load_native() + + # + # For now, having this test not crash is good enough. + # + + if __name__ == '__main__': logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) unittest.main() diff --git a/regression-test/test_2160.py b/regression-test/test_2160.py deleted file mode 100644 index 793c365a81..0000000000 --- a/regression-test/test_2160.py +++ /dev/null @@ -1,32 +0,0 @@ -# -# Regression test for continue training on native data -# -# https://github.com/RaRe-Technologies/gensim/issues/2160 -# -import os.path as P -from gensim.models import FastText -from gensim.test.utils import common_texts - -curr_dir = P.dirname(P.abspath(__file__)) - - -def train_gensim(): - path = P.join(curr_dir, 'toy-data.txt') - with open(path) as fin: - words = fin.read().strip().split(' ') - - model = FastText() - model.build_vocab(words) - model.train(words, total_examples=len(words), epochs=model.epochs) - return model - - -def load_native(): - path = P.join(curr_dir, 'toy-model.bin') - model = FastText.load_fasttext_format(path) - # model.build_vocab(common_texts, update=True) # this doesn't work, but should. See also https://github.com/RaRe-Technologies/gensim/issues/2139 - return model - - -trained = train_gensim() -native = load_native()