Я бы рекомендовал использовать gensim.utils.tokenize()
вместо gensim.parsing.preprocessing.preprocess_string()
для вашего примера.
Во многих случаях tokenize()
делает очень хорошую работу, поскольку он будет возвращать только последовательности буквенных символов (без цифр). Это экономит вам дополнительные этапы очистки для пунктуации и т. Д.
Однако tokenize()
не включает в себя удаление стоп-слов, коротких токенов и стволов. В любом случае это должно быть сокращено, если вы имеете дело с другими языками, кроме английского.
Вот код для ваших (уже чистых) примеров документов, который дает вам нужные биграммы.
documents = ["the mayor of new york was there",
"machine learning can be useful sometimes",
"new york mayor was present"]
import gensim, pprint
# tokenize documents with gensim's tokenize() function
tokens = [list(gensim.utils.tokenize(doc, lower=True)) for doc in documents]
# build bigram model
bigram_mdl = gensim.models.phrases.Phrases(tokens, min_count=1, threshold=2)
# do more pre-processing on tokens (remove stopwords, stemming etc.)
# NOTE: this can be done better
from gensim.parsing.preprocessing import preprocess_string, remove_stopwords, stem_text
CUSTOM_FILTERS = [remove_stopwords, stem_text]
tokens = [preprocess_string(" ".join(doc), CUSTOM_FILTERS) for doc in tokens]
# apply bigram model on tokens
bigrams = bigram_mdl[tokens]
pprint.pprint(list(bigrams))
Выход:
[['mayor', 'new_york'],
['machin', 'learn', 'us'],
['new_york', 'mayor', 'present']]