为 gensim FastText 无监督模型准备大型 txt 文件
Preparing large txt file for gensim FastText unsupervised model
当我尝试在 Python 中使用 gensim 运行 FastText 时,我能得到的最好结果是给我最相似的结果,但每个结果都是一个字符。 (我在 windows 机器上,我听说这会影响结果。)
我的所有数据都存储在 一个 csv 文件中,我已经在其中对每个句子进行了标记,或者存储在我开始使用的原始 txt 文件中。当我尝试使用 csv 文件时,我得到的是单个字符结果。
这是我用来处理我的 csv 文件的代码(我正在分析体育文章如何以不同的方式讨论白人和非白人 NFL 四分卫,这是我的非白人结果 csv 文件的代码):
from gensim.models import FastText
from gensim.test.utils import get_tmpfile, datapath
import os
embedding_size = 200
window_size = 10
min_word = 5
down_sampling = 1e-2
if os.path.isfile(modelpath):
model1 = FastText.load(modelpath)
else:
class NWIter():
def __iter__(self):
path = datapath(csvpath)
with utils.open(path, 'r') as fin:
for line in fin:
yield line
model1 = FastText(vector_size=embedding_size, window=window_size, min_count=min_word,sample=down_sampling,workers=4)
model1.build_vocab(corpus_iterable=NWIter())
exs1=model1.corpus_count
model1.train(corpus_iterable=NWIter(), total_examples=exs1, epochs=50)
model1.save(modelpath)
清理后的 CSV 数据如下所示,每一行代表一个已清理的句子(删除停用词、标记化和词形还原)。
当这不起作用时,我尝试引入原始文本,但遇到了很多 UTF-8 编码错误和无法识别的字符。我试图解决这个问题,最后到了它试图读取原始文本文件的地步 - 只为了返回单个字符 returns。
因此,无论我使用 csv 文件还是 txt 文件,问题似乎仍然存在。所以我宁愿坚持使用 csv,因为我已经处理了信息;在没有 Python(或 gensim)将单个字符视为分析单位的情况下,我如何才能引入该数据?
编辑:
这是我 运行:
时得到的结果
print('NonWhite: ',model1.wv.most_similar('smart', topn=10))
非白:[('d', 0.36853086948394775), ('q', 0.326141357421875), ('s', 0.3181183338165283), ('M', 0.27458563446998596), ('g', 0.2703150510787964), ('o', 0.215525820851326), ('x', 0.2153075635433197), ('j', 0.21472081542015076), ('f', 0.201399995), ('f', 0.2013999[76635] =40=], 0.18369245529174805)]
Gensim FastText
模型(与 Word2Vec
系列中的其他模型一样)需要将每个单独的文本作为 list-of-string-tokens , 不是 纯字符串。
如果您将文本作为纯字符串传递,它们看起来像是单字符列表 – 因为 Python 处理字符串的方式。因此,模型看到的唯一 'words' 是单个字符——包括单个 spaces.
如果您的文件格式是每行已经是 space 分隔的文本,您只需将 yield
行更改为:
yield line.split()
如果它真的是一个 CSV,而你想要的训练文本只在 CSV 的一列中,你应该选择那个字段并将它正确地分解成一个字符串标记列表。
当我尝试在 Python 中使用 gensim 运行 FastText 时,我能得到的最好结果是给我最相似的结果,但每个结果都是一个字符。 (我在 windows 机器上,我听说这会影响结果。)
我的所有数据都存储在 一个 csv 文件中,我已经在其中对每个句子进行了标记,或者存储在我开始使用的原始 txt 文件中。当我尝试使用 csv 文件时,我得到的是单个字符结果。
这是我用来处理我的 csv 文件的代码(我正在分析体育文章如何以不同的方式讨论白人和非白人 NFL 四分卫,这是我的非白人结果 csv 文件的代码):
from gensim.models import FastText
from gensim.test.utils import get_tmpfile, datapath
import os
embedding_size = 200
window_size = 10
min_word = 5
down_sampling = 1e-2
if os.path.isfile(modelpath):
model1 = FastText.load(modelpath)
else:
class NWIter():
def __iter__(self):
path = datapath(csvpath)
with utils.open(path, 'r') as fin:
for line in fin:
yield line
model1 = FastText(vector_size=embedding_size, window=window_size, min_count=min_word,sample=down_sampling,workers=4)
model1.build_vocab(corpus_iterable=NWIter())
exs1=model1.corpus_count
model1.train(corpus_iterable=NWIter(), total_examples=exs1, epochs=50)
model1.save(modelpath)
清理后的 CSV 数据如下所示,每一行代表一个已清理的句子(删除停用词、标记化和词形还原)。
当这不起作用时,我尝试引入原始文本,但遇到了很多 UTF-8 编码错误和无法识别的字符。我试图解决这个问题,最后到了它试图读取原始文本文件的地步 - 只为了返回单个字符 returns。
因此,无论我使用 csv 文件还是 txt 文件,问题似乎仍然存在。所以我宁愿坚持使用 csv,因为我已经处理了信息;在没有 Python(或 gensim)将单个字符视为分析单位的情况下,我如何才能引入该数据?
编辑: 这是我 运行:
时得到的结果print('NonWhite: ',model1.wv.most_similar('smart', topn=10))
非白:[('d', 0.36853086948394775), ('q', 0.326141357421875), ('s', 0.3181183338165283), ('M', 0.27458563446998596), ('g', 0.2703150510787964), ('o', 0.215525820851326), ('x', 0.2153075635433197), ('j', 0.21472081542015076), ('f', 0.201399995), ('f', 0.2013999[76635] =40=], 0.18369245529174805)]
Gensim FastText
模型(与 Word2Vec
系列中的其他模型一样)需要将每个单独的文本作为 list-of-string-tokens , 不是 纯字符串。
如果您将文本作为纯字符串传递,它们看起来像是单字符列表 – 因为 Python 处理字符串的方式。因此,模型看到的唯一 'words' 是单个字符——包括单个 spaces.
如果您的文件格式是每行已经是 space 分隔的文本,您只需将 yield
行更改为:
yield line.split()
如果它真的是一个 CSV,而你想要的训练文本只在 CSV 的一列中,你应该选择那个字段并将它正确地分解成一个字符串标记列表。