【问题标题】:clustering similar words and then mapping clusters into numbers in python聚类相似的单词,然后将聚类映射到python中的数字
【发布时间】:2016-05-20 04:48:37
【问题描述】:

我熟悉 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']

cleanlist 示例为[['Antibody', 'Cardiolipin'], ['Cardiomegaly'], ['Cardiomyopathy'], ['Cardiopulmonary', 'Resuscitation', '(CPR)'], ['Diet', 'Cardiovascular'], ['Disease', 'Cardiovascular']]

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

????另外,我想为每次比较创建一个列表,所以对于干净列表的每次比较,我想创建一个列表,它们之间有相似的单词,,,任何帮助请问??

【问题讨论】:

    标签: python mapping cluster-analysis similarity


    【解决方案1】:

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

    rowText = "mary have a little lamb"
    

    然后将单词拆分并放入一个集合中:

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

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

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

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

    将集合转换回按顺序排列的列表,检查列表的长度。现在我们可以创建一个N维空间,例如,总List是["Mary", "has", "lamb", "happy"]。该行是“Mary has a little lamb”,因此我们可以将句子转换为 [1, 1, 1, 0]。

    现在您可以进行集群了。正确的?

    如果发现“Mary”很重要,可以调整 Mary 的权重,如 [2,1,1,0]。

    我认为你可以参考贝叶斯的进动方式。

    【讨论】:

    • 我想要的不是意思上相似的词,我想要的是与确切文本相似的词,例如:我们在不同的三行中有三个词:心脏病发作,心力衰竭,心碎..例如..我希望这些行在一个集群中,因为它们有共同的词“心”
    【解决方案2】:

    聚类文本很难,而且大多数方法都不能很好地工作。对单个词进行聚类本质上需要大量背景知识。

    如果你有更长的文本,你可以通过它们的共同词来衡量相似度。

    但是对于单个单词,这种方法是行不通的。

    考虑:

    • 苹果
    • 香蕉
    • 橙色
    • 豌豆

    对于一个知识渊博的人来说,苹果和梨应该是最相似的两个。对于只有这 3 到 6 个字节字符串数据的计算机来说,pear 和 pea 是最相似的词。

    你看:语言在很大程度上是关于背景知识和联想的。一台计算机不能将“苹果”和“梨”与“长在树上的果实,通常外面是绿色的,里面是白色的,中间是黑色的种子,顶部有一根茎,通常大约有手掌那么大”联系在一起的计算机。 无法识别它们的共同点,因此无法对它们进行聚类。

    【讨论】:

    • 我明白了,但是我想要的不是意思上相似的词,我想要的是与确切的文字相似的词,例如:我们在不同的三行中有三个词:心脏病发作,心力衰竭,心碎..例如..我希望这些行在一个集群中,因为它们有共同的词“心”。
    • 那并不是真正的集群问题。更多GROUP BY。只需建立一个字典,单词到包含单词的行。然后看看那些超过一排的。
    • 你能解释一下吗?
    【解决方案3】:

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

    编辑:

    对于您的示例,这意味着

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

    心脏病发作 心碎 => dist 6

    心力衰竭 心碎 => dist 7

    心碎了 香蕉 => 12 区

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2019-06-07
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 2018-01-07
      • 2015-04-05
      • 2015-05-29
      • 2017-06-16
      相关资源
      最近更新 更多