聚类相似的单词,然后将聚类映射到python中的数字

时间:2016-05-19 00:33:46

标签: python mapping cluster-analysis similarity

我熟悉k-means来聚类数据点,但不熟悉文本..所以我有cvs格式的一列单词(有些行只有一个单词,有些有更多等),我想要聚类那些具有相似词或更多词的词,然后将这些簇映射到数字作为索引,那些索引号需要作为第二列添加。我知道在python中有scipy packahes和word2vec,但这是我第一次处理聚类文本..有关如何做到这一点的任何想法?任何代码示例将不胜感激

编辑:我想要的不是意义上的相似单词,我希望类似于确切的文字,例如:我们在不同的三行中有三个单词:心脏病发作,心脏衰竭,心碎...例如。我希望这些行在一个集群中,因为它们有共同的单词"心......顺便说一下,所有的行都以某种方式相互连接,所以我真正想要的是聚集确切的单词

from csv import DictReader
import sets



### converting my cvs file into list!!
with open("export.csv") as f:
   my_list = [row["BASE_NAME"] for row in DictReader(f)]


#print(my_list)  
## having every word in the cvs file
Set = list()   
for item in my_list:

      MySet = list(set(item.split(' ')))
      Set.append(MySet)

#print(Set)
cleanlist = []
[cleanlist.append(x) for x in Set if x not in cleanlist]
print(cleanlist[1])
#print(cleanlist)

###my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
#for item in my_list:
for i in xrange(len(cleanlist)):
      # matching = [s for s in my_list if cleanlist[i] in s]
   # matching =  [x for x in my_list if cleanlist[i] in x]
    matching = any( cleanlist[[i]] in item for item in my_list)

print(matching)

my_list示例为['Carbon Monoxide (Blood)', 'Carbon Monoxide Poisoning', 'Carbonic anhydrase inhibitor administered']

清洁清单样本为[['Antibody', 'Cardiolipin'], ['Cardiomegaly'], ['Cardiomyopathy'], ['Cardiopulmonary', 'Resuscitation', '(CPR)'], ['Diet', 'Cardiovascular'], ['Disease', 'Cardiovascular']]

已解决[现在我遇到问题,我的清单不包含每个索引的一个项目,这使得比较难以匹配,如何解决?]

????另外,我想为每次比较创建一个列表,所以对于每个清理列表的比较,我想创建一个列表,它们之间会有类似的单词,,,任何帮助那请?

3 个答案:

答案 0 :(得分:0)

我是机器学习的新手,但也许我可以给你一些建议。 我们假设我们有一行:

MySet = set(rowText.split(' '))

然后拆分这个单词并把它放在一个集合中:

MySet.add(newRowText.split(' '))

现在我们可以在这个集合中添加更多行,最后我们得到了一个包括所有单词的大集。

{{1}}

现在,我们应该删除一些不那么重要的词,如“a”,“an”,“is”,“are”等。

将订单转换回带有订单的列表,检查列表的长度。现在我们可以创建一个N维空间,例如,总列表是[“Mary”,“has”,“lamb”,“happy”]。这行是“玛丽有一只小羊羔”,所以我们可以将句子转换为[1,1,1,0]。

现在你可以立即进行群集了。对?

如果您发现“玛丽”非常重要,您可以调整玛丽的重量,如[2,1,1,0]。

你可以从贝叶斯作为我的观点参考的进动方式。

答案 1 :(得分:0)

群集文本很难,而且大多数方法效果都不好。对单个单词进行聚类基本上需要很多的背景知识。

如果您的文字较长,则可以通过他们共同的单词来衡量相似度。

但是对于单个单词,这种方法不起作用。

考虑:

  • 苹果
  • 香蕉
  • 豌豆

对于一个了解很多的人来说,苹果和梨应该是最相似的两个。对于只有3到6个字节的字符串数据的计算机,梨和豌豆是最相似的单词。

你看:语言很多关于背景知识和联想。计算机无法将“苹果”和“梨”与“生长在树上的果实相关联,通常是绿色的外部和白色的内部,中间的黑色种子和顶部的茎,通常大约是棕榈的大小”不能识别这些共同点,因此无法将它们聚类。

答案 2 :(得分:0)

对于群集,您需要某种距离测量。我建议使用汉明距离(见https://en.wikipedia.org/wiki/Hamming_distance)。我认为用它来测量两个单词之间的相似性是很常见的。

编辑:

对于你的例子,这意味着

心脏病发作 心力衰竭=> dist 7

心脏病发作 心碎=> dist 6

心力衰竭 心碎=> dist 7

心碎了 香蕉=> dist 12