Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用levenahtein将大文件群集到3组_Python_File_Machine Learning_Cluster Computing_K Means - Fatal编程技术网

Python 使用levenahtein将大文件群集到3组

Python 使用levenahtein将大文件群集到3组,python,file,machine-learning,cluster-computing,k-means,Python,File,Machine Learning,Cluster Computing,K Means,嗨,我有一个小文件和一个大文件, 这里的代码甚至不适用于大文件,只适用于小文件,因此如何读取大文件并对其执行操作?当我阅读并尝试在一个循环中进行集群时,它不起作用,因为每次迭代都是在线的。 下面是小文件的问题: 行的文件,我需要将它们分为3组。 我尝试过亲和传播,但它没有得到组大小参数,它给了我4个组,而第4个组只有一个词与另一个组非常接近: 0 - *Bras5emax Estates, L.T.D. :* Bras5emax Estates, L.T.D. 1 - *BOZEMAN E

嗨,我有一个小文件和一个大文件, 这里的代码甚至不适用于大文件,只适用于小文件,因此如何读取大文件并对其执行操作?当我阅读并尝试在一个循环中进行集群时,它不起作用,因为每次迭代都是在线的。 下面是小文件的问题: 行的文件,我需要将它们分为3组。 我尝试过亲和传播,但它没有得到组大小参数,它给了我4个组,而第4个组只有一个词与另一个组非常接近:

0
 - *Bras5emax Estates, L.T.D.
:* Bras5emax Estates, L.T.D.

1
 - *BOZEMAN Enterprises
:* BBAZEMAX ESTATES, LTD
, BOZEMAN Ent.
, BOZEMAN Enterprises
, BOZERMAN ENTERPRISES
, BRAZEMAX ESTATYS, LTD
, Bozeman Enterprises

2
 - *PC Adelman
:* John Smith
, Michele LTD
, Nadelman, Jr
, PC Adelman

3
 - *Gramkai, Inc.
:* Gramkai Books
, Gramkai, Inc.
, Gramkat Estates, Inc., Gramkat, Inc.
然后我尝试了K-MEANS,但结果是:

0
 - *Gramkai Books
, Gramkai, Inc.
, Gramkat Estates, Inc., Gramkat, Inc.
:*
1
 - *BBAZEMAX ESTATES, LTD
, BOZEMAN Enterprises
, BOZERMAN ENTERPRISES
, BRAZEMAX ESTATYS, LTD
, Bozeman Enterprises
, Bras5emax Estates, L.T.D.
:*
2
 - *BOZEMAN Ent.
, John Smith
, Michele LTD
, Nadelman, Jr
, PC Adelman
:*
正如你所看到的,博兹曼·恩特。属于第2组,而不是第1组

我的问题是:有没有办法做得更好?K-MEANS中是否有集群中心

守则:

import numpy as np
import sklearn.cluster
import distance

f = open("names.txt", "r")
words = f.readlines()
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])
affprop = sklearn.cluster.KMeans(n_clusters=3)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    print(cluster_id)
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:*" % ( cluster_str))

可以通过几种方式改进给定文本名称(企业)的聚类

  • 介绍一些文本清理和领域知识,例如删除圆点、常见企业停止字和降低字符:
  • 使用距离的“标准化”版本。levenshtein可以有意义地比较距离,例如:
  • 尝试另一种距离测量方法:
    sorensen
    jaccard
    ,它们已经标准化了
  • 下面是完整的代码示例:

    words = \
    ["Gramkai Books",
    "Gramkai, Inc.",
    "Gramkat Estates, Inc.",
    "Gramkat, Inc.",
    "BBAZEMAX ESTATES, LTD",
    "BOZEMAN Enterprises",
    "BOZERMAN ENTERPRISES",
    "BRAZEMAX ESTATYS, LTD",
    "Bozeman Enterprises",
    "Bras5emax Estates, L.T.D.",
    "BOZEMAN Ent.",
    "John Smith",
    "Michele LTD",
    "Nadelman, Jr",
    "PC Adelman"]
    
    import re
    import sklearn
    from sklearn import cluster
    words = [re.sub(r"(,|\.|ltd|l\.t\.d|inc|estates|enterprises|ent|estatys)","", w.lower()).strip() for w in words]
    words = np.asarray(words) #So that indexing with a list will work
    lev_similarity = -1*np.array([[distance.nlevenshtein(w1,w2,method = 1) for w1 in words] for w2 in words])
    affprop = sklearn.cluster.KMeans(n_clusters=3)
    affprop.fit(lev_similarity)
    for cluster_id in np.unique(affprop.labels_):
        print(cluster_id)
        cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
        cluster_str = ", ".join(cluster)
        print(" - *%s:*" % ( cluster_str))
    
    结果:

    0
     - *john smith, michele, nadelman jr, pc adelman:*
    1
     - *bbazemax, bozeman, bozerman, bras5emax, brazemax:*
    2
     - *gramkai, gramkai books, gramkat:*
    

    最后,您可能需要将更改的名称与原始名称连接起来。

    可以通过几种方式改进给定文本名称(企业)的聚类

  • 介绍一些文本清理和领域知识,例如删除圆点、常见企业停止字和降低字符:
  • 使用距离的“标准化”版本。levenshtein可以有意义地比较距离,例如:
  • 尝试另一种距离测量方法:
    sorensen
    jaccard
    ,它们已经标准化了
  • 下面是完整的代码示例:

    words = \
    ["Gramkai Books",
    "Gramkai, Inc.",
    "Gramkat Estates, Inc.",
    "Gramkat, Inc.",
    "BBAZEMAX ESTATES, LTD",
    "BOZEMAN Enterprises",
    "BOZERMAN ENTERPRISES",
    "BRAZEMAX ESTATYS, LTD",
    "Bozeman Enterprises",
    "Bras5emax Estates, L.T.D.",
    "BOZEMAN Ent.",
    "John Smith",
    "Michele LTD",
    "Nadelman, Jr",
    "PC Adelman"]
    
    import re
    import sklearn
    from sklearn import cluster
    words = [re.sub(r"(,|\.|ltd|l\.t\.d|inc|estates|enterprises|ent|estatys)","", w.lower()).strip() for w in words]
    words = np.asarray(words) #So that indexing with a list will work
    lev_similarity = -1*np.array([[distance.nlevenshtein(w1,w2,method = 1) for w1 in words] for w2 in words])
    affprop = sklearn.cluster.KMeans(n_clusters=3)
    affprop.fit(lev_similarity)
    for cluster_id in np.unique(affprop.labels_):
        print(cluster_id)
        cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
        cluster_str = ", ".join(cluster)
        print(" - *%s:*" % ( cluster_str))
    
    结果:

    0
     - *john smith, michele, nadelman jr, pc adelman:*
    1
     - *bbazemax, bozeman, bozerman, bras5emax, brazemax:*
    2
     - *gramkai, gramkai books, gramkat:*
    
    最后,您可能需要将更改的名称与原始名称连接起来