首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas:单词的矩阵关联

Pandas:单词的矩阵关联
EN

Stack Overflow用户
提问于 2014-09-15 16:42:18
回答 1查看 1.1K关注 0票数 0

我是熊猫和蟒蛇的新手。我想为我的数据集找到常用词。例如,我有公司列表"Microsoft.com",“微软”,“微软公司”,“苹果”…我有大约100万个这样的公司的名单,我想计算他们之间的相关性,以找到单词的相关性,例如Microsoft.com,微软,微软com有常见的单词。

这就是我所做的,但它非常慢:

代码语言:javascript
复制
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']]

有没有人可以教我如何找到单词的矩阵相关性?

EN

回答 1

Stack Overflow用户

发布于 2014-10-30 21:18:39

我不认为有一个corr函数可以处理纯字符串的数字。

如果你能以某种方式将你的单词压缩成有意义的数值,从而保持一个单词与另一个单词之间的“亲密性”,那么你就可以对它们进行"corr“,但也有其他的选择。

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

这很棘手,但尝试的一种方法是建立一个由m×n个单元组成的矩阵。其中m是第一个单词列表中唯一单词的数量,n是secornd单词列表中唯一单词的数量-然后计算行/列标识符之间的汉明距离或Levenshtein距离。

有一些python模块可以为你打包距离算法--例如https://pypi.python.org/pypi/python-Levenshtein/,或者你可以自己编写,我认为打包后的模块可能会更快,因为它们被C++了。

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

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

在这里,我将numpy导入为np,并使用该模块来提高速度

代码语言:javascript
复制
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 )

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

一旦创建了它,您就可以使用如下函数对其进行查询:

代码语言:javascript
复制
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','word’作为另一个返回值。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25843966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档