我是熊猫和蟒蛇的新手。我想为我的数据集找到常用词。例如,我有公司列表"Microsoft.com",“微软”,“微软公司”,“苹果”…我有大约100万个这样的公司的名单,我想计算他们之间的相关性,以找到单词的相关性,例如Microsoft.com,微软,微软com有常见的单词。
这就是我所做的,但它非常慢:
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']]有没有人可以教我如何找到单词的矩阵相关性?
发布于 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,并使用该模块来提高速度
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','word’作为另一个返回值。
在开发代码时,您可以交换不同的相关函数,并尝试不同的阈值。
https://stackoverflow.com/questions/25843966
复制相似问题