熊猫:单词的矩阵相关

时间:2014-09-15 08:42:18

标签: python pandas data-analysis

我是熊猫和蟒蛇的新手。我想为我的数据集找到常用词。例如,我有公司列表[“Microsoft.com”,“微软”,“微软com”,“苹果”...]等我有大约1M的这类公司列表,我想计算它们之间的相关性,以找到与Microsoft.com,Microsoft,Microsoft等词语的相关性有共同的话语。

这就是我所做的,但速度很慢:

import hashlib
companies = pd.read_csv('/tmp/companies.csv', error_bad_lines=False)
unique_companies = companies.groupby(['company'])['company'].unique()
df = DataFrame()

for company in unique_companies:
   df[hashlib.md5(company).hexdigest()] = [{'name': company[0], 'code': [ord(c) for c in company[0]]}]

rows = df.unstack()
for company in rows:
   series1 = Series(company['code'])
   for word in rows:
      series2 = Series(word['code'])
      if series1.corr(series2) > 0.8:
        company['match'] = [word['name']]

有人可以指导我如何找到单词的矩阵相关性吗?

1 个答案:

答案 0 :(得分:1)

我认为没有一个可以用于字符串的corr函数 - 只有数字。

如果你能以某种方式将你的单词压缩成有意义的数字值,保留" closeness"一个对另一个,你可能然后能够" corr"他们,但其他选项可用。

汉明距离是一种(基本)方法,但计算Levenshtein差异稍微好一些:http://en.wikipedia.org/wiki/Levenshtein_distance

这很棘手,但尝试这种方法的一种方法是构建一个m×n个单元格的矩阵。其中m是第一个wordlist中唯一字的数量,n是secornd wordlist中唯一字的数量 - 然后计算行/列标识符之间的Hamming或Levenshtein距离。

有python模块为你打包远程算法 - 例如https://pypi.python.org/pypi/python-Levenshtein/ 或者你可以写自己的,我认为打包的可能会更快,因为他们是C' ified。

因此,假设Levenshtein模块(我不知道,因为没有使用它)提供了一个生成数字分数的函数getLev (word1, word2),您应该能够从两个中提取内容来自来源1和2的单词表。如果您确保您的输入已经过滤了唯一性,并且可能按字母顺序排序,那也会有所帮助。

将它们输入矩阵生成函数。

在这里,我已经将numpy导入为np并使用该模块进行速度

def genLevenshteinMatrix(wordlist1, wordlist2):
    x = len(wordlist1)
    y = len(wordlist1)
    l_matrix = np.zeros(( x, y))
    for i in range( 0 , x ):
        x_word = wordlist1[i]
        for j in range ( 0 , y ):
            y_word = wordlist[j]
            l_matrix[i][j] = getLev ( x_word, y_word )

这样的东西应该允许你生成一个矩阵,用于存储哪些词最像其他词的度量。

创建完成后,您可以使用以下函数查询它:

def interrogate_Levenshtein_matrix (ndarray_x, wordlist1, wordlist2, float_threshold):
    l = []
    x = len(ndarray_x) 
    y = len(ndarray_x[0])
    for i in range(0 , x ):
        for j in range(0 , y ):
            if ndarray_x[i][j] >= float_threshold:
                l.append ([(wordlist1[i],wordlist2[j]),ndarray_x[i][j]])
    return l

这将输出一个"关闭" (即具有较低的距离),如之前使用的Levenshtein函数所测量的,作为列表,包含两个相似单词的列表。

你可能需要以某种方式减少它,因为我认为你会两次得到所有相似的组合,即[' word',' work']作为一个回报价值,[' work',#39; word']。

在开发代码时,您可以交换不同的相关函数并尝试不同的阈值。